首先 - 您好,感谢您阅读本文,
我有一个 DLL,我没有源代码,但需要在其中添加一些功能。
我使用 Visual Studio 编写了另一个用 C 语言实现所有这些所需功能的 DLL。
现在我需要将这个新 DLL 生成的代码插入到目标 DLL 中(必须在文件级别完成{而不是在运行时})。
我可能正在目标 DLL 上创建一个新的 PE 部分,并将我制作的 dll 中的所有代码/数据/rdata 放在那里。问题是我需要以某种方式修复 IAT 和相对于目标 DLL 上新插入的代码的重定位。
我的问题是:
最好的方法是什么?
如果 Visual Studio 能提供一个选项来仅使用(大部分)相对寻址进行构建,那就太好了——这在处理重定位时会为我节省很多。我想我可以将我所有的变量和常量封装到一个结构中,希望 MSVC 只需要重新定位这个“容器”结构的地址并使用相对寻址来访问它的成员。但不知道这是不是一个好主意。
我什至可以通过创建一个函数指针来进一步摆脱 IAT,该函数指针将动态加载所需的功能模块(一种延迟加载模块)。再一次,把这个函数指针放在我之前说的“容器”结构中。
我的最后一个选择是手工制作,手动编辑十六进制的二进制文件......我真的不想这样做,因为每个 IAT 条目和 reloc 条目都需要一些好时间来完成. 前段时间我已经编写了一个 PE 文件加密器,所以我知道大部分内部工作原理并且知道它可以完成,只是想知道你的想法,也许已经存在一个工具来帮助我?
任何建议都非常感谢!
再次感谢您花时间阅读本文!