?書(shū)中摘抄的代碼如下悯蝉,編譯后的EXE文件归形,實(shí)現(xiàn)了簡(jiǎn)單的密碼校驗(yàn)的功能。此次實(shí)驗(yàn)的目的鼻由,是按照書(shū)中的描述暇榴,修改EXE文件,使輸入非匹配的密碼可以通過(guò)驗(yàn)證蕉世。
#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進(jìn)行編譯蔼紧,編譯的時(shí)候選擇32位程序發(fā)布,編譯生成文件0day_test1.exe:
該程序運(yùn)行效果如下:
使用IDA靜態(tài)反編譯工具打開(kāi)該EXE文件狠轻,找到匹配PASSWORD的判斷分支指令奸例,嘗試修改EXE的代碼邏輯為:PASSWORD匹配失敗跳轉(zhuǎn)到原來(lái)的密碼比較成功邏輯分支,實(shí)現(xiàn)輸入非匹配密碼可以通過(guò)驗(yàn)證向楼。
在該指令上按空格切換命令界面查吊,獲取該指令的VA地址
得到該指令的VA地址在.text段的00401578,可以看到得到的VA地址和原書(shū)中描述的地址并不一樣蜜自。
.text:00401578?????????????????jz??????short loc_401588
關(guān)掉VA菩貌,使用管理員權(quán)限打開(kāi)ollydbg,打開(kāi)0day_test1.exe:
然后使用CTRL+G直接跳轉(zhuǎn)到上述的VA地址
雙擊該指令重荠,將原本的“JE SHORT 00401588”改成“JNE SHORT 00401588”
可以看到指令已經(jīng)被改:
目前被被改的僅僅是內(nèi)存中的指令箭阶,需要寫(xiě)到EXE文件中虚茶。書(shū)中使用原始的方式在EXE文件中找到指令并修改,由于ollydbg有現(xiàn)成的功能實(shí)現(xiàn)這個(gè)功能仇参。
單擊該指令嘹叫,右鍵--Edit--Copy to executable
彈出窗口提醒保存文件,確認(rèn)OK诈乒。然后從窗口選擇保存文件
運(yùn)行破解的EXE文件罩扇,可以發(fā)現(xiàn)輸入錯(cuò)誤密碼可以通過(guò)認(rèn)證。
上面使用ollydbg實(shí)現(xiàn)PE文件(EXE文件)的格式修改怕磨,下面實(shí)驗(yàn)手工查找PE文件中的執(zhí)行指令喂饥。
使用PE Explorer打開(kāi)PE文件
EXE文件的代碼段.text段,內(nèi)存裝載基地址(Image Base)=00401000
指令的虛擬內(nèi)存地址(VA)=00401578
.text段文件中偏移地址 =?00000400?
計(jì)算指令的文件偏移地址
指令在文件偏移地址=虛擬內(nèi)存地址(VA)- 裝載基址(Image Base)+.text段文件中偏移地址
=00401578-00401000+00000400?
=978
使用WinHex直接跳到指令在文件偏移地址:
改成:
保存文件肠鲫,并運(yùn)行: