我正在使用 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/