渗透TEA加密算法
0040129E TEST EAX,EAX
004012A0 JE CrackMe_.004013F7
004012A6 MOV AL,BYTE PTR DS:[ESI+1]
004012A9 INC ESI
004012AA TEST AL,AL
; 密码要在0-9 a-f A-F之间
004012AC JNZ SHORT CrackMe_.00401272
004012AE LEA EDI,DWORD PTR SS:[ESP+2C]
004012B2 OR ECX,FFFFFFFF
004012B5 XOR EAX,EAX
004012B7 REPNE SCAS BYTE PTR ES:[EDI]
004012B9 NOT ECX
004012BB DEC ECX
; 密码长度要等于16
004012BC CMP ECX,10
这一段是验证密码的输入规则,密码必须为0-9 a-f A-F中的任意一个字符,并且密码长度要等于16。紧接着下面是把输入的密码字符型转成同字母的16进制。我就不贴代码了。看下面主要的地方。
0040130A LEA EAX,DWORD PTR SS:[ESP+10]
0040130E LEA ECX,DWORD PTR SS:[ESP+2C]
00401312 PUSH EAX
;这个参数值为1A2B3C4D5E6FABCD1A2BAC4D5E6FABCD,暂时不知道什么意思。 00401313 LEA EDX,DWORD PTR SS:[ESP+24]
00401317 PUSH ECX
;这个参数为1234567890ABCDEF,也就是我们输入的密码。
00401318 PUSH EDX
;这个参数全为0,应该是经过下面那个CALL后装返回值的。
00401319 CALL CrackMe_.00401410
来到这里后,看到有三个参数入栈,上面我加了说明。等走到00401339时先下个断,再dd edx,F8一下过了这个CALL看堆栈中EDX的返回值变成了D598F72A2C8CA076。看来这个极有可能就是TEA算法的地方。
我们先来看看TEA加密解密算法代码吧。我找了半天,现在分享出来:
void TEA_encipher(DWORD *data, DWORD *Key)
{
DWORD y=data[0];
DWORD z=data[1];
DWORD delta=0x9e3779b9;
DWORD sum=0;
DWORD a=Key[0];
DWORD b=Key[1];
DWORD c=Key[2];
DWORD d=Key[3];
for(int i=0;i<32;i++)
{