ELF重定位反向工程

3
我希望您能帮助我了解重定位条目和ELF部分数据之间的关系,以及它们是如何处理和生成的。
我有一个古老的不支持工具,可以使用ELF文件和相关的PLF文件(在先前的构建过程中生成)构建自定义可重定位文件,该文件用于具有紧密内存限制的平台(PPC)。这很好用,但它包含约1兆字节的初始化代码,我们想要在启动后卸载它。因此,我们将所有的初始化代码放在自定义节中以便卸载它,但不幸的是,该工具无法正确处理自定义节,因此rel文件无效。所以我的任务是开发一个新工具,正确生成包含自定义节的可重定位文件。
我已经在开发这个工具方面做得相当好,并生成了rel文件,但目前正陷入困境,试图弄清楚如何处理部分数据并构建重定位条目等。作为一名高级程序员,这项任务使我感到非常不适应,所以这些反向工程的业务对我来说都是新的领域(谢天谢地有互联网!)。
我找到了Elf Sharp,并以此作为起点。它允许我加载ELF和PLF文件,并与它们的内容交互。从那里开始,我逆向工程了重定位文件的头和内容,但仍远未准确。当我将旧工具版本的文件与我的文件进行比较时,我发现一些部分数据已被修复,而我的文件使用直接从PLF文件中复制的部分数据并且是空的。我的意思是我复制过来的节数据包含大量的“48 00 00 01”,但这些在旧工具中都被修复了。这些字节的意义是什么,以及正在做什么?我还必须生成重定位条目,但不确定如何继续。
我在网上找到了一些处理elf重定位的示例,并且我在我的工具中有类似的东西正在运行,但我仍然对我应该做什么不太清楚。我有关于所有重定位类型及其公式的良好资源(第4.12.5章此处),但我仍然不确定该使用哪些偏移量、部分信息等。
  • 您能帮我想象一下这些重定位条目到底发生了什么,它是如何生成和处理的,以及在程序执行时如何使用吗?

  • 对于部分数据中的所有“48 00 00 01”单词已经做了什么?我假设它们已经使用适当的符号解析,但是这是如何完成的?使用.rela信息吗?

  • 此外,我不确定何时应该使用PLF内容,何时应该使用ELF内容。我认为我只需要ELF来获取加载地址和段信息。

  • 当我生成重定位修复(在PPC上)时,我应该如何评估重定位类型方程式?我在线上参考的示例在这一点上并不直观。我对偏移量感到困惑-您可以从Elf32_Rela中获得一个偏移量,但这是您修改的那个吗?用于记录修复结果的偏移量是什么?到底什么是加数?我没有找到任何有启示性的在线资料。

  • 一些(实际上大多数)重定位修复指向若干个.debug_*部分或.bss。我应该跳过.debug修复还是这些很重要?.bss是一个NoBits部分,那我该如何处理?当涉及到实际生成重定位条目时,我了解它们是如何构造的,但是背后是谁/什么在制作这些条目呢?我的意思是,我准备构建它,但是我不知道从哪里开始-我需要遍历某些数据还是什么?

  • 是否还有其他问题我应该问但尚未意识到?;)

感谢您阅读我冗长的问题!


由于我没有足够的声望来发布超过两个链接,这里是我提到的两个示例:示例1:http://publib.boulder.ibm.com/infocenter/zos/v1r12/index.jsp?topic=%2Fcom.ibm.zos.r12.cbcdu01%2Fexrelocateelffile.htm示例2:http://people.freebsd.org/~grehan/elf_machdep.c - thehelix
可能是“重定位”的重复问题 Concept of relocation在这里有一个最小的反向工程示例:https://dev59.com/WGct5IYBdhLWcg3wZcmL#30507725 || https://github.com/cirosantilli/assembly-cheat/blob/9f1be213107922ac21681305440dc5d1799407e5/elf-hello-world.md - Ciro Santilli OurBigBook.com
1个回答

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接