[反彙編練習] 160個CrackMe之034

[反彙編練習] 160個CrackMe之034.

本系列文章的目的是從一個沒有任何經驗的新手的角度(其實就是我自己),一步步嘗試將160個CrackMe全部破解,如果可以,通過任何方式寫出一個類似於註冊機的東西。

其中,文章中按照如下邏輯編排(解決如下問題):

1、使用什麼環境和工具

2、程序分析

3、思路分析和破解流程

4、註冊機的探索

----------------------------------

提醒各位看客: 如果文章中的邏輯看不明白,那你一定是沒有親手操刀!OD中的跳轉提示很強大,只要你跟蹤了,不用怎麼看代碼就理解了!

----------------------------------

1、工具和環境:

WinXP SP3 + 52Pojie六週年紀念版OD + PEID + 彙編金手指。

160個CrackMe的打包文件。

下載地址: http://pan.baidu.com/s/1xUWOY 密碼: jbnq

注:

1、Win7系統對於模塊和程序開啓了隨機初始地址的功能,會給分析帶來很大的負擔,所以不建議使用Win7進行分析。

2、以上工具都是在52PoJie論壇下的原版程序,NOD32不報毒,個人承諾絕對不會進行任何和木馬病毒相關內容。

wps_clip_image-880

2、程序分析:

想要破解一個程序,必須先了解這個程序。所以,在破解過程中,對最初程序的分析很重要,他可以幫助我們理解作者的目的和意圖,特別是對於註冊碼的處理細節,從而方便我們反向跟蹤和推導。

和上一節一樣,打開CHM,選擇第34個Cruehead.3.exe,保存下來。運行程序,程序界面如下:

3

 

悲劇啊,啥也沒有!

PEID:MASM32 / TASM32 [覆蓋]

彙編寫的程序啊!哎!要麼很簡單,要麼就很坑啦!

 

3、思路分析和破解流程

1、打開OD,將exe拖到OD窗口中,等程序暫停後,不用理會(先不要運行,否則無法進行爆破)。

2、右鍵->中文搜索插件->智能搜索,找到提示成功字符串:

image

很容易找到提示成功的字符串:Good work cracker! 選中它,右鍵->Follow.

