160個crackme之003

還是下定決心好好做一波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腳本



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