假设我已经使用VirtualAllocEx
分配了我的代码凹入的地址(它返回了地址),并且我使用WriteProcessMemory()
将代码写到了该地址中。
这是问题:
如何编写跳到我的代码凹腔的指令?我知道跳转以“E9
”开头,但是如何将VirtualAllocEx
返回的地址转换为正确的UInt32(双字),以便调试器/编译器可以理解该指令?
例如:
我在地址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/