macos - 向 x86-64 二进制文件写入跳转命令

标签 macos assembly x86-64 patch

我正在使用 GDB 调试 Mac OS X 64 位应用程序。我看到跳过一大块代码解决了我所有的问题。

但是:

如何给可执行文件打补丁实现跳转?我希望应用程序在没有调试器的情况下自动跳转到代码中定义的点。

这就是我想要做的:

在地址 0x1000027a9(由调试器给出)跳转到地址 0x100003b6e。 我正在非常努力地通过 HexEdit 来完成它,但没有成功。我在任何地方都读过关于 jmp 到绝对地址操作码的信息(FF 似乎是正确的操作码,但它是一个调用,而不是一个跳转......)但没有任何效果。访问错误,段错误。

我该怎么做?

最佳答案

你想要的不是call,而是jmp,而且你想要的是直接的jmp。直接跳转通常使用相对于下一条指令地址的寻址(参见 my answer to SO question: How encode a relative short jmp in x86 )。相对于跳转指令的结尾是另一种看待它的方式。

所以,您在 0x1000027a9 并想跳转到 0x100003b6e

0x100003b6e - 0x1000027a9 = 0x000013C5 = 5061d,因此绝对不适合短跳(英特尔文档中的 rel8),但您需要 jmp rel32。它也适用于 rel16,但在 x86-64(64 位模式)中不受支持。

所以,您需要一个jmp rel32。这是相对于 jmp 之后的下一条指令编码的,并且由于指令的长度为 5 个字节 (E9 xx xx xx xx), rel32 将是 0x000013C0。由于 x86 是小端架构,它被编码为 E9 C0 13 00 00

为了证实这一点,我用 NASM 组装了一个小的测试可执行文件并用 ndisasm 反汇编它(注意我先离开了 0x10000000 字节,但由于跳转是相对的,它不会改变任何东西编码):

000027A8  90                nop
000027A9  E9C0130000        jmp dword 0x3b6e ; this is the instruction you need.
000027AE  90                nop

关于macos - 向 x86-64 二进制文件写入跳转命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14921735/

相关文章:

python - 如何在 OSX 上恢复默认的 python 安装?

linux - NASM scanf 未定义引用 (LINUX)

c - C 中 fgetc() 函数的行为

c - C中是否有旋转操作

assembly - 如何重新编程我的 shellcode 片段以避免空字节?

xcode - 检查服务菜单中的服务是否可用

r - 安装 rgdal 时遇到问题

macos - applicationDidBecomeActive 在 OSX 应用程序中不会触发

c - 为什么右移 64 位是恒等式而不是幂零(返回 0)?

linux - 为什么系统调用号在 amd64 linux 中不同?