内容太长可能没人看, 总结为两个问题:1) 怎么计算 64位下的 E8 后面的地址? 2) 为什么 64 程序的 E8 后面地址也是4字节, 不应该是8字节吗?
--------------------------------
看滴水三期的视频,按照视频步骤走。
win10 中 messageboxA 的地址是:0x00007FF8098B1CD0;
ultraedit 手动解析 guessing_game.exe(我用 rust 写的一个小程序)
解析出 opt header 中的 ImageBase: 140000000
一个节表,
Misc.VirtualSize: 42218,
VirtualAddress: 1000,
PointerToRawData: 400,
SizeOfRawData: 42400
可以得出 从 400 开始 到 42618(400 + 42218) 都是原本的代码,
从 42618 到 42800(400 + 42400) 都是空白区.
代码就从 42618 开始加
分析 E8, E9 在 image buffer 中的地址
ultraedit 中, 42618 开始, 加入
`6A 00 6A 00 6A 00 6A 00 E8 00 00 00 00 E9 00 00 00 00`
E8 指令的下一行地址就是 +5; E9 那个位置: 42625
计算 E9 那个位置在 image buffer 中的偏移.
(1) 42625 相对第一个节的偏移是 42625 - 400 = 42225
(2) image buffer 中, 第一个节偏移是 1000
(3) 那么 E9 所在位置在 image buffer 中的偏移, 就是 1000 + 42225 = 43225
(4) 所以, "E8 下一行指令的地址" = ImageBase + 43225 = 140043225
(5) 所以,
x = 0x00007FF8098B1CD0 - 0x140043225 = 0x00007ff6c986eaab;
这是结果不对啊...e8 后面需要4个字节, x 算出来8个字节宽度。
没法继续下去了,怎么办,哪里有问题?
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2020-3-11 16:50
被mb_utkwwmjb编辑
,原因: 提炼问题