替换 ELF 文件中的部分

逆向工程 文件格式 小精灵 部分
2021-06-22 08:53:48

是否可以替换 ELF 文件中的非代码部分?如果是,那又如何?在简单地用其他一些字节替换字节(当然没有什么更大的)之前,我需要考虑什么吗?也许一些哈希或类似的?

请注意,我对修改代码不感兴趣,因此在什么是静态修改 ELF 可执行文件的可用库?不是我正在寻找的,还有许多解决方案与架构无关。

(顺便说一句,我需要这个来替换嵌入到内核映像 [ vmlinux.64] 中的 initrd/initramfs 文件系统,内核映像也是一个 ELF 文件,请参阅https://unix.stackexchange.com/q/342298/117599。这个问题在这里应该更一般。)

1个回答

我不知道有任何现成的工具可以用于此类任务,但我怀疑在大多数情况下,好人dd会完成替换文件中实际字节的任务(或者您也可以进行objcopy工作)。更困难的是使代码与更改后的数据一起工作。这取决于相关数据的性质。例如:

  1. 替换(修补)代码(指令)时,您需要注意可能的重定位指向您要替换的地址范围(如果文件可重定位)。加载器将应用重定位而不检查它们是否有意义,这可能会使您的代码工作不正确或崩溃。同样的问题适用于可能被重新定位的数据(例如指针表)。

  2. 即使您要替换的数据不受加载程序的影响,它也可能以其他方式使用。对于您的 initrd 示例,内核中的代码引用了诸如__initramfs_start, 之类的符号__initramfs_end,其值可能需要更新以适应新的 initrd 大小。如何做到这一点取决于代码如何使用这些符号:它们是从 ELF 符号表中获取的还是只是嵌入在代码中(即在链接时解析)?在后一种情况下,您需要在二进制文件中查找并修补这些值,请记住它们可能是虚拟加载时地址而不是文件偏移量。

  3. 如果代码使用 ELF 部分,您将需要更新部分标题以正确指向您的数据或调整它们的大小 e(一些十六进制编辑器允许您编辑 ELF 标题的字段,但在最坏的情况下,您将需要通过修补单个字节手动完成)。