繼續160個新手CM系列,今天破的是KeyFile保護的一道題,以爲最坑的就是最後破解成功的提示框,竟然寫着「Now try the next crackme」。。。我這英文0級的覺得這道題還有後續。。就又搞了半天最後發現它的意思是你能夠去作其餘的題了。。。⊙﹏⊙‖∣app
言歸正傳,仍是先打開程序,結果發現什麼都沒有,什麼輸入框了啥的都沒有。。。emmm具體就像下圖同樣spa
好吧咱們直接打開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;關鍵,跟下去瞅瞅
下面就是比較文件中的內容了code
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這個值。blog
這道題剛開始分析還有點難度,可是分析完以爲也不是那麼難。。。emmmm畢竟稱爲新手CM ⊙﹏⊙‖∣內存