2

首先 - 您好,感谢您阅读本文,

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

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

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

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

我的问题是:

最好的方法是什么?

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

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

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

任何建议都非常感谢!

再次感谢您花时间阅读本文!

4

1 回答 1

0

由于您正在寻求建议,请查看非常好的PORTABLE EXECUTABLE FILE FORMAT – A REVERSE ENGINEER VIEW PDF Document。“将代码添加到 PE 文件”一节描述了一些技术(并提供了工具),通过操作 IAT 表和 Sections 表,将代码添加到现有 PE 映像而无需目标映像(您的场景)的代码。

于 2012-06-13T05:32:36.310 回答