我正在尝试修改我自己的 ELF 文件的可执行内容,看看这是否可行。我编写了一个程序,它读取和解析 ELF 文件,搜索它应该更新的代码,对其进行更改,然后在更新节标题中的 sh_size 字段后将其写回。
但是,这不起作用。如果我只是用其他字节交换一些字节,它就可以工作。但是,如果我更改大小,它会失败。我知道一些 sh_offsets 是直接相邻的;但是,当我减小可执行代码的大小时,这无关紧要。
当然,我的程序中可能存在一个错误(或多个),但我已经煞费苦心地完成了它。
除了寻求帮助来调试我的程序,我只是想知道,除了我需要更新的 sh_size 字段之外,还有什么其他的东西需要更新才能使这项工作(减小大小时)?除了该字段之外,还有什么会导致更改长度失败的吗?
编辑:
看来安迪·罗斯是完全正确的。即使在这个非常简单的程序中,我也遇到了 __libc_start_main 中的一些间接寻址,我无法轻易修改它来更新它将达到的偏移量。
不过我很好奇,仍然试图尽可能解决这个问题的最佳方法是什么?我知道我不能在每种情况下都解决这个问题,但是对于一些简单的程序,应该可以更新使其运行所需的内容?我应该尝试编写自己的虚拟机还是尝试开发一个“调试器”,用 INT 3 替换每个可疑的问题指令?有任何想法吗?