Compiler construction 如何扩展ELF二进制文件

Compiler construction 如何扩展ELF二进制文件,compiler-construction,linker,binary,elf,Compiler Construction,Linker,Binary,Elf,我正在写一个小的仪器工具。我必须在二进制文件中插入插装例程。一个好的方法应该是在一个单独的代码段和一个单独的数据段中插入这些例程,您能解释一下如何实现这一点吗?此外,如何修改原始文件中代码段的大小 最好的 我必须在二进制文件中插入插装例程。一个好的方法应该是将这些例程插入一个单独的代码段和一个单独的数据段中 什么是二进制文件?对可撤销(ET_REL)对象文件执行此操作与对完全链接的可执行文件(ET_EXEC)或共享库(ET_DYN)执行此操作有很大区别 你能解释一下如何做到这一点吗 对于ET\u

我正在写一个小的仪器工具。我必须在二进制文件中插入插装例程。一个好的方法应该是在一个单独的代码段和一个单独的数据段中插入这些例程,您能解释一下如何实现这一点吗?此外,如何修改原始文件中代码段的大小

最好的

我必须在二进制文件中插入插装例程。一个好的方法应该是将这些例程插入一个单独的代码段和一个单独的数据段中

什么是二进制文件?对可撤销(
ET_REL
)对象文件执行此操作与对完全链接的可执行文件(
ET_EXEC
)或共享库(
ET_DYN
)执行此操作有很大区别

你能解释一下如何做到这一点吗

对于
ET\u REL
,它应该是相当直接的:您读取文件头,它指向节头,它告诉您
.data
.text
节在哪里。然后编写一个新文件,扩展所需的节,复制所有其他内容,并调整节标题以反映新的节偏移量和大小


对于
ET_DYN
ET_EXEC
,问题很可能太难解决:您需要调整重定位表、哈希表、程序头;保持所有结构的自一致性和正确对齐。

在Shaun Clowes的黑帽演示中,Shaun采取了两种策略来修改ELF可执行文件:

  • 在文件修补程序中-通过扩展段进行修补

  • 内核补丁(动态)-利用内存空间实现 由于段对齐,因此可用


它被称为“Black Hat USA 2002-修复/制作二进制文件中的漏洞”(Youtube)

为什么不在运行时使用插入来完成这项工作
LD\u预加载
在Linux上,DYLD\u插入库在OSX上,等等。工作正常。