写跳转命令到x86-64的二进制文件(Write a jump command to a x86-6

2019-08-17 00:14发布

我调试用GDB的是Mac OS X 64位应用程序。 我看到,在跳跃的代码块解决了我的所有问题。

但:

我怎样才能修补可执行文件来实现跳跃? 我想要的应用程序来自动跳转到一个定义点代码没有调试器。

这就是我想做的事:

在地址0x1000027a9 (调试器给出)跳到解决0x100003b6e 。 我非常努力通过hexedit的做到这一点,但没有成功。 我随时随地了解JMP到绝对地址的操作码( FF似乎是正确的操作码,但它是一个电话,而不是跳转...),但没有任何工程。 坏访问,段错误。

我怎样才能做到这一点?

Answer 1:

你想要的是不是一个call ,但jmp ,你想直接jmp 。 直接跳转通常使用相对于下一条指令的地址寻址(请参阅我的回答SO问题:如何在编码的x86相对短JMP )。 相对于外部指令的结束是另一种方式来看待它。

所以,你在0x1000027a9 ,想跳到0x100003b6e

0x100003b6e - 0x1000027a9 = 0x000013C5 = 5061d ,以便明确不适合在很短的跳跃( rel8英特尔文档中),但你需要jmp rel32 。 这将适合rel16过,但不是在x86-64的支持(在64位模式下)。

所以,你想有一个jmp rel32 。 这是相对于后下一个指令编码的jmp ,并作为指令的长度为5个字节( E9 xx xx xx xx ), rel320x000013C0 。 由于86是小端架构,它被编码为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


文章来源: Write a jump command to a x86-64 binary file