这几天一直在找各种CrackMe来玩,觉得这个CrackMe很有意思,为啥?因为本人初学,一直没破解过有经典算法的CrackMe,这次正好碰到一个用MD5加密的,于是下定决心好好研究一下,大牛无视吧。
这个CrackMe有一个壳,我也不知道具体是什么壳,但是很容易脱掉,用模拟跟踪法,几秒钟到达OEP,然后就直接进入主题了。
首先,下GetWindowTextA断点,来到这里。
00031143 6A 64 PUSH 64
00031145 68 26400300 PUSH 34026 ; ASCII "liuying"
0003114A 6A 00 PUSH 0
0003114C FF75 08 PUSH DWORD PTR SS:[EBP+8]
0003114F E8 2B200000 CALL 0003317F ; JMP 到 USER32.GetDlgItemTextA
00031154 83F8 04 CMP EAX,4
00031157 0F86 11010000 JBE 0003126E ; 这里可以看出,输入的name长度必须大于4,不然就跳到退出了
0003115D A3 EE400300 MOV DWORD PTR DS:[340EE],EAX
00031162 6A 64 PUSH 64
00031164 68 8A400300 PUSH 3408A
00031169 6A 01 PUSH 1
0003116B FF75 08 PUSH DWORD PTR SS:[EBP+8]
0003116E E8 0C200000 CALL 0003317F ; JMP 到 USER32.GetDlgItemTextA
00031173 85C0 TEST EAX,EAX
00031175 0F84 F3000000 JE 0003126E
0003117B FF35 EE400300 PUSH DWORD PTR DS:[340EE]
00031181 68 26400300 PUSH 34026 ; name放在这里
00031186 E8 EE000000 CALL 00031279 ; 这里是MD5算法的关键地方
0003118B 8BF0 MOV ESI,EAX
0003118D BF 06400300 MOV EDI,34006
00031192 B9 10000000 MOV ECX,10
00031197 F3:A4 REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>
00031199 83C4 08 ADD ESP,8
0003119C 33C0 XOR EAX,EAX
0003119E B9 8A400300 MOV ECX,3408A
000311A3 8841 08 MOV BYTE PTR DS:[ECX+8],AL
000311A6 8861 11 MOV BYTE PTR DS:[ECX+11],AH
000311A9 8841 1A MOV BYTE PTR DS:[ECX+1A],AL
000311AC 51 PUSH ECX
000311AD E8 720F0000 CALL 00032124 ; 将key的值分三组放在三个变量中
000311B2 A3 F2400300 MOV DWORD PTR DS:[340F2],EAX
000311B7 BE 93400300 MOV ESI,34093
000311BC 56 PUSH ESI
000311BD E8 620F0000 CALL 00032124 ; 将key的值分三组放在三个变量中
000311C2 C1C0 07 ROL EAX,7 ;这里将注册码循环左移了7位,所以我们要把下面得到的注册码先右移7位。
000311C5 A3 F6400300 MOV DWORD PTR DS:[340F6],EAX
000311CA BE 9C400300 MOV ESI,3409C
000311CF 56 PUSH ESI
000311D0 E8 4F0F0000 CALL 00032124 ; 将key的值分三组放在三个变量中
000311D5 C1C8 09 ROR EAX,9 ; 这里将注册码循环左移了9位,所以我们要把下面得到的注册码先右移9位。
000311D8 A3 FA400300 MOV DWORD PTR DS:[340FA],EAX
000311DD F8 CLC
000311DE 1BC9 SBB ECX,ECX
000311E0 BE 06400300 MOV ESI,34006
000311E5 BF 6D210300 MOV EDI,3216D
000311EA 0FB606 MOVZX EAX,BYTE PTR DS:[ESI] ; 以MD5的值作为指针,取表中的数据
000311ED 8B1C38 MOV EBX,DWORD PTR DS:[EAX+EDI] ; 取表中的第一个值放到ebx中
000311F0 0FB646 03 MOVZX EAX,BYTE PTR DS:[ESI+3]
000311F4 8B1438 MOV EDX,DWORD PTR DS:[EAX+EDI] ; 取表中的第二个值放到edx中
000311F7 33DA XOR EBX,EDX ; 取出两个数进行异或
000311F9 A1 F2400300 MOV EAX,DWORD PTR DS:[340F2]
000311FE 33C3 XOR EAX,EBX ; 再与eax,即注册码的前一部分进行异或
00031200 03C8 ADD ECX,EAX ; 将结果进行累加,放在ecx中
00031202 0FB646 04 MOVZX EAX,BYTE PTR DS:[ESI+4]
00031206 8B1C38 MOV EBX,DWORD PTR DS:[EAX+EDI] ; 取表中的第三个值放到ebx中
00031209 0FB646 08 MOVZX EAX,BYTE PTR DS:[ESI+8]
0003120D 8B1438 MOV EDX,DWORD PTR DS:[EAX+EDI] ; 取表中的第四个值放到edx中
00031210 33DA XOR EBX,EDX
00031212 A1 F6400300 MOV EAX,DWORD PTR DS:[340F6]
00031217 33C3 XOR EAX,EBX ; 与注册码中间部分进行异或
00031219 03C8 ADD ECX,EAX ; 将结果进行累加,放在ecx中
0003121B 0FB646 09 MOVZX EAX,BYTE PTR DS:[ESI+9]
0003121F 8B1C38 MOV EBX,DWORD PTR DS:[EAX+EDI] ; 取表中的第五个值放到ebx中
00031222 0FB646 0A MOVZX EAX,BYTE PTR DS:[ESI+A]
00031226 8B1438 MOV EDX,DWORD PTR DS:[EAX+EDI] ; 取表中的第六个值放到edx中
00031229 33DA XOR EBX,EDX
0003122B A1 FA400300 MOV EAX,DWORD PTR DS:[340FA]
00031230 33C3 XOR EAX,EBX
00031232 03C8 ADD ECX,EAX ; 将结果进行累加,放在ecx中
00031234 8BC1 MOV EAX,ECX
00031236 B9 20000000 MOV ECX,20
0003123B F8 CLC
0003123C 72 30 JB SHORT 0003126E ; 这个是关键跳,如果跳了就注册失败
0003123E D1E8 SHR EAX,1
00031240 ^ E2 FA LOOPD SHORT 0003123C
00031242 6A 40 PUSH 40
00031244 E8 07000000 CALL 00031250
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)