继续160个新手CM系列,今天破的是KeyFile保护的一道题,觉得最坑的就是最后破解成功的提示框,居然写着“Now try the next crackme”。。。我这英文0级的以为这道题还有后续。。就又搞了半天最后发现它的意思是你可以去做其他的题了。。。⊙﹏⊙‖∣
言归正传,还是先打开程序,结果发现什么都没有,什么输入框了啥的都没有。。。emmm具体就像下图一样
好吧我们直接打开OD调试。
00401000 >/$ 6A 00 push 0 ; /pModule = NULL 00401002 |. E8 7D040000 call <jmp.&KERNEL32.GetModuleHandleA> ; \GetModuleHandleA 00401007 |. A3 E9204000 mov dword ptr [4020E9], eax 0040100C |. C705 F9204000>mov dword ptr [4020F9], 0 00401016 |. 6A 00 push 0 ; /hTemplateFile = NULL 00401018 |. 68 80000000 push 80 ; |Attributes = NORMAL 0040101D 6A 03 push 3;OPEN_EXISTING 0040101F |. 6A 00 push 0 ; |pSecurity = NULL 00401021 |. 6A 03 push 3 ; |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE 00401023 |. 68 000000C0 push C0000000 ; |Access = GENERIC_READ|GENERIC_WRITE 00401028 |. 68 D7204000 push 004020D7 ; |FileName = "CRACKME3.KEY" 0040102D |. E8 76040000 call <jmp.&KERNEL32.CreateFileA> ; \CreateFileA 00401032 83F8 FF cmp eax, -1;创建失败,不能让他创建失败,所以自己建一个CRACKME3.KEY 00401035 75 0C jnz short 00401043 00401037 |> 68 0E214000 push 0040210E ; ASCII "CrackMe v3.0 " 0040103C |. E8 B4020000 call 004012F5 00401041 |. EB 6B jmp short 004010AE 00401043 |> A3 F5204000 mov dword ptr [4020F5], eax 00401048 |. B8 12000000 mov eax, 12 0040104D |. BB 08204000 mov ebx, 00402008 00401052 |. 6A 00 push 0 ; /pOverlapped = NULL 00401054 |. 68 A0214000 push 004021A0 ; |pBytesRead = Cruehead.004021A0 00401059 |. 50 push eax ; |BytesToRead => 12 (18.) 0040105A |. 53 push ebx ; |Buffer => Cruehead.00402008 0040105B |. FF35 F5204000 push dword ptr [4020F5] ; |hFile = NULL 00401061 |. E8 30040000 call <jmp.&KERNEL32.ReadFile> ; \ReadFile 00401066 833D A0214000>cmp dword ptr [4021A0], 12 ;比较读出的文件内容是不是18个字节 0040106D |.^ 75 C8 jnz short 00401037 0040106F |. 68 08204000 push 00402008 00401074 |. E8 98020000 call 00401311;关键,跟下去瞅瞅
下面就是比较文件中的内容了
00401311 /$ 33C9 xor ecx, ecx;清0 00401313 |. 33C0 xor eax, eax 00401315 |. 8B7424 04 mov esi, dword ptr [esp+4];文件读出来的内容 00401319 |. B3 41 mov bl, 41 0040131B |> 8A06 /mov al, byte ptr [esi] 0040131D |. 32C3 |xor al, bl;将文件中读出来的第一个字节与41h异或 0040131F |. 8806 |mov byte ptr [esi], al 00401321 |. 46 |inc esi 00401322 |. FEC3 |inc bl 00401324 |. 0105 F9204000 |add dword ptr [4020F9], eax 0040132A |. 3C 00 |cmp al, 0 0040132C |. 74 07 |je short 00401335;当文件第一个字节为41h时跳 0040132E |. FEC1 |inc cl 00401330 |. 80FB 4F |cmp bl, 4F 00401333 |.^ 75 E6 \jnz short 0040131B 00401335 |> 890D 49214000 mov dword ptr [402149], ecx 0040133B \. C3 retn
00401079 |. 8135 F9204000>xor dword ptr [4020F9], 12345678 00401083 |. 83C4 04 add esp, 4 00401086 |. 68 08204000 push 00402008 0040108B |. E8 AC020000 call 0040133C
0040133C /$ 8B7424 04 mov esi, dword ptr [esp+4] ; Cruehead.00402008 00401340 |. 83C6 0E add esi, 0E 00401343 |. 8B06 mov eax, dword ptr [esi] 00401345 \. C3 retn
00401090 |. 83C4 04 add esp, 4 00401093 |. 3B05 F9204000 cmp eax, dword ptr [4020F9];将12345678与文件中最后4个字节比较,注意字节在内存中的保存位置 00401099 |. 0F94C0 sete al;当相等时将al置为1,不相等置为0 0040109C |. 50 push eax 0040109D |. 84C0 test al, al 0040109F |.^ 74 96 je short 00401037;当al为1时不跳,跳就gg了
下面就是找窗口注册窗口的过程了,就不继续分析了,还有一点注意文件中最后四个字节用16进制编译器写入,因为你自己写txt的话写不了12这个值。
这道题刚开始分析还有点难度,但是分析完觉得也不是那么难。。。emmmm毕竟称为新手CM ⊙﹏⊙‖∣