這一篇講的是函數(shù)參考
同上結(jié)合一小軟件進(jìn)行講解軟件特點(diǎn)大概如下
點(diǎn)一下“Check It”按鈕試一下,沒反應(yīng)!再輸個(gè)“78787878”試試,還是沒反應(yīng)。再試試輸入字母或其它字符,輸不進(jìn)去。由此判斷注冊碼應(yīng)該都是數(shù)字,只有輸入正確的注冊碼才有反應(yīng)。這個(gè)狀態(tài)下我們沒有什么字符串可以參考的所以想到在API上下斷點(diǎn),讓被調(diào)試的程序停在我們希望的地方。具體操作:
在OllyDBG的反匯編窗口中右擊,選擇查找->當(dāng)前模塊中的名稱(標(biāo)簽),或者CTR+N組合鍵也可以(注意在進(jìn)行此操作時(shí)要在OllyDBG中保證是在當(dāng)前被調(diào)試程序的領(lǐng)空,如果調(diào)試這個(gè)程序時(shí)OllyDBG的標(biāo)題欄顯示的就是“[CPU -主線程,模塊- CrackHea]”,這表明我們當(dāng)前在被調(diào)試程序的領(lǐng)空)。通過上面的操作后會彈出一個(gè)對話框。
對于這樣的編輯框中輸注冊碼的程序一般會設(shè)斷點(diǎn)首選的API函數(shù)是
GetDlgItemText及GetWindowText。每個(gè)函數(shù)都有兩個(gè)版本,
一個(gè)是ASCII版,在函數(shù)后添加一個(gè)A表示,如GetDlgItemTextA,
一個(gè)是UNICODE版,在函數(shù)后添加一個(gè)W表示。如GetDlgItemTextW。
對于編譯為UNCODE版的程序可能在Win98下不能運(yùn)行,因?yàn)閃in98并非是完全支持UNICODE的系統(tǒng)。而NT系統(tǒng)則從底層支持UNICODE,它可以在操作系統(tǒng)內(nèi)對字串進(jìn)行轉(zhuǎn)換,同時(shí)支持ASCII和UNICODE版本函數(shù)的調(diào)用。一般我們打開的程序看到的調(diào)用都是ASCII類型的函數(shù),以“A”結(jié)尾。
我們現(xiàn)在就是要找一下我們調(diào)試的程序有沒有調(diào)用GetDlgItemTextA或GetWindowTextA函數(shù)。找到一個(gè)GetWindowTextA。下斷點(diǎn)可以在這個(gè)函數(shù)上右擊,選擇“在每個(gè)參考上設(shè)置斷點(diǎn)”,我們會在OllyDBG窗口最下面的那個(gè)狀態(tài)欄里看到“已設(shè)置2個(gè)斷點(diǎn)”。也可以就是那個(gè)GetWindowTextA函數(shù)上右擊,在彈出菜單上選擇“查找輸入函數(shù)參考”(或者按回車鍵)彈出所有含有GetWindowTextA的地方我們只要在callGetWindowTextA下斷點(diǎn)即可F9運(yùn)行輸入注冊碼點(diǎn)check按鈕 程序會斷在咱下的這個(gè)斷點(diǎn)處
同上一篇用F7進(jìn)入分析程序.如果之前下API斷點(diǎn)是采用方式一即所有的都下了此時(shí)程序會跑到非程序領(lǐng)空中(可以看OllyDBG的標(biāo)題欄顯示)此時(shí)先將此多余斷點(diǎn)刪掉,按一下 ALT+F9 組合鍵回到程序領(lǐng)空,F(xiàn)7繼續(xù)進(jìn)入分析部分程序如下
004013D2 /$ 56 PUSH ESI
004013D3 |. 33C0 XOR EAX,EAX
004013D5 |. 8D35 C4334000 LEA ESI,DWORD PTR DS:[4033C4]把框中的數(shù)值送到ESI
004013DB |. 33C9 XOR ECX,ECX
004013DD |. 33D2 XOR EDX,EDX
004013DF |. 8A06 MOV AL,BYTE PTR DS:[ESI] 把注冊碼中的每個(gè)字符送AL
004013E1 |. 46 INC ESI
004013E2 |. 3C 2D CMP AL,2D
把取得的字符與16進(jìn)制值為2D的字符(即“-”)比較,這里用于判斷輸入的是不是負(fù)數(shù)
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
當(dāng)走到最后
再按一下F8,我們就走出00401328地址處的那個(gè)CALL了。現(xiàn)在我們回到了這里:
0040132D |. 3BC6 CMP EAX,ESI ;比較
0040132F|. 75 42 JNZ SHORT CrackHea.00401373 ; 不等則出錯
看出來的時(shí)候是比較的EAX和ESI所以就看哪個(gè)里邊是咱輸入的哪個(gè)是正確的
由程序分析可知這是一個(gè)小的加密算法就是將咱輸入的數(shù)字按照一定的規(guī)律給加密了整成咱不認(rèn)識的了并放在了EAX中而ESI是之前的壓棧后邊進(jìn)行了一個(gè)XOR運(yùn)算 這種時(shí)候兩者是看信息窗口ESI = 68AFCD59 EAX = 00BC6142
直接右擊信息窗口的這兩行選擇修改寄存器此時(shí)就豁然開朗了
將得到的數(shù)字貼到編輯框中即可
一個(gè)簡單的函數(shù)參考