這一篇講的是函數參考
同上結合一小軟件進行講解軟件特點大概如下
點一下“Check It”按鈕試一下,沒反應!再輸個“78787878”試試,還是沒反應。再試試輸入字母或其它字符,輸不進去。由此判斷注冊碼應該都是數字,只有輸入正確的注冊碼才有反應。這個狀態下我們沒有什么字符串可以參考的所以想到在API上下斷點,讓被調試的程序停在我們希望的地方。具體操作:
在OllyDBG的反匯編窗口中右擊,選擇查找->當前模塊中的名稱(標簽),或者CTR+N組合鍵也可以(注意在進行此操作時要在OllyDBG中保證是在當前被調試程序的領空,如果調試這個程序時OllyDBG的標題欄顯示的就是“[CPU -主線程,模塊- CrackHea]”,這表明我們當前在被調試程序的領空)。通過上面的操作后會彈出一個對話框。
對于這樣的編輯框中輸注冊碼的程序一般會設斷點首選的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
直接右擊信息窗口的這兩行選擇修改寄存器此時就豁然開朗了
將得到的數字貼到編輯框中即可
一個簡單的函數參考
下一篇:學OD -- 字符參考