[反彙編練習] 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不報毒,個人承諾絕對不會進行任何和木馬病毒相關內容。
2、程序分析:
想要破解一個程序,必須先了解這個程序。所以,在破解過程中,對最初程序的分析很重要,他可以幫助我們理解作者的目的和意圖,特別是對於註冊碼的處理細節,從而方便我們反向跟蹤和推導。
和上一節一樣,打開CHM,選擇第26個Colormaster.exe,保存下來。運行程序,程序界面如下:
點擊上面的那個按鈕沒有任何反應,看來失敗沒有提示的。
PEID:Microsoft Visual Basic 5.0 / 6.0
3、思路分析和破解流程
沒有信息框,我們可以試試查找文本的辦法。
1、打開OD,將exe拖到OD窗口中,等程序暫停後,直接點擊運行按鈕(F9),不用理會。
2、在OD中反彙編窗口,右鍵->中文搜索插件->智能搜索,信息如下:
大概地猜猜意思,圖中選中的哪一行應該就是正確的。(爲什麼是它?因爲它的第一個單詞我認識啊!哈哈哈!)
雙擊或者右鍵->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。再試試:
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工具嘗試的結果:
首先,他確實有一個Timer,但是根據Timer事件的跟蹤內容,發現裏面就產生了一個錯誤,和註冊碼相關的啥也沒有。在按鈕按下時,通過遍歷Name的每一個字符ANSII值,然後與浮點數432.4以及0x15進行了一些乘法運算,(這在OD裏已經跟蹤出來了,但是怎麼計算也無法匹配跟蹤的結果,有點無語),最後將結果轉換爲整數,最後的兩個結果轉換爲十六進制整數文本,然後開頭和結尾加上了一些其他的整數文本,組成了最後的註冊碼。
PS:VB的代碼跟蹤起來代價太大,太坑了,但是160個CrackMe中有很多這種程序,無語啊!
BY 笨笨D幸福