我调试用GDB的是Mac OS X 64位应用程序。 我看到,在跳跃的代码块解决了我的所有问题。
但:
我怎样才能修补可执行文件来实现跳跃? 我想要的应用程序来自动跳转到一个定义点代码没有调试器。
这就是我想做的事:
在地址0x1000027a9
(调试器给出)跳到解决0x100003b6e
。 我非常努力通过hexedit的做到这一点,但没有成功。 我随时随地了解JMP到绝对地址的操作码( FF
似乎是正确的操作码,但它是一个电话,而不是跳转...),但没有任何工程。 坏访问,段错误。
我怎样才能做到这一点?
你想要的是不是一个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
), rel32
将0x000013C0
。 由于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