我是新来的二进制和汇编程序,我很好奇如何直接编辑二进制可执行文件。我尝试从二进制文件中删除指令(根据objdump
提供的反汇编指令),但在执行该操作后,“可执行文件”似乎不再是可执行格式(运行时出现分段错误; gdb
无法识别)。我听说这是由于指令对齐问题。 (是吗?)如何在不破坏对齐的情况下在linux可执行文件中添加/删除x86指令
那么,是否可以直接在linux可执行文件中添加/删除单个x86指令?如果是这样,怎么样?提前致谢。
我是新来的二进制和汇编程序,我很好奇如何直接编辑二进制可执行文件。我尝试从二进制文件中删除指令(根据objdump
提供的反汇编指令),但在执行该操作后,“可执行文件”似乎不再是可执行格式(运行时出现分段错误; gdb
无法识别)。我听说这是由于指令对齐问题。 (是吗?)如何在不破坏对齐的情况下在linux可执行文件中添加/删除x86指令
那么,是否可以直接在linux可执行文件中添加/删除单个x86指令?如果是这样,怎么样?提前致谢。
如果您删除了一大块二进制文件而没有相应地调整文件标头,它将会失效。
幸运的是,您可以用NOP
取代指示而不实际删除它们。文件大小保持不变,如果没有校验和或签名(或者如果没有真正检查),则没有其他要做的事情。
有插入的指令没有普遍的方式,但一般你覆盖了JMP
原代码到另一个位置,在那里你重现一下原来的代码没有,做自己的事情,你想要的,然后JMP
回来。在不改变二进制文件的大小的情况下寻找新代码的空间可能是不可能的,所以我会在加载可执行文件后修补代码(可能使用特殊的库)。
是的。如果指令跨越多个字节,只需用NOP
指令(0x90
)替换它即可。这是一个古老的伎俩。
你为什么要问?为什么不能改变汇编器或可重定位对象的'.o'文件呢? – 2013-02-16 08:23:59
@BasileStarynkevitch为什么我不能问?对你来说不感兴趣的东西可能会吸引其他人。而且,没有什么东西总是无用的。 – 4ae1e1 2013-02-16 20:14:37
如果我们明白你真正想要做什么(即你要问的原因),我们可以建议更好或更简单的解决方案。我发现在Linux上更改ELF可执行文件的原因很少(特别是如果它们是免费软件,更改源代码更容易)。 – 2013-02-16 20:33:08