首先 - 您好,感谢您阅读本文,
我有一个DLL,我没有源代码,但需要在其中添加一些功能。
我使用Visual Studio构建了另一个在C中实现所有这些所需功能的DLL。
现在我需要将生成的代码从这个新DLL插入到目标DLL中(它必须在文件级别{不在运行时}完成}。
我可能在目标DLL上创建了一个新的PE部分,并将所有代码/数据/ rdata放在我编写的dll中。问题是我需要以某种方式修复相对于目标DLL上的这个新插入代码的IAT和reloc。
我的问题是:
最好的方法是什么?
如果Visual Studio提供了一个仅使用(大部分)相对寻址构建的选项,这将是很好的 - 这将在处理relocs时节省很多。 我想我可以将所有变量和常量封装到一个结构中,希望MSVC只需要重新定位这个“容器”结构的地址并使用相对寻址来访问它的成员。但不知道这是不是一个好主意。
我甚至可以通过制作一个动态加载所需功能模块(延迟加载模块的种类)的函数指针来摆脱IAT。再次,将此函数指针放在我之前说过的“容器”结构中。
我的最后一个选项是手动完成所有操作,手动编辑十六进制的二进制文件...我真的不想这样做,因为每个IAT条目都需要一些时间来完成它和重新进入。我前段时间已经编写了一个PE文件加密器,所以我知道大部分内部工作并知道它可以完成,只是想知道你的想法,也许已经存在一个工具来帮助我了?
非常感谢任何建议!
再次感谢您抽出时间阅读本文!
答案 0 :(得分:0)
既然您正在寻求建议,请查看非常好的PORTABLE EXECUTABLE FILE FORMAT – A REVERSE ENGINEER VIEW PDF Document。 “将代码添加到PE文件”一节描述了一些技术(并提供了工具),通过操作IAT表和Sections表,将代码添加到现有PE映像而不需要目标映像的代码(您的场景)。