C#理论:将一个JMP写入asm中的编解码器

Iva*_*nov 6 c# assembly codecave

让我们假设我已经分配了我的编解码器使用VirtualAllocEx的地址(它返回地址),并使用我的代码将代码写入该地址WriteProcessMemory().

这是问题:

如何写一个跳转到我的编解码器?我知道跳转以" E9" 开头,但是如何将返回的地址VirtualAllocEx转换为正确的UInt32(dword),以便调试器/编译器能够理解指令?

例如:

我在地址00402020(原生应用程序的OEP).我写了一个跳转到004028CF(空地方)" JMP 004028CF".以字节为单位的指令如下所示:

CPU Disasm
Address   Hex dump      Command                                  Comments
00402020  E9 AA080000   JMP 004028CF
Run Code Online (Sandbox Code Playgroud)

" E9"是我们如何表明JMP.怎么样" AA080000",我该如何生成呢?

我需要做类似的事情,所以我可以将JMP初始化为我的codecave,它将位于返回的地址VirtualAllocEx().

任何帮助将不胜感激!

提前致谢.

Dan*_*ner 4

E9 是相对跳转,因此后面的 32 位只是当前指令指针的偏移量。有关详细信息,请参阅Intel\xc2\xae 64 和 IA-32 架构软件开发人员\xe2\x80\x99s 手册第 2A 卷:指令集参考,AM 第549ff 页。有关详细信息,请参阅Intel\xc2\xae 64 和 IA-32 架构软件开发人员手册

\n\n

因此从 00402020 跳转到 004028CF 的操作码应该如下。

\n\n
\n E9 00 00 08 AA\n
\n\n
Offset   = DestinationAddress - CurrentInstructionPointer\n000008AA = 004028CF           - 00402025\n
Run Code Online (Sandbox Code Playgroud)\n\n

当执行跳转指令时,指令指针已经指向下一条指令。所以跳转指令的偏移量与当前指令指针值相差5。

\n\n
CurrentInstructionPointer = AddressOfJumpInstruction + 5\n
Run Code Online (Sandbox Code Playgroud)\n\n

更新

\n\n

更正了有关当前指令指针值的错误。谢谢jn。

\n