利用OD破解一個簡單的C語言程序


最近在學習匯編(看的是王爽老師的《匯編語言(第三版)》),然后想嘗試使用OD(Ollydbg)軟件破解一個簡單的C語言程序練練手。

環境:

C語言編譯環境:VC++6.0

系統:在Windows10下開的VM虛擬機中的Windows XP

C語言程序代碼:

 1 #include <STDIO.H>
 2 
 3 int main(){
 4     int age;
 5     age=10;
 6     if (age==10){
 7         printf("Successful\n");
 8     }else{
 9         printf("No Access\n");
10     }
11     getchar();
12 
13     return 0;
14 }

這個程序編譯后,正常運行輸出的是"Successful",而現在的目的是采用反匯編讓該程序輸出"NO Access"。

我們先在VC6中分析一下這個程序反匯編(Disassembly)之后的結果:(這個步驟不會請自行百度)

簡單分析之后,可以看出"if (age==10)"被編譯為:

CMP DWORD PTR [EBP-4],0AH

JNE main+34H 

分析一下這兩條匯編指令:

CMP用於將SS:[EBP-4]內存單元中(這個內存單元保存的就是變量age的值)數據與0AH做減法運算,但是不保存結果,只影響標志位,由於被減數和減數都是0AH,所以相減為0,標志位ZF=1。

JNE全稱為Jump if Not Equal,它與JNZ(Jump if Not Zero)指令等價(為什么要說到JNZ呢,因為在OD軟件中是JNZ而不是JNE),JNE/JNZ判斷標志位ZF是否為1,如果為1則不跳轉,顯然此時的ZF=1,那就是不跳轉了,將繼續執行下面的指令,就輸出了"Successful"了。

而我們需要輸出"No Access",就需要讓它跳轉,那怎么讓它跳轉呢,很簡單,只需要將JNE修改為JE就行了,JE就是如果ZF=1則跳轉。

知道了突破口,用OD打開這個程序,找到00401033H行(由於編譯環境不同,讀者可能不是此行,建議使用ASCII字符串搜索"Successful"進行跳轉,此方法自行百度)。

雙擊選中的行,將jnz改寫為jz,然后單擊“匯編”按鈕即可。

 

在修改的行右鍵,選擇“復制到可執行文件”->“所有修改”,在跳出的對話框中選擇“全部復制”。

 

 在跳出的新窗口中右鍵選擇“保存文件”即可保存修改之后的程序。

 

 然后運行修改之后的程序,顯示的就是"No Access"啦!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM