修补(合并)两个不同的二进制文件 (x86 PE) 时修复 IAT 和重定位的最佳方法



第一个 - 你好,谢谢你阅读这篇文章,

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

我用 C 语言编写了另一个 DLL 来实现所有这些需要的功能 - 使用 Visual Studio。

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

可能正在目标 DLL 上创建一个新的 PE 部分,并将我编造的 dll 中的所有代码/数据/rdata 放在那里。问题是我需要以某种方式修复相对于目标 DLL 上这个新插入的代码的 IAT 和重定位。

我的问题是:

最好的方法是什么?

如果Visual Studio想出一个仅使用(大部分)相对寻址进行构建的选项,那就太好了 - 这将在处理重新定位时为我节省很多。我想我可以将所有变量和常量封装到一个结构中,希望 MSVC 只需要重新定位这个"容器"结构的地址并使用相对寻址来访问其成员。但不知道这是否是个好主意。

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

我的最后一个选择是手动完成所有操作,手动编辑十六进制二进制文件......我真的不想这样做,因为对于每个 IAT 条目和重新定位条目都需要一些时间。前段时间我已经写了一个PE文件加密器,所以我知道大多数内部工作原理并且知道它可以完成,只是想知道你的想法,也许已经存在一个工具可以帮助我?

任何建议都非常感谢!

再次感谢您抽出宝贵时间阅读本文!

既然您正在征求建议,请查看非常好的便携式可执行文件格式 – 逆向工程查看 PDF 文档。"向 PE 文件添加代码"部分介绍了一些技术(并介绍了工具),通过操作 IAT 表和节表,将代码添加到现有 PE 映像,而无需目标映像的代码(你的方案)。

最新更新