假设我已经使用 VirtualAllocEx
(它返回地址)分配了放置我的 codecave 的地址,并且我使用 WriteProcessMemory()
将我的代码写入该地址.
问题是:
如何编写到我的代码洞穴的跳转?我知道跳转以“E9
”开头,但如何将 VirtualAllocEx
返回的地址转换为正确的 UInt32 (dword),以便调试器/编译器能够理解该指令?
例如:
我在地址 00402020
( native 应用程序的 OEP)。我写了一个跳转至 004028CF
(空白处)“JMP 004028CF
”。以字节为单位的指令如下所示:
CPU Disasm
Address Hex dump Command Comments
00402020 E9 AA080000 JMP 004028CF
“E9
”是我们指示 JMP 的方式。 “AA080000
”如何生成?
我需要做一些类似的事情,这样我就可以将 JMP 初始化到我的代码洞穴,它将位于 VirtualAllocEx()
返回的地址。
任何帮助将不胜感激!
提前致谢。
最佳答案
E9 是相对跳转,所以后面的 32 位只是当前指令指针的偏移量。参见 Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2A: Instruction Set Reference, A-M详情见 549ff 页。有关详细信息,请参阅 Intel® 64 and IA-32 Architectures Software Developer's Manuals .
所以从 00402020 跳转到 004028CF 的操作码应该如下。
E9 00 00 08 AA
Offset = DestinationAddress - CurrentInstructionPointer
000008AA = 004028CF - 00402025
执行跳转指令时,指令指针已经设置为下一条指令。所以跳转指令的偏移量与当前指令指针值相差5。
CurrentInstructionPointer = AddressOfJumpInstruction + 5
更新
更正了当前指令指针值的错误。谢谢jn。
关于C# 理论 : Write a JMP to a codecave in asm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/787006/