C# 理论 : Write a JMP to a codecave in asm

标签 c# assembly codecave

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

相关文章:

c# - 将复选框设置为只读

c# - 目标确实存在时出现 StyleCop CA0055 问题

assembly - 什么是代码洞,代码洞有合法用途吗?

assembly - 从中断返回(RTI)和从子程序返回(RTS)之间的区别

linux - GCC 错误消息 "Error: unsupported for ` mov'"是什么意思?

c++ - 使用注入(inject)的 DLL 从远程进程调用函数

c# - 激活隐藏进程的窗口

c# - 无法访问添加到类库中的新类

C - 通过 assembly 制作观察点