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