identify包的构造过程:
去除start包处的断点,重新开始程序,断在identify包的构造处
identify包的构造:
CPU Disasm
Address Hex dump Command Comments
00409144 |. 66:898424 820 MOV WORD PTR SS:[ESP+82],AX ; 本机的MAC地址
0040914C |. C68424 840000 MOV BYTE PTR SS:[ESP+84],88
00409154 |. C68424 850000 MOV BYTE PTR SS:[ESP+85],8E
0040915C |. C68424 870000 MOV BYTE PTR SS:[ESP+87],0
00409164 |. C68424 860000 MOV BYTE PTR SS:[ESP+86],1
0040916C |. C68424 8A0000 MOV BYTE PTR SS:[ESP+8A],2
00409174 |. E8 7781FFFF CALL 004012F0 ; [mycrack.004012F0
00409179 |. 888424 8B0000 MOV BYTE PTR SS:[ESP+8B],AL ; 填入ID
00409180 |. C68424 8E0000 MOV BYTE PTR SS:[ESP+8E],1
00409188 |. E8 538BFFFF CALL 00401CE0 ; [mycrack.00401CE0, 获取账号
CPU Disasm
Address Hex dump Command Comments
004091B3 |. F3:A5 REP MOVS DWORD PTR ES:[EDI],DWORD ; 填入账号
004091B5 |. 8BCA MOV ECX,EDX
004091B7 |. 83E1 03 AND ECX,00000003
004091BA |. 83C5 05 ADD EBP,5
004091BD |. F3:A4 REP MOVS BYTE PTR ES:[EDI],BYTE PT
004091BF |. 55 PUSH EBP
004091C0 |. 8D73 17 LEA ESI,[EBX+17]
004091C3 |. E8 8A3E0000 CALL <JMP.&ws2_32.htons> ; Jump to ws2_32.ntohs
004091C8 |. 55 PUSH EBP
004091C9 |. 66:898424 8C0 MOV WORD PTR SS:[ESP+8C],AX ; 填入LENGTH
004091D1 |. E8 7C3E0000 CALL <JMP.&ws2_32.htons> ; Jump to ws2_32.ntohs
004091D6 |. 66:898424 8C0 MOV WORD PTR SS:[ESP+8C],AX ; 填入LENGTH
004091DE |. 0FB68424 8B00 MOVZX EAX,BYTE PTR SS:[ESP+8B]
……………………….
到这里就开始填写剩下的trailer了,整个过程是这样的
先在409214处调用CALL 00408F70,获得第一部分密钥(就这么叫先),总共4个字节,写入到构造的数据包0x2e处,再把常数00ea00ea(网络格式)填入到后面,然后把服务器发送过来的第一个包的0x23处开始的4个字节写入一个长度为0x38的数组,数字前40为的内容是字符串0到9,然后再把这个数组进行MD5加密,结果与一开始得到的那8个字节进行异或,异或得到的结果就是最后填入包中的数据。
00409211 |. 6A 00 PUSH 0
00409213 |. 50 PUSH EAX
00409214 |. E8 57FDFFFF CALL 00408F70 ;关键CALL,跟入
00409219 |. 03F0 ADD ESI,EAX
0040921B |. 8D8C24 940000 LEA ECX,[ESP+94]
00409222 |. 56 PUSH ESI
00409223 |. 51 PUSH ECX
00409224 |. E8 E72F0000 CALL 0040C210 ;发送包
跟入409214处的CALL后,单步步过前面一些记录日志的代码后来到这里:
00408FBF |. 83C4 0C ADD ESP,0C
00408FC2 |. E8 C9F7FFFF CALL 00408790 ;获取密匙关键CALL,跟入
00408FC7 |. 8BF8 MOV EDI,EAX
00408FC9 |. A1 64B64100 MOV EAX,DWORD PTR DS:[41B664]
00408FCE |. 33DB XOR EBX,EBX
00408FD0 |. 3BC3 CMP EAX,EBX
00408FD2 |. 75 06 JNE SHORT 00408FDA
00408FD4 |. 893D 64B64100 MOV DWORD PTR DS:[41B664],EDI
00408FDA |> E8 91F7FFFF CALL 00408770
00408FDF |. 57 PUSH EDI
00408FE0 |. E8 67400000 CALL <JMP.&ws2_32.htonl> ; Jump to ws2_32.htonl
00408FE5 |. 8946 08 MOV DWORD PTR DS:[ESI+8],EAX ; 密匙1填入数据尾部
00408FE8 |. E8 13F7FFFF CALL 00408700 ; [mycrack.00408700
00408FED |. E8 7EF7FFFF CALL 00408770
00408FF2 |. E8 09F7FFFF CALL 00408700 ; [mycrack.00408700
00408FF7 |. 68 EA00EA00 PUSH 0EA00EA ; 常数00ea00ea
00408FFC |. E8 4B400000 CALL <JMP.&ws2_32.htonl> ; Jump to ws2_32.htonl
00409001 |. 8946 0C MOV DWORD PTR DS:[ESI+0C],EAX
00409004 |. 33C0 XOR EAX,EAX
00409006 |. 885D CC MOV BYTE PTR SS:[EBP-34],BL
00409009 |. B9 1F000000 MOV ECX,1F
0040900E |. 8D7D CD LEA EDI,[EBP-33]
00409011 |. F3:AB REP STOS DWORD PTR ES:[EDI]
00409013 |. 66:AB STOS WORD PTR ES:[EDI]
00409015 |. AA STOS BYTE PTR ES:[EDI]
00409016 |. 33D2 XOR EDX,EDX ; 清0后面填入包中
00409018 |. 33C0 XOR EAX,EAX
…….……….
0040903D |. 8D49 00 LEA ECX,[ECX]
00409040 |> 8A88 F0984100 /MOV CL,BYTE PTR DS:[EAX+4198F0] ; ASCII "0123456789012345678901234567890123456789"
00409046 |. 884C05 CC |MOV BYTE PTR SS:[EAX+EBP-34],CL
0040904A |. 40 |INC EAX
0040904B |. 3ACB |CMP CL,BL
0040904D |.^ 75 F1 /JNE SHORT 00409040
0040904F |. B8 F0984100 MOV EAX,OFFSET mycrack.004198F0 ; ASCII "0123456789012345678901234567890123456789"
00409054 |. 8D50 01 LEA EDX,[EAX+1]
00409057 |> 8A08 /MOV CL,BYTE PTR DS:[EAX]
00409059 |. 40 |INC EAX
0040905A |. 3ACB |CMP CL,BL
0040905C |.^ 75 F9 /JNE SHORT 00409057
0040905E |. 2BC2 SUB EAX,EDX
00409060 |. 8BF8 MOV EDI,EAX
00409062 |. E8 3981FFFF CALL 004011A0 ; [mycrack.004011A0
00409067 |. 50 PUSH EAX
00409068 |. E8 DF3F0000 CALL <JMP.&ws2_32.htonl> ; Jump to ws2_32.htonl
0040906D |. 8B55 50 MOV EDX,DWORD PTR SS:[EBP+50]
00409070 |. 8D4C3D CC LEA ECX,[EDI+EBP-34]
00409074 |. 8901 MOV DWORD PTR DS:[ECX],EAX
00409076 |. 8B45 54 MOV EAX,DWORD PTR SS:[EBP+54] ; _第一个request返回包中0x23位的值填入这个包后4个字节
00409079 |. 8951 04 MOV DWORD PTR DS:[ECX+4],EDX
0040907C |. 8B55 58 MOV EDX,DWORD PTR SS:[EBP+58]
0040907F |. 8941 08 MOV DWORD PTR DS:[ECX+8],EAX
00409082 |. 8951 0C MOV DWORD PTR DS:[ECX+0C],EDX
00409085 |. E8 E6F6FFFF CALL 00408770
0040908A |. 83C7 10 ADD EDI,10
0040908D |. 57 PUSH EDI ; /Arg3
0040908E |. 8D45 CC LEA EAX,[EBP-34] ; |
00409091 |. 50 PUSH EAX ; |Arg2
00409092 |. 8D4D 60 LEA ECX,[EBP+60] ; |
00409095 |. 51 PUSH ECX ; |Arg1
00409096 |. E8 D5180000 CALL 0040A970 ; MD5加密构造的包
0040909B |. 8A4E 09 MOV CL,BYTE PTR DS:[ESI+9] ; 异或密匙和MD5加密值,结果写入respone包中
0040909E |. 8A45 61 MOV AL,BYTE PTR SS:[EBP+61]
004090A1 |. 8A5E 08 MOV BL,BYTE PTR DS:[ESI+8]
004090A4 |. 8A55 60 MOV DL,BYTE PTR SS:[EBP+60]
004090A7 |. 32C8 XOR CL,AL
004090A9 |. 8A46 0A MOV AL,BYTE PTR DS:[ESI+0A]
004090AC |. 884E 09 MOV BYTE PTR DS:[ESI+9],CL
004090AF |. 8A4D 62 MOV CL,BYTE PTR SS:[EBP+62]
004090B2 |. 32C1 XOR AL,CL
004090B4 |. 8A4E 0C MOV CL,BYTE PTR DS:[ESI+0C]
004090B7 |. 32DA XOR BL,DL
004090B9 |. 8A55 63 MOV DL,BYTE PTR SS:[EBP+63]
004090BC |. 8846 0A MOV BYTE PTR DS:[ESI+0A],AL
004090BF |. 8A45 64 MOV AL,BYTE PTR SS:[EBP+64]
004090C2 |. 32C8 XOR CL,AL
004090C4 |. 8A46 0D MOV AL,BYTE PTR DS:[ESI+0D]
004090C7 |. 885E 08 MOV BYTE PTR DS:[ESI+8],BL
004090CA |. 8A5E 0B MOV BL,BYTE PTR DS:[ESI+0B]
004090CD |. 884E 0C MOV BYTE PTR DS:[ESI+0C],CL
004090D0 |. 8A4D 65 MOV CL,BYTE PTR SS:[EBP+65]
004090D3 |. 32DA XOR BL,DL
004090D5 |. 8A55 66 MOV DL,BYTE PTR SS:[EBP+66]
004090D8 |. 32C1 XOR AL,CL
004090DA |. 8A4E 0F MOV CL,BYTE PTR DS:[ESI+0F]
004090DD |. 885E 0B MOV BYTE PTR DS:[ESI+0B],BL
004090E0 |. 8A5E 0E MOV BL,BYTE PTR DS:[ESI+0E]
004090E3 |. 8846 0D MOV BYTE PTR DS:[ESI+0D],AL
004090E6 |. 8A45 67 MOV AL,BYTE PTR SS:[EBP+67]
004090E9 |. 83C4 0C ADD ESP,0C
004090EC |. 32DA XOR BL,DL
004090EE |. 32C8 XOR CL,AL
004090F0 |. 884E 0F MOV BYTE PTR DS:[ESI+0F],CL
004090F3 |. 8B4D 7C MOV ECX,DWORD PTR SS:[EBP+7C]
004090F6 |. 885E 0E MOV BYTE PTR DS:[ESI+0E],BL
004090F9 |. 5F POP EDI
004090FA |. 894E 10 MOV DWORD PTR DS:[ESI+10],ECX
004090FD |. 5E POP ESI
004090FE |. B8 14000000 MOV EAX,14
00409103 |. 5B POP EBX
00409104 |. 83C5 70 ADD EBP,70
00409107 |. 8BE5 MOV ESP,EBP
00409109 |. 5D POP EBP
0040910A /. C3 RETN
跟入00408FC2处的 CALL 00408790,单步后可以发现程序通过ReadFile把宽带上网助手自身读入到内存中,在ReadFile后的代码处:
00408832 |> /8B4424 14 MOV EAX,DWORD PTR SS:[ESP+14]
00408836 |. 50 PUSH EAX ; /Arg2 => ARG.EBX
00408837 |. 56 PUSH ESI ; |Arg1
00408838 |. E8 F3FEFFFF CALL 00408730 ; /跟入这个CALL
0040883D |. 83C4 08 ADD ESP,8
跟入408838的CALL,来到这里
00408730 /$ 8B5424 08 MOV EDX,DWORD PTR SS:[ARG.2] ; mycrack.00408730(guessed Arg1,Arg2)
00408734 |. 8B4C24 04 MOV ECX,DWORD PTR SS:[ARG.1]
00408738 |. 83C8 FF OR EAX,FFFFFFFF
0040873B |. 85D2 TEST EDX,EDX
0040873D |. 74 21 JE SHORT 00408760
0040873F |. 56 PUSH ESI
00408740 |. 57 PUSH EDI
00408741 |> 0FB639 /MOVZX EDI,BYTE PTR DS:[ECX]
00408744 |. 8BF0 |MOV ESI,EAX
00408746 |. 81E6 FF000000 |AND ESI,000000FF
0040874C |. 33F7 |XOR ESI,EDI
0040874E |. 8B3CB5 889441 |MOV EDI,DWORD PTR DS:[ESI*4+419488]
00408755 |. C1E8 08 |SHR EAX,8
00408758 |. 33C7 |XOR EAX,EDI
0040875A |. 41 |INC ECX
0040875B |. 4A |DEC EDX
0040875C |.^ 75 E3 /JNE SHORT 00408741
0040875E |. 5F POP EDI
0040875F |. 5E POP ESI
00408760 |> F7D0 NOT EAX
00408762 /. C3 RETN
加密过程就是:
设*lp为文件指针,*hash为419488处的指针,length为文件长度,eax=0
Eax|=-1;
while(length!=0){
eax=(DWORD) ((eax&0xff)^(byte)*lp)*4+hash)^(eax>>8);
lp++;length--;
}
Result=~eax;
这里的result就是所得的结果,hash表附在后面。
现在一直返回,程序把密匙填入数据尾部后,再在00409096 CALL 0040A970 处用 MD5加密函数加密上面所提到的那个长度为0x38的数组,然后把结果(一个16个字节的数组的前8个字节)在0040909B后与上面的到的密钥(8字节)按字节进行异或运算,结果在写入包中,就得到了identify包
但是这里有点奇异的地方,既然那个密钥是通过程序的每个字节运算得到的,而上网宽带助手是经过脱壳的,内容和原来的肯定是不一样的,但是结果却是仍然可以顺利的通过认证(我们学校里是这样的……),难道是服务器根本就没有进行校验?我经过试验发现认证是通过trailer中的那个linkage字符串进行的,居然和前面的那8个加密字节无关,也就是说前面的过程全都是空架子,只要在trailer中填入linkage的即可,囧~~~