還是下定決心好好做一波crackme
逆向的新手,寫個博客記錄一下自己的學習經歷
---------------------------------------------------華麗麗的分割線-------------------------------------------------
0X00 首先拿到了這個程序,打開,經過大概5秒鐘的等待之後就進入了主界面
傳統的name/serial類型的程序,隨便輸入一點東西發現彈窗。
這時候放到OD當中,我使用的是吾愛破解版的OD
首先想法就是找到關鍵跳轉,這裏有兩種方法
一是在彈窗後f12暫停,然後alt+k查看棧情況,這時會有
查看調用來自應用程序的rtcMsgBox跟進就找到了。
二是直接右鍵查找字符串。也能很容易的發現關鍵語句。
0X01 接下來就要做一些壞壞的事情了,首先嚐試爆破
在關鍵跳轉位置下斷、然後執行到此處時將標誌寄存器反轉
接着爆破就完成了,很輕鬆
0X02 接下來分析算法,寫出註冊機
首先查看關鍵跳轉附近的關鍵寄存器
這是附近的代碼
00408605 . E8 888AFFFF call <jmp.&MSVBVM50._adj_fdivr_m64>
0040860A > DFE0 fstsw ax
0040860C . A8 0D test al,0xD
0040860E . 0F85 AB010000 jnz AfKayAs_.004087BF
00408614 . FF15 34B14000 call dword ptr ds:[<&MSVBVM50.__vbaFpR8>>; msvbvm50.__vbaFpR8
0040861A . DC1D 28104000 fcomp qword ptr ds:[0x401028]
00408620 . DFE0 fstsw ax
00408622 . F6C4 40 test ah,0x40
00408625 . 74 07 je short AfKayAs_.0040862E
00408627 . BE 01000000 mov esi,0x1
0040862C . EB 02 jmp short AfKayAs_.00408630
0040862E > 33F6 xor esi,esi
00408630 > 8D55 E4 lea edx,dword ptr ss:[ebp-0x1C]
00408633 . 8D45 E8 lea eax,dword ptr ss:[ebp-0x18]
00408636 . 52 push edx
00408637 . 50 push eax
00408638 . 6A 02 push 0x2
0040863A . FF15 80B14000 call dword ptr ds:[<&MSVBVM50.__vbaFreeS>; msvbvm50.__vbaFreeStrList
00408640 . 83C4 0C add esp,0xC
00408643 . 8D4D D8 lea ecx,dword ptr ss:[ebp-0x28]
00408646 . 8D55 DC lea edx,dword ptr ss:[ebp-0x24]
00408649 . 51 push ecx
0040864A . 52 push edx
0040864B . 6A 02 push 0x2
0040864D . FF15 08B14000 call dword ptr ds:[<&MSVBVM50.__vbaFreeO>; msvbvm50.__vbaFreeObjList
00408653 . F7DE neg esi
00408655 . 83C4 0C add esp,0xC
00408658 . B9 04000280 mov ecx,0x80020004
0040865D . B8 0A000000 mov eax,0xA
00408662 . 894D 9C mov dword ptr ss:[ebp-0x64],ecx
00408665 . 66:85F6 test si,si
00408668 . 8945 94 mov dword ptr ss:[ebp-0x6C],eax
0040866B . 894D AC mov dword ptr ss:[ebp-0x54],ecx
0040866E . 8945 A4 mov dword ptr ss:[ebp-0x5C],eax
00408671 . 894D BC mov dword ptr ss:[ebp-0x44],ecx
00408674 . 8945 B4 mov dword ptr ss:[ebp-0x4C],eax
00408677 74 62 je short AfKayAs_.004086DB
00408679 . 8B35 14B14000 mov esi,dword ptr ds:[<&MSVBVM50.__vbaSt>; msvbvm50.__vbaStrCat
0040867F . 68 C06F4000 push AfKayAs_.00406FC0 ; You Get It
00408684 . 68 DC6F4000 push AfKayAs_.00406FDC ; /\r\n
00408689 . FFD6 call esi ; \__vbaStrCat
0040868B . 8BD0 mov edx,eax
說明和si有關
往上找有關si的處理
發現與eax有關,再往上就找到了關鍵的函數邏輯
首先在這裏,取出輸入的name值,然後計算字符串長度,將得到的長度乘0X15B38
接着取第一個字符的Ascii碼,與之前結果相加
之後,轉爲整數,進行浮點數加減法,這裏經過浮點數計算之後將之前的結果+2
下一步對結果*3後-2
最後+15
得到最終的serial。
其實這種驗證方式通用的弊端都在於,計算後正確的結果會在內存中出現,所以仔細觀察內存會發現小驚喜。
驗證結果正確
最後回顧整個算法過程寫出註冊機
關鍵算法流程:serial=(strlen*0X15B38+ord(name[0])+2)*3-2+15
附python腳本