
“图标喷射器”(Icon Dropper)是一种利用 Windows 系统“更改图标”对话框进行 DLL 注入的攻击技术,能够将恶意代码加载到资源管理器(explorer.exe)进程中。
除了常见的函数库功能,DLL 文件也常用于存储图标等资源。在系统中查看文件夹或文件的属性时,默认图标通常来自 shell32.dll。

实际上,在现代 Windows 版本中,这些图标资源更多存储在 shell32.dll.mui 这类资源文件中,但系统界面仍会将其显示为来自 shell32.dll。
为了让资源管理器进程能在“更改图标”对话框中完整显示某个 DLL文件 内存储的所有图标,它必须先将该 DLL 加载到自身进程的内存空间中进行解析。
关键点在于,Windows 系统中的 DLL 可以定义一个可选的 DllMain 函数。当使用 LoadLibrary 或 FreeLibrary 函数加载或卸载 DLL 时,系统会自动调用此函数。这意味着攻击者可以将任意代码写入 DllMain,一旦资源管理器加载了此DLL,代码便在其进程上下文中执行。
以下是一个典型的 DllMain 函数框架:
BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // handle to DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpvReserved ) // reserved
{
// 根据调用原因执行相应操作
switch( fdwReason )
{
case DLL_PROCESS_ATTACH:
// 为新进程初始化
// 返回 FALSE 会导致 DLL 加载失败
break;
case DLL_THREAD_ATTACH:
// 执行线程特定的初始化
break;
case DLL_THREAD_DETACH:
// 执行线程特定的清理
break;
case DLL_PROCESS_DETACH:
if (lpvReserved != nullptr)
{
break; // 进程终止场景下不执行清理
}
// 执行必要的清理工作
break;
}
return TRUE; // 成功完成 DLL_PROCESS_ATTACH
}
在此攻击演示中,攻击者正是利用了这一点。他们将一个能打开计算器程序(calc.exe)的 DLL 文件,通过 Resource Hacker 或 Visual Studio 等工具添加了一个图标资源,并将其文件扩展名伪装成了 .ico。

在文件夹视图中,此类伪装文件的图标显示可能异常。测试发现,在部分 Windows 10 版本中,当 DLL 扩展名被改为 .ico 后,其内部存储的图标可能无法正常显示。
以编程方式实现自动注入
除了诱骗用户手动在属性对话框中加载恶意 DLL,攻击者还可以通过编程方式自动化完成整个进程注入过程:
- 弹出属性窗口:在临时目录创建一个文件夹,然后使用
SHObjectProperties API 自动打开该文件夹的“属性”对话框。为了跨语言获取此窗口句柄,可以使用 EnumWindows 函数配合回调函数,遍历所有窗口并识别出标题包含该文件夹名称的属性窗口。
- 导航至图标页:通过获取的属性窗口句柄,进一步触发并定位到“更改图标”子对话框,同样使用
EnumWindows 来获取其窗口句柄。
- 触发加载:将对话框中的图标路径设置为恶意 DLL 文件(伪装成
.ico),然后模拟点击“确定”按钮。这一操作会促使资源管理器立即加载并解析该 DLL,从而执行其中的 DllMain 代码。

这是一种相对隐蔽的 DLL 注入方式,因为它没有直接调用 CreateRemoteThread、SetWindowsHookEx 等常见的注入 API。虽然过程中会短暂弹出两个窗口,但不太引人注意。攻击者可能利用此技术绕过某些安全软件的检测,通过合法的资源管理器进程执行恶意代码,甚至加载内核级 rootkit。
此外,将恶意 DLL 伪装成 .ico 图标文件进行传播,也为 安全研究 和攻击防御提供了新的思考维度。
|