AddExeImport – 将硬编码的 DLL 依赖项添加到任何 EXE

原文链接:https://www.x86matthew.com/view_post?id=add_exe_import

这个项目松散地基于我几个月前发布的另一个项目(ImportDLLInjection)。ImportDLLInjection 将在挂起状态下启动 EXE,修改内存中的 IAT 表以包含额外的 DLL,然后继续执行。这将导致注入我们的目标 DLL 文件。

在此项目中,我们将使用类似的概念来修改磁盘上的 EXE 文件,以添加额外的 DLL 导入条目。这比修改内存中的 PE 标头稍微复杂一些,因为我们需要在向标头添加额外条目的同时维护 EXE 文件的原始结构。

此方法可能对持久性有用 – 例如,如果系统已经在启动时运行特定进程(abc.exe),我们可以修改此EXE以在后台自动加载DLL。

如上一篇文章所述,IAT 表中的 DLL 条目需要导入至少一个函数。我们将再次使用序数 #1。IAT 表也将重新定位到文件末尾,因为现有标头中不太可能有足够的空间来添加额外的 DLL。

我还首次为此项目添加了 64 位支持。此工具可以编译为 32/64 位,默认情况下,它将同时适用于这两种体系结构。

此工具的工作原理如下:

1.将原始EXE文件加载到内存中。
2. 检查 EXE 是 32 位还是 64 位 – 这很重要,因为 NT 标头的长度不同。
3. 从IMAGE_DIRECTORY_ENTRY_IMPORT数据目录中查找原始导入表位置。
4. 将导入表位置从虚拟地址转换为文件指针 – 我创建了一个函数来自动执行此操作,称为 VirtualAddressToFilePtr
5. 获取原始导入表的副本并将其存储在内存中。
6. 创建此导入表的克隆版本,并为我们的新 DLL 文件添加一个额外的条目。
7. 创建一个空白的 EXE 输出文件。
8. 将原始 EXE 文件的内容写入新的输出文件(直到最后一节的末尾)。
9. 将新的扩展 IAT 表附加到新的 EXE 文件(紧跟在最后一节之后)。
10. 更新IMAGE_DIRECTORY_ENTRY_IMPORT目录以指向新的 IAT 表。
11. 增加上一节的 SizeOfRawData 和 VirtualSize 字段,以确保新的 IAT 表正确加载到内存中。磁盘上的分区数据必须与 pImageNtHeader->OptionalHeader.FileAlignment 的值对齐,因此此处可能需要额外的填充。
12. 检查原始 EXE 中在最后一个标头之后是否存在任何剩余数据。调试符号和嵌入文件通常附加到EXE文件的末尾 – 这些不是EXE格式的一部分,因此默认情况下它们不会加载到内存中。如有必要,pImageNtHeader->FileHeader.PointerToSymbolTable 值将更新为指向正确的位置,尽管这些值不太可能存在于生产软件中。

完整代码如下:

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部