手工修改二进制文件
1. 使hello25.exe弹出的对话框内容变为自己的学号
-
hello25.exe运行后会弹出两个对话框,如下图:
-
思路:显示的内容应该是以字符串的形式存储在临时变量中,临时变量通常存储在.data段,找到节表中.data段,读出在内存中节区的RVA地址(12H,4字节)或者在文件中的偏移量(20H)
结合ImageBase字段值为40000,.data段在内存中的403000位置
.data字段在文件中的800位置
下面以修改第一个对话框中内容为例:
- 找到需要修改内容所在地址
- 修改数据
- ollydbg中不能对文件直接进行修改,我们确定好要修改内容的位置后,回到winhex中进行修改
-
ollydbg中确认要修改的数据为5045C8……
-
回到winhex,找到相同的数据并修改
这里可能会遇到有这样的提示:
出现这个问题的同学应该是直接运行了老师发的压缩包里的winhex.exe文件,它没有办法帮你修改文件,要想修改还是得自己装一下。
-
- 另存为文件hello_modified.exe并试运行
2. 使其文件中不存在MessageBoxA这一函数名,但仍能正常运行且功能不变
- 思路:在hello25中MessageBoxA以名字方式调用,若想要达到文件中不存在MessageBoxA这一函数名,但仍能正常运行且功能不变,一是要修改导入表中关于MessageBoxA的引入名字表,二是要修改MessageBoxA的调用方式为以序号方式调用。
2.1 找到导入表中的引入名字表
- 找到导入表的桥1,找到其指向的存储地址中的函数名MessageBoxA
- 回到winhex中,按照偏移量相同的原则找到数据位置并修改(208C对应68C)并修改
2.2 修改MessageBoxA的调用方式为以序号方式调用
-
将user32.dll导入dependency walker中可以查到MessageBoxA的序号为0x864
-
找到引入名字表(图中对应402058处,值为208C)
-
回到winhex中修改,引入名字表在文件中的地址对应为658,修改为
0x80000864
最高位为1:表示函数以序号方式调入
-
另存为文件hello25_modified2.exe并运行
3. 使其只弹出第一或第二个对话框
- 这里我做的是只弹出第一个对话框
- 先打开ollydbg分析一下,可以从反汇编的窗口看到,每调用一次MessageBoxA,就会弹出一次对话框
EIP+下一条指令地址=所调用函数入口地址
如图0x00000014+0x0040102C=0x00401040
当调用ExitProcess程序会退出,时所以我们将EIP中的值修改,使得所调用的函数入口地址变为ExitProcess即可
0x00000008+0x0040102C=0x00401034
所以将EIP的值改为0x00000008
- 回到winhex进行修改
EIP的地址为401027,对应在文件中的地址为427
修改前:
修改后:
- 另存为文件hello25_modified3.exe并运行,只弹出了第一个对话框