修补(合并)两个不同的二进制文件(x86 PE)时修复IAT和relocs的最佳方法是什么?

问题描述:

先 - 您好,感谢您阅读本文,修补(合并)两个不同的二进制文件(x86 PE)时修复IAT和relocs的最佳方法是什么?

我有一个DLL,我没有源代码但需要添加一些功能。

我用C语言编写了另一个在C中实现所有这些所需功能的DLL。

现在我需要将生成的代码从这个新的DLL插入到目标DLL中(它必须在文件级{不在运行时})完成。

我可能在目标DLL上创建一个新的PE部分,并把所有的代码/数据/ rdata从我组成的。问题是我需要以某种方式修复相对于目标DLL上新插入代码的IAT和relocs。

我的问题是:

什么是最好的办法呢?

如果Visual Studio想出了一个只使用(主要是)相对寻址的选项 - 这在处理relocs时会节省很多。 我想我可以将所有的变量和常量封装到一个结构中,希望MSVC只需要重新定位这个“容器”结构的地址并使用相对寻址来访问它的成员。但不知道这是不是一个好主意。

我甚至可以通过制作一个动态加载所需功能模块(延迟加载模块的种类)的函数指针来摆脱IAT。再次,把这个函数指针放在我之前说过的“容器”结构中。

我拥有的最后一个选项是手工完成,手动编辑十六进制的二进制文件......我真的不想这样做,因为每个IAT都需要一些时间才能完成条目和reloc条目。我前一段时间已经写过一个PE文件加密器,所以我知道大部分内部工作原理,并且知道它可以完成,只是想知道你的想法,也许有一种工具可以帮助我解决问题。

任何建议,高度赞赏!

再次感谢您的阅读时间!

既然您在寻求建议,请看看非常好的PORTABLE EXECUTABLE FILE FORMAT – A REVERSE ENGINEER VIEW PDF Document。 “向PE文件添加代码”部分介绍了一些通过操作IAT表和Sections表将代码添加到现有PE映像而不具有目标映像代码(您的场景)的一些技术。

+0

谢谢你的回复。 这对IAT有很大的帮助,但是仍然没有找到一个处理reloc的好方法,我猜我必须编写一个小工具来自动化修复! – user1036015