xx學OD -- 函數參考

這一篇講的是函數參考

同上結合一小軟件進行講解軟件特點大概如下

wKioL1MFcNay5HdxAAB3ZTB6zew618.jpg

點一下“Check It”按鈕試一下,沒反應!再輸個“78787878”試試,還是沒反應。再試試輸入字母或其它字符,輸不進去。由此判斷註冊碼應該都是數字,只有輸入正確的註冊碼纔有反應。這個狀態下我們沒有什麼字符串可以參考的所以想到在API上下斷點,讓被調試的程序停在我們希望的地方。具體操作:

在OllyDBG的反彙編窗口中右擊,選擇查找->當前模塊中的名稱(標籤),或者CTR+N組合鍵也可以(注意在進行此操作時要在OllyDBG中保證是在當前被調試程序的領空,如果調試這個程序時OllyDBG的標題欄顯示的就是“[CPU -主線程,模塊- CrackHea]”,這表明我們當前在被調試程序的領空)。通過上面的操作後會彈出一個對話框,如圖:

wKioL1MFcPDyKAcwAAJc404BVC8162.jpg

對於這樣的編輯框中輸註冊碼的程序一般會設斷點首選的API函數是

GetDlgItemText及GetWindowText。每個函數都有兩個版本,

一個是ASCII版,在函數後添加一個A表示,如GetDlgItemTextA,

一個是UNICODE版,在函數後添加一個W表示。如GetDlgItemTextW。

對於編譯爲UNCODE版的程序可能在Win98下不能運行,因爲Win98並非是完全支持UNICODE的系統。而NT系統則從底層支持UNICODE,它可以在操作系統內對字串進行轉換,同時支持ASCII和UNICODE版本函數的調用。一般我們打開的程序看到的調用都是ASCII類型的函數,以“A”結尾。

我們現在就是要找一下我們調試的程序有沒有調用GetDlgItemTextA或GetWindowTextA函數。找到一個GetWindowTextA。下斷點可以在這個函數上右擊,選擇“在每個參考上設置斷點”,我們會在OllyDBG窗口最下面的那個狀態欄裏看到“已設置2個斷點”。也可以就是那個GetWindowTextA函數上右擊,在彈出菜單上選擇“查找輸入函數參考”(或者按回車鍵)彈出所有含有GetWindowTextA的地方我們只要在callGetWindowTextA下斷點即可F9運行輸入註冊碼點check按鈕 程序會斷在咱下的這個斷點處

同上一篇用F7進入分析程序.如果之前下API斷點是採用方式一即所有的都下了此時程序會跑到非程序領空中(可以看OllyDBG的標題欄顯示)此時先將此多餘斷點刪掉,按一下 ALT+F9 組合鍵回到程序領空,F7繼續進入分析部分程序如下

004013D2  /$  56           PUSH ESI

004013D3  |.  33C0          XOR EAX,EAX

004013D5  |.  8D35 C4334000 LEA ESI,DWORD PTR DS:[4033C4]把框中的數值送到ESI

004013DB  |.  33C9          XOR ECX,ECX

004013DD  |.  33D2          XOR EDX,EDX

004013DF  |.  8A06         MOV AL,BYTE PTR DS:[ESI] 把註冊碼中的每個字符送AL

004013E1  |.  46            INC ESI

004013E2  |.  3C 2D         CMP AL,2D

把取得的字符與16進制值爲2D的字符(即“-”)比較,這裏用於判斷輸入的是不是負數

004013E4  |.  75 08         JNZ SHORT CrackHea.004013EE

004013E6  |.  BA FFFFFFFF   MOV EDX,-1

004013EB  |.  8A06          MOV AL,BYTE PTR DS:[ESI]

004013ED  |.  46            INC ESI

004013EE  |>  EB 0B         JMP SHORT CrackHea.004013FB

004013F0  |>  2C 30         /SUB AL,30

004013F2  |.  8D0C89        |LEA ECX,DWORD PTR DS:[ECX+ECX*4]

004013F5  |.  8D0C48        |LEA ECX,DWORD PTR DS:[EAX+ECX*2]

004013F8  |.  8A06          |MOV AL,BYTE PTR DS:[ESI]

004013FA  |.  46            |INC ESI

004013FB  |>  0AC0           OR AL,AL

004013FD  |.^ 75 F1         \JNZ SHORT CrackHea.004013F0

004013FF  |.  8D040A        LEA EAX,DWORD PTR DS:[EDX+ECX]

00401402  |.  33C2          XOR EAX,EDX

00401404  |.  5E           POP ESI

00401405  |.  81F6 53757A79 XOR ESI,797A7553

0040140B  \.  C3            RETN

當走到最後

再按一下F8,我們就走出00401328地址處的那個CALL了。現在我們回到了這裏:

0040132D |. 3BC6 CMP EAX,ESI ;比較

0040132F|. 75 42 JNZ SHORT CrackHea.00401373 ; 不等則出錯

看出來的時候是比較的EAX和ESI所以就看哪個裏邊是咱輸入的哪個是正確的

由程序分析可知這是一個小的加密算法就是將咱輸入的數字按照一定的規律給加密了整成咱不認識的了並放在了EAX中而ESI是之前的壓棧後邊進行了一個XOR運算     這種時候兩者是看信息窗口ESI = 68AFCD59   EAX = 00BC6142

直接右擊信息窗口的這兩行選擇修改寄存器此時就豁然開朗了

將得到的數字貼到編輯框中即可

一個簡單的函數參考


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