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

标签 linux x86 executable binaryfiles

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

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

最佳答案

如果删除一 block 二进制文件而不相应地调整文件头,它将变得无效。

幸运的是,您可以用 NOP 替换指令,而无需实际删除它们。文件大小保持不变,如果没有校验和或签名(或者没有实际检查),则无需执行任何操作。

没有通用的方法来插入指令,但通常您会使用 JMP 将原始代码覆盖到另一个位置,您可以在其中重现原始代码的功能,按照您的意愿做自己的事情,然后返回 JMP。在不更改二进制文件大小的情况下,为新代码找到空间可能是不可能的,因此我会在加载可执行文件后修补代码(可能使用特殊的LD_PRELOADed库)。

关于linux - 如何在 Linux 可执行文件中添加/删除 x86 指令而不破坏对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14903823/

相关文章:

AWS EC2 Linux AMI 上的 R & RStudio 安装 - R 的最新版本

linux - Gtk::MessageDialog Run 抛出段错误

asp.net - 通过非个性化从 .NET Web 应用程序启动流程

assembly - 如何读取 NASM 汇编程序 .lst 列表文件

assembly - 在 OoO 处理器中分别执行相同指令的操作

haskell - 我在哪里可以找到(并运行)用 cabal 沙箱编译的可执行文件?

php - 用php打开可执行文件

linux - 如何使 shell 脚本自动化并读取当前时间?

c - waitpid with execl used in child returns -1 with ECHILD?

assembly - x86 汇编语言中的函数调用