如何从ELF二进制文件中删除程序头

我想编写一个实用程序来从ELF二进制文件中删除程序头.例如,当我运行readelf -l / my / elf时,我得到了所有程序头的列表:PHDR INTERP … GNU_STACK GNU_RELRO.当我运行我的实用程序时,我希望以相同的顺序返回所有相同的程序头,减去我删除的那个.有没有比从头开始重新创建整个ELF更简单的方法,跳过不需要的标题? 最佳答案

Is there any easier way to do this than recreated the entire ELF from scratch

当然:程序头在ehdr.e_phoff给出的偏移量处形成一个固定记录表,其中包含.e_phentsize字节的.e_phnum条目.

要删除一个条目,只需将其余条目复制到其上,然后递减.e_phnum.这里的所有都是它的.

注意:删除一些条目可能会导致动态加载程序崩溃. GNU_STACK是唯一可以删除而没有太多伤害的标题(我能想到).

更新:

是的,将.p_type设置为PT_NULL是另一种(并且更简单)的方法.但是通常不会出现这样的条目,并且您可能会发现一些系统,其中PT_NULL将在加载器(或某些其他程序)中触发断言.

最后,添加一个新的Phdr可能会很棘手.通常没有空间来扩展表(因为它后面紧跟着一些其他数据,例如.text).您可以将表重定位到文件的末尾,并将.e_phoff和.e_phnum设置为与新表对应,但是许多程序希望在运行时加载并提供整个Phdr表,这不容易安排,因为任何PT_LOAD段都不会“覆盖”文件末尾的新位置.

点赞