假设我已经使用以下命令分配了放置我的 codecave 的地址VirtualAllocEx
(它返回地址),我使用以下命令将代码写入该地址WriteProcessMemory()
.
这是问题:
如何编写跳转到我的 Codecave 的跳转?我知道跳跃开始于“E9
",但是如何转换返回的地址VirtualAllocEx
转换为正确的 UInt32 (双字)以便调试器/编译器能够理解该指令?
例如:
我在地址00402020
(本机应用程序的 OEP)。我写了一个跳转004028CF
(空的地方)”JMP 004028CF
”。以字节为单位的指令如下所示:
CPU Disasm
Address Hex dump Command Comments
00402020 E9 AA080000 JMP 004028CF
"E9
“是我们表示 JMP 的方式。那么”AA080000
“,我如何生成这个?
我需要做类似的事情,这样我就可以将 JMP 初始化到我的 codecave,它将位于由VirtualAllocEx()
.
任何帮助将不胜感激!
提前致谢。
E9 是相对跳转,因此后面的 32 位只是当前指令指针的偏移量。看英特尔® 64 和 IA-32 架构软件开发人员手册第 2A 卷:指令集参考,A-M详情请参阅第 549 页。欲了解更多信息,请参阅英特尔® 64 和 IA-32 架构软件开发人员手册.
因此从 00402020 跳转到 004028CF 的操作码应该如下。
E9 00 00 08 AA
Offset = DestinationAddress - CurrentInstructionPointer
000008AA = 004028CF - 00402025
当执行跳转指令时,指令指针已经指向下一条指令。所以跳转指令的偏移量与当前指令指针值相差5。
CurrentInstructionPointer = AddressOfJumpInstruction + 5
UPDATE
更正了有关当前指令指针值的错误。谢谢jn。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)