C# 理论:将 JMP 写入 asm 中的 codecave

2023-11-23

假设我已经使用以下命令分配了放置我的 codecave 的地址VirtualAllocEx(它返回地址),我使用以下命令将代码写入该地址WriteProcessMemory().

这是问题:

如何编写跳转到我的 Codecave 的跳转?我知道跳跃开始于“E9",但是如何转换返回的地址VirtualAllocEx转换为正确的 UInt32 (双字)以便调试器/编译器能够理解该指令?

例如:

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

CPU Disasm
Address   Hex dump      Command                                  Comments
00402020  E9 AA080000   JMP 004028CF

"E9“是我们表示 JMP 的方式。那么”AA080000“,我如何生成这个?

我需要做类似的事情,这样我就可以将 JMP 初始化到我的 codecave,它将位于由VirtualAllocEx().

任何帮助将不胜感激!

提前致谢。


E9 是相对跳转,因此后面的 32 位只是当前指令指针的偏移量。看英特尔® 64 和 IA-32 架构软件开发人员手册第 2A 卷:指令集参考,A-M详情请参阅第 549 页。欲了解更多信息,请参阅英特尔® 64 和 IA-32 架构软件开发人员手册.

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



    E9  00 00 08 AA
  
Offset   = DestinationAddress - CurrentInstructionPointer
000008AA = 004028CF           - 00402025

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

CurrentInstructionPointer = AddressOfJumpInstruction + 5

UPDATE

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 理论:将 JMP 写入 asm 中的 codecave 的相关文章

随机推荐

  • “RxSwift”倒计时器

    我需要一个三十秒计时器RxSwift 这是一个重复的问题 但问题没有明确的答案 现有答案的更好方法 let countDown 15 15 seconds Observable
  • C++ 在派生类中初始化基类的 const int?

    我的基类中有一个常量 int 变量 我想在派生类中初始化响应变量 并使用不同的值 作为参数 这可能吗 这就是我所做的 Base h methods implemented in Base cpp in the actual code cla
  • hadoop 块丢失异常

    我收到以下错误 Diagnostics org apache hadoop hdfs BlockMissingException Could not obtain block BP 467931813 10 3 20 155 1514489
  • 请求安装包

    状态 已批准 但存在问题 需要采取进一步行动 我们发现您的应用存在问题 您需要按照如下所述进行检查并采取措施 以便您的应用将来不会受到影响 发现的问题 权限的使用与应用程序的核心目的没有直接关系 我们发现您的应用不符合 REQUEST IN
  • 使用 Kustomize 在 kubernetes 清单中修补列表

    我想修补 覆盖 list in 库伯内特斯体现为定制化 我正在使用 patchStrategicMerge 方法 当我修补不在列表中的参数时 修补会按预期工作 仅替换 patch yaml 中的已寻址参数 其余部分保持不变 当我修补列表时
  • SAX解析——获取文本节点的高效方法

    给定这个 XML 片段
  • JsonNullable 没有与 Jackson 序列化其值

    我正在尝试使用JsonNullable
  • .NET core 将命令行参数从 Program.cs 传递到 Startup.cs

    我正在尝试配置 kestrel 以便当它处于原始模式时它可以在特定端口上运行 然而 要做到这一点 launchsettings json 似乎需要传递命令行参数来执行此操作 因为没有直接选项 并且它始终在端口 5000 上运行 如果您有需要
  • 使用 Node.js 和 WebSocket 传输二进制文件

    我已经在谷歌上搜索这个并在 stackoverflow 上搜索了一段时间 但还没有找到解决方案 因此发表了这篇文章 出于好奇 我正在尝试使用 Node js 和 WebSockets 我正在尝试将一些二进制数据 mp3 传输到客户端 到目前
  • PHP读取cookie文件

    是否有任何帮助程序库可以读取 php ini 中的 cookie 文件 我的本地磁盘上有一个 cookie 文件 我想要一种更好的方式来读取它 我目前只是按行读取文件并解析出值 如果您打算阅读 Netscape 的格式 例如 curl 以这
  • 在调用堆栈中显示特殊的原始函数

    这个问题提示如下问题 有没有办法查看特殊原语调用堆栈中的函数 例如 创建一个在退出时返回调用堆栈的函数 myFun lt function obj on exit print sys calls return obj 调用此函数并将其结果分
  • 领域驱动设计自动递增实体键

    刚开始领域驱动设计 我了解到您应该使模型保持有效状态 并且在创建类的新实例时 建议将所有必需的属性作为构造函数参数 但是 当使用自动递增键时 当我从持久层调用 Add 方法时 我只会获得这个新 ID 如果我在没有密钥的情况下实例化我的对象
  • 捕获重复键插入异常

    我有一个带有唯一主键列的表 称为id 有时当我执行INSERT查询我收到错误 因为id值已被使用 我可以捕获这个特定错误吗try and catch 看起来 mysql 正在为重复的主键抛出 1062 错误代码 您可以检查 sql 异常的错
  • Angular 2,使用 href='#' 处理锚链接

    单击任何带有href Angular 路由器路径 path component NologinComponent pathMatch full 是匹配的 我应该如何处理这些锚链接以便锚与href 停留在同一页面 即什么都不做 锚标记示例 a
  • 是否可以在 Azure 应用服务上安装字体?

    我们正在使用 MigraDoc PDFsharp GDI 它依赖于将字体安装到系统中以便进行渲染 我们尝试过嵌入字体 但 MigraDoc 的 GDI 版本似乎不支持此功能 尝试将此组件移动到 Azure 应用服务时 它找不到字体 有没有办
  • 如何在 PyCharm 的运行/调试配置中将环境变量作为命令行参数传递?

    我正在尝试学习 PyCharm 需要将环境变量作为命令行参数传递给我的进程 例如执行相当于myScript py u myVar在 Linux 上 或者myScript py u myVar 在 Windows 上 如何在 PyCharm
  • 如果从静态构造函数启动并等待空的 .NET 任务,为什么不会完成?

    我不明白为什么下面的代码不起作用 var task new Task gt task Start if task Wait 10000 logger Info Works else logger Info Doesn t work 超时后
  • UIBarButtonItem 图标通过 IB 添加时为白色,以编程方式添加时为黑色

    当我将图标添加到UIBarButtonItem通过 Interface Builder 该图标显示为白色 当我以编程方式将相同的图标文件添加到另一个图标文件时UIToolbar 图标显示为黑色 为什么 UIImage image UIIma
  • Tesseract OCR:是否可以强制使用特定模式?

    我正在使用 Tesseract 我想开发一个能够识别字符序列的应用程序 我取得了不错的成绩 但并不出色 我想读取的字符序列有always一个特定的模式 比方说 数字数字数字字符字符 例如 123AB 有没有办法 告诉 ocr引擎结构始终是固
  • C# 理论:将 JMP 写入 asm 中的 codecave

    假设我已经使用以下命令分配了放置我的 codecave 的地址VirtualAllocEx 它返回地址 我使用以下命令将代码写入该地址WriteProcessMemory 这是问题 如何编写跳转到我的 Codecave 的跳转 我知道跳跃开