最近在學習匯編(看的是王爽老師的《匯編語言(第三版)》),然后想嘗試使用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"啦!