我是二进制和汇编的新手,我很好奇如何直接编辑二进制可执行文件。我试图从二进制文件中删除一条指令(根据提供的反汇编指令objdump
),但在这样做之后,“可执行文件”似乎不再是可执行格式(运行时出现分段错误;gdb
无法识别)。我听说这是由于指令对齐问题。(是吗?)
那么,是否可以直接在 linux 可执行文件中添加/删除单个 x86 指令?如果是这样,怎么做?提前致谢。
我是二进制和汇编的新手,我很好奇如何直接编辑二进制可执行文件。我试图从二进制文件中删除一条指令(根据提供的反汇编指令objdump
),但在这样做之后,“可执行文件”似乎不再是可执行格式(运行时出现分段错误;gdb
无法识别)。我听说这是由于指令对齐问题。(是吗?)
那么,是否可以直接在 linux 可执行文件中添加/删除单个 x86 指令?如果是这样,怎么做?提前致谢。
如果您删除了一大块二进制文件而没有相应地调整文件头,它将变得无效。
NOP
幸运的是,您可以在不实际删除指令的情况下替换指令。文件大小保持不变,如果没有校验和或签名(或者如果没有实际检查),则无需执行更多操作。
插入指令没有通用的方法,但通常你用 a 覆盖原始代码 JMP
到另一个位置,在那里你复制原始代码所做的事情,按照你的意愿做你自己的事情,然后JMP
返回。如果不更改二进制文件的大小,可能无法为新代码找到空间,因此我会在加载可执行文件后修补代码(可能使用特殊的LD_PRELOAD
ed 库)。
是的。只需将其替换为NOP
指令 ( 0x90
) - 如果指令跨越多个字节,则将其替换为多个。这是一个老把戏。