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

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

本系列文章的目的是從一個沒有任何經驗的新手的角度(其實就是我自己),一步步嘗試將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,選擇第26個Colormaster.exe,保存下來。運行程序,程序界面如下:

0

點擊上面的那個按鈕沒有任何反應,看來失敗沒有提示的。

PEID:Microsoft Visual Basic 5.0 / 6.0

3、思路分析和破解流程

沒有信息框,我們可以試試查找文本的辦法。

1、打開OD,將exe拖到OD窗口中,等程序暫停後,直接點擊運行按鈕(F9),不用理會。

2、在OD中反彙編窗口,右鍵->中文搜索插件->智能搜索,信息如下:

1

大概地猜猜意思,圖中選中的哪一行應該就是正確的。(爲什麼是它?因爲它的第一個單詞我認識啊!哈哈哈!)

雙擊或者右鍵->Show call進去,我們就返回到了反彙編窗口,附進代碼如下:

004036EB     /0F84 AB000000 je 0040379C
004036F1   . |8B35 D4104000 mov esi,dword ptr ds:[<&MSVBVM60.__vbaVa>;  msvbvm60.__vbaVarDup
004036F7   . |B9 04000280   mov ecx,0x80020004
004036FC   . |898D 64FFFFFF mov dword ptr ss:[ebp-0x9C],ecx
00403702   . |B8 0A000000   mov eax,0xA
00403707   . |898D 74FFFFFF mov dword ptr ss:[ebp-0x8C],ecx
0040370D   . |BF 08000000   mov edi,0x8
00403712   . |8D95 0CFFFFFF lea edx,dword ptr ss:[ebp-0xF4]
00403718   . |8D8D 7CFFFFFF lea ecx,dword ptr ss:[ebp-0x84]
0040371E   . |8985 5CFFFFFF mov dword ptr ss:[ebp-0xA4],eax
00403724   . |8985 6CFFFFFF mov dword ptr ss:[ebp-0x94],eax
0040372A   . |C785 14FFFFFF>mov dword ptr ss:[ebp-0xEC],00401F2C     ;  Colormaster′s Crackme 7.0
00403734   . |89BD 0CFFFFFF mov dword ptr ss:[ebp-0xF4],edi
0040373A   . |FFD6          call esi                                 ;  <&MSVBVM60.__vbaVarDup>
0040373C   . |8D95 1CFFFFFF lea edx,dword ptr ss:[ebp-0xE4]
00403742   . |8D4D 8C       lea ecx,dword ptr ss:[ebp-0x74]
00403745   . |C785 24FFFFFF>mov dword ptr ss:[ebp-0xDC],00401F80     ;   Gratulation ,du hast es geschafft!
0040374F   . |89BD 1CFFFFFF mov dword ptr ss:[ebp-0xE4],edi
00403755   . |FFD6          call esi

哈哈,代碼是不是很簡單?這段代碼的開頭je 0040379C 就是我們需要的關鍵跳轉!嘗試爆破一下!選中je 0040379C, 右鍵->Binary->Fill with NOPs。再試試:

2

4、註冊機的探索

註冊碼比較肯定在關鍵跳轉附近,我們直接分析這段代碼就可以了:

代碼比較長,撿重要的說明:

00402CAC   .  FF15 34104000 call dword ptr ds:[<&MSVBVM60.__vbaHresu>;  msvbvm60.__vbaHresultCheckObj
00402CB2   >  8B55 D8       mov edx,dword ptr ss:[ebp-0x28]
00402CB5   .  52            push edx                                 ;  // edx="bbdxf",目的是校驗字符串長度大於5
00402CB6   .  FF15 10104000 call dword ptr ds:[<&MSVBVM60.__vbaLenBs>;  msvbvm60.__vbaLenBstr
00402CBC   .  33C9          xor ecx,ecx
00402CBE   .  83F8 04       cmp eax,0x4
00402CC1   .  0F9EC1        setle cl
00402CC4   .  F7D9          neg ecx
00402CC6   .  66:898D DCFEF>mov word ptr ss:[ebp-0x124],cx
00402CCD   .  8D4D D8       lea ecx,dword ptr ss:[ebp-0x28]
00402CD0   .  FF15 F0104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeS>;  msvbvm60.__vbaFreeStr
00402CD6   .  8D4D B8       lea ecx,dword ptr ss:[ebp-0x48]
00402CD9   .  FF15 F4104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeO>;  msvbvm60.__vbaFreeObj
00402CDF   .  66:399D DCFEF>cmp word ptr ss:[ebp-0x124],bx
00402CE6   .  0F84 B0000000 je 00402D9C
00402CEC   .  8B35 D4104000 mov esi,dword ptr ds:[<&MSVBVM60.__vbaVa>;  msvbvm60.__vbaVarDup
00402CF2   .  B9 04000280   mov ecx,0x80020004
00402CF7   .  898D 64FFFFFF mov dword ptr ss:[ebp-0x9C],ecx
00402CFD   .  B8 0A000000   mov eax,0xA
00402D02   .  898D 74FFFFFF mov dword ptr ss:[ebp-0x8C],ecx
00402D08   .  BF 08000000   mov edi,0x8
00402D0D   .  8D95 0CFFFFFF lea edx,dword ptr ss:[ebp-0xF4]
00402D13   .  8D8D 7CFFFFFF lea ecx,dword ptr ss:[ebp-0x84]
00402D19   .  8985 5CFFFFFF mov dword ptr ss:[ebp-0xA4],eax
00402D1F   .  8985 6CFFFFFF mov dword ptr ss:[ebp-0x94],eax
00402D25   .  C785 14FFFFFF>mov dword ptr ss:[ebp-0xEC],00401F2C     ;  Colormaster′s Crackme 7.0
00402D2F   .  89BD 0CFFFFFF mov dword ptr ss:[ebp-0xF4],edi
00402D35   .  FFD6          call esi                                 ;  <&MSVBVM60.__vbaVarDup>
00402D37   .  8D95 1CFFFFFF lea edx,dword ptr ss:[ebp-0xE4]
00402D3D   .  8D4D 8C       lea ecx,dword ptr ss:[ebp-0x74]
00402D40   .  C785 24FFFFFF>mov dword ptr ss:[ebp-0xDC],00401ED4     ;   Der Name muss mindestens 5 Chars haben
00402D4A   .  89BD 1CFFFFFF mov dword ptr ss:[ebp-0xE4],edi
00402D50   .  FFD6          call esi
00402D52   .  8D95 5CFFFFFF lea edx,dword ptr ss:[ebp-0xA4]
00402D58   .  8D85 6CFFFFFF lea eax,dword ptr ss:[ebp-0x94]
00402D5E   .  52            push edx
00402D5F   .  8D8D 7CFFFFFF lea ecx,dword ptr ss:[ebp-0x84]
00402D65   .  50            push eax
00402D66   .  51            push ecx
00402D67   .  8D55 8C       lea edx,dword ptr ss:[ebp-0x74]
00402D6A   .  6A 40         push 0x40
00402D6C   .  52            push edx
00402D6D   .  FF15 48104000 call dword ptr ds:[<&MSVBVM60.#595>]     ;  msvbvm60.rtcMsgBox

首先,校驗了Name的長度,必須大於4. 然後,有很長很長一段代碼用於進行浮點數計算,但是生成的數值實在無法理解是怎樣互相聯繫的,所以我放棄了。

最後,就進行了註冊碼的相關處理:

00403648   . /7D 12         jge short 0040365C
0040364A   . |68 A0000000   push 0xA0
0040364F   . |68 941E4000   push 00401E94
00403654   . |56            push esi
00403655   . |50            push eax
00403656   . |FF15 34104000 call dword ptr ds:[<&MSVBVM60.__vbaHresu>;  msvbvm60.__vbaHresultCheckObj
0040365C   > \8B45 D8       mov eax,dword ptr ss:[ebp-0x28]
0040365F   .  8B4D D4       mov ecx,dword ptr ss:[ebp-0x2C]
00403662   .  8B55 D0       mov edx,dword ptr ss:[ebp-0x30]
00403665   .  50            push eax                                 ;  // eax = "123123"
00403666   .  51            push ecx                                 ;  // ecx = "52406C2C2CC54463"
00403667   .  52            push edx                                 ;  // edx = "bbdxf"
00403668   .  FF15 10104000 call dword ptr ds:[<&MSVBVM60.__vbaLenBs>;  msvbvm60.__vbaLenBstr
0040366E   .  50            push eax                                 ;  // eax = 5
0040366F   .  FF15 08104000 call dword ptr ds:[<&MSVBVM60.__vbaStrI4>;  msvbvm60.__vbaStrI4
00403675   .  8B35 DC104000 mov esi,dword ptr ds:[<&MSVBVM60.__vbaSt>;  msvbvm60.__vbaStrMove
0040367B   .  8BD0          mov edx,eax
0040367D   .  8D4D CC       lea ecx,dword ptr ss:[ebp-0x34]
00403680   .  FFD6          call esi                                 ;  <&MSVBVM60.__vbaStrMove>
00403682   .  8B3D 30104000 mov edi,dword ptr ds:[<&MSVBVM60.__vbaSt>;  msvbvm60.__vbaStrCat
00403688   .  50            push eax                                 ;  // eax = "5", ecx="52406C2C2CC54463"
00403689   .  FFD7          call edi                                 ;  <&MSVBVM60.__vbaStrCat>
0040368B   .  8BD0          mov edx,eax
0040368D   .  8D4D C8       lea ecx,dword ptr ss:[ebp-0x38]
00403690   .  FFD6          call esi
00403692   .  50            push eax
00403693   .  68 741F4000   push 00401F74                            ;  -CM
00403698   .  FFD7          call edi
0040369A   .  8BD0          mov edx,eax
0040369C   .  8D4D C4       lea ecx,dword ptr ss:[ebp-0x3C]
0040369F   .  FFD6          call esi
004036A1   .  50            push eax
004036A2   .  FF15 74104000 call dword ptr ds:[<&MSVBVM60.__vbaStrCm>;  msvbvm60.__vbaStrCmp

這裏,我們發現:註冊碼比較的文本,在我們點擊按鈕之前就已經生成好了,String    "52406C2C2CC54463",爲了避免這個文本是固定的,我們再次換一個Name跟蹤下它的比較文本,發現確實不一樣了,說明,比較字符串是在輸入Name的時候也已經根據Name的內容動態生成了。

想要在輸入Name就完成了比較文本的生成,一般都是用的是Edit控件文本變化事件或者一個Timer定時去讀取Name的內容然後生成。

遺憾的是,我嘗試尋找這兩種事件的地址,終究也沒有找到,以下是使用其他VB工具嘗試的結果:

 

3

4

5

首先,他確實有一個Timer,但是根據Timer事件的跟蹤內容,發現裏面就產生了一個錯誤,和註冊碼相關的啥也沒有。在按鈕按下時,通過遍歷Name的每一個字符ANSII值,然後與浮點數432.4以及0x15進行了一些乘法運算,(這在OD裏已經跟蹤出來了,但是怎麼計算也無法匹配跟蹤的結果,有點無語),最後將結果轉換爲整數,最後的兩個結果轉換爲十六進制整數文本,然後開頭和結尾加上了一些其他的整數文本,組成了最後的註冊碼。

 

PS:VB的代碼跟蹤起來代價太大,太坑了,但是160個CrackMe中有很多這種程序,無語啊!

 

BY  笨笨D幸福

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