是否可以替换ELF文件中的非代码段?如果是这样,那又如何?在将字节简单地替换为其他字节(当然不会更大)之前,我是否需要考虑一些事项?

请注意,我对修改代码不感兴趣,因此“什么是可用于静态修改ELF可执行文件的库”中提供的解决方案?这不是我想要的,很多解决方案都不是与体系结构无关的。 vmlinux.64]也是ELF文件,请参见https://unix.stackexchange.com/q/342298/117599。这里的问题应该更笼统。)

#1 楼

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


替换(修补)代码(指令)时,您需要注意可能的重定位,该重定位指向要替换的地址范围(如果文件可重定位)。加载程序将应用重定位,而不检查它们是否有意义,这很可能使您的代码无法正常工作或崩溃。同样的问题也适用于可能被重定位的数据(例如指针表)。
即使您要替换的数据不受加载程序的影响,也可能以其他方式使用它。对于您的initrd示例,内核中的代码引用了诸如__initramfs_start__initramfs_end之类的符号,可能需要更新其值以适应新的initrd大小。如何做到这一点取决于代码如何使用这些符号:它们是从ELF符号表中获取还是仅嵌入代码中(即在链接时已解析)?在后一种情况下,您需要在二进制文件中查找并修补这些值,请记住它们可能是虚拟加载时地址,而不是文件偏移量。
如果代码使用的是ELF部分,则将需要更新节标题以正确指向您的数据或调整其大小e(某些十六进制编辑器允许您编辑ELF标题的字段,但在最坏的情况下,您需要通过修补单个字节来手动完成)。