一.手动在代码空白区添加代码
我们以notepad为例
注意!!注意!!注意!!一定要用xp及xp一下的系统进行实践,否则会因为系统原因导致我们无法正常运行修改以后的程序!!本人痛的教训,花了几天都不成功一直以为是自己的问题
MessageBoxA内存地址为0x77D507EA
程序相对内存入口地址0x0000739D
文件对齐粒度 0x00000200
内存对齐粒度 0x00001000
.text节起始位置0x00000400
.text数据大小是0x00007748
.text节结束位置0x00000400 + 0x00007748= 0x00007B48
.data节起始位置0x00007C00
两节中间空白区大小 0x00007C00- 0x00007B48= 0XB8 > 0x12(要添加的硬编码的大小)
我们通过010Editor可以清晰看到,确实有大片空白区
我们将在0x00007B48处添加我们的代码
6A 00 6A 00 6A 00 6A 00 E8 00 00 00 00 E9 00 00 00 00
这是预备代码,现在计算MessageBoxA的相对地址
在此之前我们要计算下一指令在内存中的地址:
ImageBase = 0x01000000
.text节VirtualAddress = 0x00001000
.text节的VirtualSize = 00007748
因此我们添加代码在内存的位置是0x01000000 + 0x00001000 + 00007748 = 0x1008748
所以E8下一指令地址为0x1008748 + 0xD = 0x1008755
X = 0x77D507EA - 0x1008755 = 0x76D48095
在内存中 95 80 D4 76排列
现在我们E9后添加原虚拟内存中相对程序入口地址
E9指令下一条指令内存地址为:0x1008755 + 0x5 = 0X100875A
相对地址为:0x01000000 + 0x0000739D - 0X100875A = FFFFEC43
所以内存排布为 43 EC FF FF
如下图便是我们添加代码的最终版
现在我们修改原程序入口为我们添加代码的地址
添加代码虚拟内存相对地址0x00007B48 - 0x00000400 + 0x00001000 = 8748
内存排布为 48 87
如下图便是我们修改入口的最终结果
修改完毕以后,我们打开notepad验证一下
成功了!