【文章标题】: 第一次的crack
【文章作者】: 剑斩残云
【软件名称】: crackme2.exe
【下载地址】: http://www.crackmes.de/users/mucki/crackme2/
【作者声明】: 今天论坛上看到的一个crackme,codepine发的,看到了就下载下来玩一玩。做完了才去看他的解法,貌似差不多,但是我还是经验很不足。第一次的帖子,发下纪念。
--------------------------------------------------------------------------------
【详细过程】
od载入后运行,输入用户名zjw023,序列号12345678,找到重要的代码区域,进行分析
004011BB 55 push ebp
004011BC 8BEC mov ebp,esp
004011BE 57 push edi
004011BF 56 push esi
004011C0 53 push ebx
004011C1 6A 32 push 32
004011C3 68 84624000 push crackme2.00406284 ; ASCII "zjw023"
004011C8 6A 01 push 1
004011CA FF75 08 push dword ptr ss:[ebp+8]
004011CD E8 16020000 call <jmp.&user32.GetDlgItemTextA>
004011D2 64:8B15 18000000 mov edx,dword ptr fs:[18]
004011D9 8B52 30 mov edx,dword ptr ds:[edx+30]
004011DC 0FB652 02 movzx edx,byte ptr ds:[edx+2]
004011E0 83F8 00 cmp eax,0
004011E3 7F 11 jg short crackme2.004011F6 ; 跳了
004011E5 68 D8604000 push crackme2.004060D8 ; ASCII "nameless"
004011EA 6A 01 push 1
004011EC FF75 08 push dword ptr ss:[ebp+8]
004011EF E8 0C020000 call <jmp.&user32.SetDlgItemTextA>
004011F4 ^ EB CB jmp short crackme2.004011C1
004011F6 8D35 84624000 lea esi,dword ptr ds:[406284]
004011FC 33C9 xor ecx,ecx ; ecx=0; ecx做sum
004011FE 0FBE06 movsx eax,byte ptr ds:[esi] ; eax= esi name[]第一位
00401201 8BD8 mov ebx,eax ; ebx=eax
00401203 2BF2 sub esi,edx ; esi-=ebx
00401205 C1E0 04 shl eax,4 ; eax=eax左移4位
00401208 C1EB 05 shr ebx,5 ; ebx右移5位
0040120B 33C3 xor eax,ebx ; eax异或ebx
0040120D 83C0 26 add eax,26 ; eax=eax+26
00401210 33C1 xor eax,ecx ; eax异或ecx
00401212 03C8 add ecx,eax ; ecx=ecx+eax
00401214 46 inc esi ; name[]指针指向下一位
00401215 803E 00 cmp byte ptr ds:[esi],0 ; 是否已经指向name[]完的下一位?
00401218 ^ 75 E4 jnz short crackme2.004011FE ; 没完继续循环
0040121A B8 EF0D0C00 mov eax,0C0DEF ; ---循环结束 eax=0C0DEF
0040121F 2BC1 sub eax,ecx ; eax-=ecx
00401221 0FAFC0 imul eax,eax ; eax=eax*eax;
00401224 50 push eax ; eax入栈
00401225 51 push ecx ; ecx入栈
00401226 68 E1604000 push crackme2.004060E1 ; ASCII "CM2-%lX-%lX"
0040122B 68 B6624000 push crackme2.004062B6 ; ASCII "CM2-C397-7926FE40"
00401230 E8 9B010000 call <jmp.&user32.wsprintfA> ; 上面格式为 "CM2-ecx-eax"
00401235 6A 4B push 4B
00401237 68 B1604000 push crackme2.004060B1 ; ASCII "12345678"
0040123C 6A 02 push 2
0040123E FF75 08 push dword ptr ss:[ebp+8]
00401241 E8 A2010000 call <jmp.&user32.GetDlgItemTextA>
00401246 68 B1604000 push crackme2.004060B1 ; ASCII "12345678"
0040124B 68 B6624000 push crackme2.004062B6 ; ASCII "CM2-C397-7926FE40"
00401250 E8 DB010000 call <jmp.&kernel32.lstrcmpA> ; 比较正确的话eax=0;
00401255 75 16 jnz short crackme2.0040126D
00401257 6A 00 push 0
00401259 68 00604000 push crackme2.00406000 ; ASCII "crackme2"
0040125E 68 3D604000 push crackme2.0040603D ; ASCII "Valid serial - now write a keygen!"
00401263 FF75 08 push dword ptr ss:[ebp+8]
00401266 E8 89010000 call <jmp.&user32.MessageBoxA>
0040126B EB 14 jmp short crackme2.00401281
0040126D 6A 10 push 10
0040126F 68 00604000 push crackme2.00406000 ; ASCII "crackme2"
00401274 68 60604000 push crackme2.00406060 ; ASCII "Wrong serial - try again!"
00401279 FF75 08 push dword ptr ss:[ebp+8]
0040127C E8 73010000 call <jmp.&user32.MessageBoxA>
00401281 5B pop ebx
00401282 5E pop esi
00401283 5F pop edi
00401284 C9 leave
00401285 C2 0400 retn 4
算法基本分析出来。运行一圈下来,发现0040124B这个代码区把计算出的序列号计算出来。
填入序列号,OK,表明分析的大方向还是没有错的。
这个比较简单,新手还是可以的。
不过...这题要求弄出注册机,不过注册机还不知道怎么弄,还要继续学习。
把附件带上。
crackme2.zip
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)