微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何修改一个ELF文件,改变文件的部分数据长度?

我试图修改我自己的ELF文件的可执行内容,看看这是否可能。 我已经编写了一个程序,用于读取和分析ELF文件,search应更新的代码,更改它,然后在更新节标题中的sh_size字段之后将其写回。

但是,这是行不通的。 如果我只是交换一些字节,其他字节,它的工作原理。 但是,如果我改变大小,它会失败。 我知道一些sh_offset是紧邻的, 但是,当我缩小可执行代码的大小时,这应该不重要。

当然,我的程序中可能有一个错误(或多个错误),但我已经精心的经历过了。

我只是想知道,除了需要更新的sh_size字段以使其工作(在缩小尺寸时)还有其他事情吗?而不是寻求帮助来debugging我的程序。 除了那个领域,有什么能够改变长度的吗?

为了获得ELF二进制文件的大小,size和ls有什么区别?

dladdr不会返回函数名称

在Linux上制作可移植的专有ELF二进制文件

.got和.got.plt部分有什么区别?

奇怪的ELF二进制

编辑:

安迪·罗斯似乎是完全正确的。 即使在这个非常简单的程序中,我在__libc_start_main中遇到了一些间接寻址,我无法修改它来更新它将到达的偏移量。

我很好奇,那么最好的办法还是尽量争取这个问题呢? 我知道在任何情况下我都无法解决这个问题,但对于一些简单的程序,应该可以更新运行所需的内容。 我应该尝试编写自己的虚拟机,还是尝试开发一个“debugging器”,用INT 3replace每个可疑的问题指令? 有任何想法吗?

是否有可能检查ELF可执行文件的“GNU_HASH”部分中的散列?

.text段地址范围的位置独立可执行文件

为什么ELF头文件与文本段一起被加载到内存中?

.so在linux下注入:如何查找dlopen()的地址?

将运行Linux进程的内存地址范围转换为目标文件中的符号?

文本段可能在内部与相对偏移链接。 所以一个函数可能试图跳转到“当前地址加上194个字节”。 如果你移动的东西,使跳转目标现在是190字节,你很明显会破坏的东西。 在某些体系结构(例如x86-64,而不是i686)上的常量数据也是如此。 没有一个简单的方法来完成反汇编,以知道内部引用的位置,事实上,找到它们(即试图找出运行时计算分支的所有可能的跳转目标是停机问题)在计算上是不可靠的。

基本上这在一般情况下是不能解决的,所以如果你从别人那里得到一个ELF二进制文件,你就需要尝试其他技术。 但是用(很棒的)注意,可以生成一个库,所有的内部参考都可以通过GOT / plt进行切片和重新链接。 你想达到什么目的?

除了需要更新的sh_size字段,还有其他什么东西才能完成这个工作

这听起来像是在修补一个全连接的二进制文件( ET_EXEC或ET_DYN )。 请注意,静态链接完成后.sh_size 不用于任何事情。 您可以剥离整个部分表格,二进制文件将继续正常工作。 在运行时重要的是ELF中的段 ,而不是段 。

ELF代表可执行和链接格式,ELF的可执行和链接形式是“双重性质”。 在(静态) 链接时段使用段来组合段; 在执行时使用(又称运行时,又名动态链接时间)。

当然你还没有告诉我们你的补丁策略是什么,当你缩小你的二进制文件,结果是以什么方式被破坏的。 安迪·罗斯的回答很有可能是你破产的真正原因。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