00401362  /$  8B0D 49214000 mov ecx,dword ptr ds:[0x402149]
00401368  |.  8B7424 04     mov esi,dword ptr ss:[esp+0x4]
0040136C  |.  8B7C24 08     mov edi,dword ptr ss:[esp+0x8]
00401370  |.  83C7 0C       add edi,0xC
00401373  |.  F3:A4         rep movs byte ptr es:[edi],byte ptr ds:[>
00401375  |.  66:C707 210D  mov word ptr ds:[edi],0xD21
0040137A  |.  83C7 02       add edi,0x2
0040137D  |.  8B7424 0C     mov esi,dword ptr ss:[esp+0xC]
00401381  |.  B9 1A000000   mov ecx,0x1A
00401386  |.  F3:A4         rep movs byte ptr es:[edi],byte ptr ds:[>
00401388  |.  6A 30         push 0x30                                ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
0040138A  |.  68 57214000   push 00402157                            ; |Good work cracker!
0040138F  |.  68 6A214000   push 0040216A                            ; |Cracked by:                 Now try the next crackme!
00401394  |.  FF35 04204000 push dword ptr ds:[0x402004]             ; |hOwner = NULL
0040139A  |.  E8 19000000   call <jmp.&USER32.MessageBoxA>           ; \MessageBoxA
0040139F  \.  C3            retn

這裏只進行了一個提示,我們在頭部下斷,跟蹤,發現這裏調用了這段代碼:

00401187  |.  58            pop eax                                  ;  // 將結果出棧,問題在於怎樣才能找到對應入棧的地方
00401188  |.  3C 01         cmp al,0x1                               ;  // 比較是否成功
0040118A      75 17         jnz short 004011A3                       ;  // 不成功則跳轉,想要爆破就要改這裏
0040118C  |.  68 86214000   push 00402186                            ;  ASCII "xt crackme!"
00401191  |.  68 6A214000   push 0040216A                            ;  ASCII "Cracked by: !\rNow try the next crackme!"
00401196  |.  68 08204000   push 00402008
0040119B  |.  E8 C2010000   call 00401362
004011A0  |.  83C4 0C       add esp,0xC

在0040118A地址處,如果跳轉則直接到失敗的地方了!所以,想要爆破,只需要將這個判斷跳轉修改爲Nop。
地址: 0040118A 選中 jnz short 004011A3,右鍵->Binary->Fill with NOPs。

F9,運行程序!

11

4、註冊機的探索

這個彙編代碼也不長,但是彙編的代碼邏輯性一般都很差,所以,我們還是從頭開始分析吧:

00401000 >/$  6A 00         push 0x0                                 ; /pModule = NULL
00401002  |.  E8 7D040000   call <jmp.&KERNEL32.GetModuleHandleA>    ; \GetModuleHandleA
00401007  |.  A3 E9204000   mov dword ptr ds:[0x4020E9],eax
0040100C  |.  C705 F9204000>mov dword ptr ds:[0x4020F9],0x0
00401016  |.  6A 00         push 0x0                                 ; /hTemplateFile = NULL
00401018  |.  68 80000000   push 0x80                                ; |Attributes = NORMAL
0040101D  |.  6A 03         push 0x3                                 ; |Mode = OPEN_EXISTING
0040101F  |.  6A 00         push 0x0                                 ; |pSecurity = NULL
00401021  |.  6A 03         push 0x3                                 ; |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
00401023  |.  68 000000C0   push 0xC0000000                          ; |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,-0x1
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 ds:[0x4020F5],eax
00401048  |.  B8 12000000   mov eax,0x12
0040104D  |.  BB 08204000   mov ebx,00402008
00401052  |.  6A 00         push 0x0                                 ; /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 ds:[0x4020F5]             ; |hFile = 00000044 (window)
00401061  |.  E8 30040000   call <jmp.&KERNEL32.ReadFile>            ; \ReadFile
00401066  |.  833D A0214000>cmp dword ptr ds:[0x4021A0],0x12         ;  // 比較這個地址的文本是否爲0x12
0040106D  |.^ 75 C8         jnz short 00401037
0040106F  |.  68 08204000   push 00402008
00401074  |.  E8 98020000   call 00401311                            ;  // 進行一些數據比較
00401079  |.  8135 F9204000>xor dword ptr ds:[0x4020F9],0x12345678
00401083  |.  83C4 04       add esp,0x4
00401086  |.  68 08204000   push 00402008
0040108B  |.  E8 AC020000   call 0040133C                            ;  // 一個加法
00401090  |.  83C4 04       add esp,0x4
00401093  |.  3B05 F9204000 cmp eax,dword ptr ds:[0x4020F9]
00401099  |.  0F94C0        sete al
0040109C  |.  50            push eax
0040109D  |.  84C0          test al,al
0040109F  |.^ 74 96         je short 00401037
004010A1  |.  68 0E214000   push 0040210E                            ;  ASCII "CrackMe v3.0             "
004010A6  |.  E8 9B020000   call 00401346
004010AB  |.  83C4 04       add esp,0x4
004010AE  |>  6A 00         push 0x0                                 ; /Title = NULL
004010B0  |.  68 28214000   push 00402128                            ; |Class = "No need to disasm the code!"
004010B5  |.  E8 9A030000   call <jmp.&USER32.FindWindowA>           ; \FindWindowA

這裏查找了CRACKME3.KEY文件,然後通過ReadFile讀取文件處理。

我們在exe所在目錄下,新建一個空文件:CRACKME3.KEY

由於從地址 00401066 開始,進行了大量的內存數據修改和比較處理,並且沒有參照內容,分析了很長時間還是不知道怎樣纔是正確的,所以只有放棄了!

有關內存處理的地方如下:

00401007  |.  A3 E9204000   mov dword ptr ds:[0x4020E9],eax
0040100C  |.  C705 F9204000>mov dword ptr ds:[0x4020F9],0x0

00401043  |> \A3 F5204000   mov dword ptr ds:[0x4020F5],eax

00401052  |.  6A 00         push 0x0                                 ; /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 ds:[0x4020F5]             ; |hFile = NULL
00401061  |.  E8 30040000   call <jmp.&KERNEL32.ReadFile>            ; \ReadFile

將讀取的文本存放在[0x4020F5]內存中,然後進行數據比較,這部分是最重點的內容:

00401066  |.  833D A0214000>cmp dword ptr ds:[0x4021A0],0x12         ;  // 比較這個地址的字節是否爲0x12
0040106D  |.^ 75 C8         jnz short 00401037
0040106F  |.  68 08204000   push 00402008
00401074  |.  E8 98020000   call 00401311                            ;  // 進行一些數據比較
00401079  |.  8135 F9204000>xor dword ptr ds:[0x4020F9],0x12345678
00401083  |.  83C4 04       add esp,0x4
00401086  |.  68 08204000   push 00402008
0040108B  |.  E8 AC020000   call 0040133C                            ;  // 一個加法
00401090  |.  83C4 04       add esp,0x4
00401093  |.  3B05 F9204000 cmp eax,dword ptr ds:[0x4020F9]
00401099  |.  0F94C0        sete al
0040109C  |.  50            push eax
0040109D  |.  84C0          test al,al
0040109F  |.^ 74 96         je short 00401037

Call 00401037:
00401311  /$  33C9          xor ecx,ecx
00401313  |.  33C0          xor eax,eax
00401315  |.  8B7424 04     mov esi,dword ptr ss:[esp+0x4]
00401319  |.  B3 41         mov bl,0x41
0040131B  |>  8A06          /mov al,byte ptr ds:[esi]
0040131D  |.  32C3          |xor al,bl
0040131F  |.  8806          |mov byte ptr ds:[esi],al
00401321  |.  46            |inc esi
00401322  |.  FEC3          |inc bl
00401324  |.  0105 F9204000 |add dword ptr ds:[0x4020F9],eax
0040132A  |.  3C 00         |cmp al,0x0
0040132C  |.  74 07         |je short 00401335
0040132E  |.  FEC1          |inc cl
00401330  |.  80FB 4F       |cmp bl,0x4F
00401333  |.^ 75 E6         \jnz short 0040131B
00401335  |>  890D 49214000 mov dword ptr ds:[0x402149],ecx
0040133B  \.  C3            retn

Call 0040133C:
0040133C  /$  8B7424 04     mov esi,dword ptr ss:[esp+0x4]
00401340  |.  83C6 0E       add esi,0xE
00401343  |.  8B06          mov eax,dword ptr ds:[esi]
00401345  \.  C3            retn

到此結束!

BY  笨笨D幸福

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章