?書中摘抄的代碼如下,編譯后的EXE文件,實現(xiàn)了簡單的密碼校驗的功能。此次實驗的目的,是按照書中的描述,修改EXE文件,使輸入非匹配的密碼可以通過驗證。
#include <stdio.h>
#include <string.h>
#define PASSWORD "1234567"
int verify_password (char *password)
{???????????
????int authenticated;
????authenticated=strcmp(password,PASSWORD);
????return authenticated;
}
main()
{???????????
????int valid_flag=0;
????char password[1024];
????while(1)
????{
????????printf("please input password:???????");
????????scanf("%s",password);
????????valid_flag = verify_password(password);
????????if(valid_flag)????????????????
????????{
????????????printf("incorrect password!\n\n");
????????}else
????????{
????????????printf("Congratulation! You have passed the verification!\n");
????????????break;
????????}
????}
}
使用Dev-C++ 5.11進行編譯,編譯的時候選擇32位程序發(fā)布,編譯生成文件0day_test1.exe:

該程序運行效果如下:

使用IDA靜態(tài)反編譯工具打開該EXE文件,找到匹配PASSWORD的判斷分支指令,嘗試修改EXE的代碼邏輯為:PASSWORD匹配失敗跳轉(zhuǎn)到原來的密碼比較成功邏輯分支,實現(xiàn)輸入非匹配密碼可以通過驗證。

在該指令上按空格切換命令界面,獲取該指令的VA地址

得到該指令的VA地址在.text段的00401578,可以看到得到的VA地址和原書中描述的地址并不一樣。
.text:00401578?????????????????jz??????short loc_401588
關掉VA,使用管理員權限打開ollydbg,打開0day_test1.exe:
然后使用CTRL+G直接跳轉(zhuǎn)到上述的VA地址

雙擊該指令,將原本的“JE SHORT 00401588”改成“JNE SHORT 00401588”

可以看到指令已經(jīng)被改:

目前被被改的僅僅是內(nèi)存中的指令,需要寫到EXE文件中。書中使用原始的方式在EXE文件中找到指令并修改,由于ollydbg有現(xiàn)成的功能實現(xiàn)這個功能。
單擊該指令,右鍵--Edit--Copy to executable

彈出窗口提醒保存文件,確認OK。然后從窗口選擇保存文件


運行破解的EXE文件,可以發(fā)現(xiàn)輸入錯誤密碼可以通過認證。

上面使用ollydbg實現(xiàn)PE文件(EXE文件)的格式修改,下面實驗手工查找PE文件中的執(zhí)行指令。
使用PE Explorer打開PE文件

EXE文件的代碼段.text段,內(nèi)存裝載基地址(Image Base)=00401000
指令的虛擬內(nèi)存地址(VA)=00401578
.text段文件中偏移地址 =?00000400?
計算指令的文件偏移地址
指令在文件偏移地址=虛擬內(nèi)存地址(VA)- 裝載基址(Image Base)+.text段文件中偏移地址
=00401578-00401000+00000400?
=978
使用WinHex直接跳到指令在文件偏移地址:


改成:

保存文件,并運行:
