免责声明:
由于传播、利用本文所提及的技术信息而造成的任何直接或间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
项目地址:
https://github.com/Print3M/DllShimmer
DllShimmer 是一个能够自动化生成代理DLL的工具,对于从事安全研究或渗透测试的红队成员来说,它能有效简化DLL劫持或DLL侧加载的准备工作。它的核心工作逻辑非常清晰:
- 解析原始 DLL:工具首先分析目标DLL的导出地址表(EAT),提取所有导出函数的名称、序号以及转发信息。
- 生成 C++ 模板代码:基于提取的信息,DllShimmer会生成一个 .cpp 源文件。该文件为每个导出函数自动创建了一个“包装器”函数。
- 生成模块定义文件(.def):同时生成一个 .def 文件,确保编译后的代理DLL拥有与原始DLL完全一致的导出函数名和序号,这对劫持成功至关重要。
- 透明转发:在代理DLL中,所有未被用户修改的函数都会通过
LoadLibrary 和 GetProcAddress(动态链接)的方式,将调用请求透明地转发给真正的原始DLL,从而保持程序原有功能。
使用案例
假设我们需要对 C:\Windows\System32\version.dll 进行操作。首先,将其复制到一个工作目录中。

图1:将系统目录下的 version.dll 复制到工作环境
接下来,运行 DllShimmer 工具生成代理DLL的源代码项目。在工具所在目录下,先手动创建一个名为 project 的文件夹,然后执行以下命令:
DllShimmer.exe -i version.dll -o project/ -x "C:/Windows/System32/version.dll" -m
参数说明:
-i:指定原始 DLL 的路径。
-o:指定生成的源代码存放目录。
-x:指定代理 DLL 在目标系统上运行时,寻找原始 DLL 的绝对路径。
-m:启用互斥锁,确保我们插入的自定义代码只运行一次,避免重复执行。

图2:DllShimmer 成功生成项目文件
命令执行成功后,会在 project 目录下生成必要的源代码文件。此时,你只需打开生成的 .cpp 文件(例如 version.dll.cpp),在类似 // Put your code here... 的注释位置插入你的自定义逻辑(如记录日志、拦截特定函数调用等)。
插入代码后,使用 MinGW-w64 或 Visual Studio 等工具链进行编译,即可得到我们需要的代理DLL。

图3:生成的C++代码模板,其中包含转发逻辑和供用户插入代码的位置
通过这个流程,你可以快速构建一个功能完整的代理DLL,既能执行自定义操作,又能无缝转发其他所有函数调用到原始DLL,保证了程序的稳定性。想了解更多安全研究与逆向工程的实战技巧,欢迎在云栈社区交流讨论。
|