假设我已经使用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/

10-11 22:06