如何在Linux可执行文件中添加/删除x86指令而不破坏对齐

时间:2013-02-15 21:45:09

标签: linux x86 executable binaryfiles

我是二元和汇编的新手,我很好奇如何直接编辑二进制可执行文件。我试图从二进制文件中删除指令(根据objdump提供的反汇编指令),但在执行此操作后,“可执行文件”似乎不再是可执行格式(运行时出现分段错误; gdb无法识别)。我听说这是由于指令对齐问题。 (是吗?)

那么,是否可以直接在Linux可执行文件中添加/删除单个x86指令?如果是这样,怎么样?提前谢谢。

2 个答案:

答案 0 :(得分:3)

如果删除了一大块二进制文件而没有相应地调整文件头,它将变为无效。

幸运的是,您可以使用NOP替换说明,而无需实际删除它们。文件大小保持不变,如果没有校验和或签名(或者如果没有实际检查),则无需再做任何事情。

没有通用的方法来插入说明,但通常会用JMP覆盖原始代码到另一个位置,在那里您可以重现原始代码的功能,根据需要自行执行操作,然后{ {1}}回来。如果不改变二进制文件的大小,可能无法为新代码找到空间,所以我会在加载可执行文件后修补代码(可能使用特殊的JMP ed库)。

答案 1 :(得分:1)

是。只需用NOP指令(0x90)替换它 - 或者如果指令跨越多个字节则用多个指令替换它。这是一个老技巧。