You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止DLL自动加载未使用的Windows标准附属DLL?

阻止DLL注入时不必要系统DLL自动加载的方案

你观察到的未调用函数却连带加载额外系统DLL的现象,本质是DLL的PE导入表携带了默认依赖项,Windows加载器在映射你的DLL到进程空间时,会递归加载导入表中列出的所有依赖DLL,和你是否实际调用对应函数没有关系。

行业内通用的成熟方案按落地成本从低到高排列如下:

  • 编译链接选项裁剪(最推荐,无侵入性)
    这是常规开发场景下的标准做法,不需要修改业务代码逻辑,也不需要手动复制宏定义:
    1. 裁剪Win32头文件引入范围:在包含windows.h之前先定义WIN32_LEAN_AND_MEAN宏,同时按需定义NOGDI、NOUSER、NOMSG、NOCLIPBOARD等裁剪宏,阻止头文件默认引入你不需要的API声明和隐式链接依赖,不需要完全放弃引入windows.h。
    2. 调整编译链接参数:MSVC环境下添加编译选项/GS- /Zl,链接选项/NODEFAULTLIB,手动指定仅链接你实际需要的最小系统库(绝大多数场景下仅需要kernel32.lib即可满足基础注入逻辑需求),去掉默认链接的advapi32.lib、user32.lib、gdi32.lib等非必要库。
    3. 启用延迟加载:对所有非核心依赖的系统DLL添加/DELAYLOAD:xxx.dll链接选项,被标记为延迟加载的DLL不会在DLL初始化阶段被自动加载,只有你实际调用到对应DLL的导出函数时才会触发加载,完全不会产生无意义的加载行为。
    4. 关闭非必要编译特性:关闭C++异常、RTTI、默认manifest绑定的通用控件兼容层等特性,这类特性会隐式引入combase.dll、uxtheme.dll等非必要依赖。
  • 自定义最小PE结构(极致精简场景用)
    如果是做注入载荷、对依赖数量有极致要求,可以采用逆向/安全领域的通用做法:不使用编译器默认的DLL入口模板,自行编写极简DLL入口点,手动构造PE头和导入表,仅保留kernel32.dll中LoadLibraryA、GetProcAddress两个核心函数的导入项,其余所有需要的API全部在DLL初始化阶段通过这两个函数手动解析获取。这种方案编译出的DLL可以做到仅依赖kernel32.dll,不会加载任何额外系统DLL,整体体积可以控制在几KB级别。

注意:不要尝试在DllMain中调用FreeLibrary卸载自动加载的多余DLL,这种做法违反Windows加载器锁的使用规范,极易触发注入目标进程崩溃,属于明确的不安全行为。

注入后加载的额外DLL截图

内容的提问来源于stack exchange,提问作者ScienceDiscoverer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 17:27:27