文章总结: 本文深入讲解WindowsDLL劫持原理,即利用系统搜索顺序漏洞让程序加载恶意DLL。介绍了DLL替换、代理转发、提权攻击及白加黑等攻击手法。结合ProcessMonitor和GoDhijacking工具演示了劫持缺失与存在DLL的实战过程。最后给出了开发者使用绝对路径与验签、用户规避破解软件及企业部署AppLocker等防御建议。 综合评分: 89 文章分类: 漏洞分析,内网渗透,免杀,二进制安全,终端安全
你的电脑里,有个”内鬼”叫DLL—–DLL劫持学习
原创
Faithtiann
SEVENTEENSEC
2026年1月4日 15:47 上海
点击蓝字 关注我们
SEVENTEENSEC
声明
⊙本文作者:Faithtiann
⊙本文字数:1846
⊙阅读时长:约12分钟
注:本文仅供安全研究与学习之用,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,由使用者承担全部法律及连带责任,作者及发布者不承担任何法律及连带责任
什么是DLL劫持
想了解什么是DLL劫持,先得了解下什么是DLL
DLL(Dynamic Link Library)是Windows系统的动态链接库,相当于程序的”共享工具箱”。
核心特征:
模块化:将常用功能(如弹窗、网络、图像处理)封装成独立文件
共享性:多个程序可共用同一个DLL,避免重复造轮子
动态加载:程序运行时按需加载,而非编译时固化
典型例子:当你在微信里点击图片放大,它调用的其实是系统的shimgvw.dll;QQ也是如此。所有软件共享这一个模块,无需各自实现。
那什么是DLL劫持呢?
一句话定义: 攻击者利用Windows”找文件”的算法漏洞,让程序”认错人”,加载恶意DLL。
Windows的”寻物算法”(漏洞根源)
当程序需要helper.dll时,Windows按固定顺序搜索:
1.程序所在目录
2.程序加载目录(SetCurrentDirectory)
3.系统目录即 SYSTEM32 目录
4.16位系统目录即 SYSTEM 目录
5.Windows目录
6.PATH环境变量中列出的目录
劫持的本质:”狸猫换太子”
攻击者制作一个同名恶意DLL,提前放在软件的安装目录。程序启动时,Windows会”偷懒”先查当前目录,优先加载恶意DLL。
恶意DLL的”演技”:
先执行病毒代码(偷密码、弹广告、挖矿)
再转发调用到真正的系统DLL,避免程序崩溃
整个过程用户毫无察觉
Know DLLs保护机制:注册表
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\KnownDLLs
Know DLLs注册表项里的DLL列表在应用程序运行后就已经加入到了内核空间中,多个进程共用这些模块,必须具有非常高的权限才能修改。路径中列出的38个核心DLL(如kernel32.dll、user32.dll)禁止劫持,系统启动时加载到内核空间。
如何进行DLL劫持
如何进行DLL劫持?
方式1:DLL替换(最粗暴)
直接将恶意DLL命名为目标DLL,放在程序目录。
局限:若程序校验哈希值会失败,但90%的程序不校验。
方式2:DLL代理/转发(最隐蔽)
恶意DLL完整实现原DLL的所有导出函数,内部再调用真DLL。
代码模板:
// 恶意DLL的入口BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason) {if (reason == DLL_PROCESS_ATTACH) {// 1. 先干坏事StealPasswords();InstallBackdoor();// 2. 再加载真DLLLoadLibrary("C:\\Windows\\System32\\real.dll");}return TRUE;}
方式3:提权攻击(最危险)
场景:针对以SYSTEM权限运行的服务程序(如打印机服务、更新服务)
步骤:
监控:用Process Monitor发现服务加载了哪些DLL
定位:找到服务目录中不存在的DLL(”幻影DLL”)
植入:将恶意DLL放到服务目录,重启服务
提权:恶意代码以SYSTEM权限执行,获得系统最高控制权
真实案例:某杀毒软件的自动更新服务存在DLL劫持漏洞,攻击者植入恶意DLL后,杀毒软件自身成了木马载体。
方式4:白+黑组合(APT常用)
白程序:带数字签名的合法程序(如微软工具)
黑DLL:恶意DLL放在同目录
优势:白程序被信任,可绕过杀毒软件;黑DLL继承其权限
DLL劫持实操
本文做下简单的DLL劫持操作
工具准备
Process Monitor
https://learn.microsoft.com/en-us/sysinternals/downloads/procmon
visual studio 官网下载
GoDhijacking
https://github.com/m7rick/GoDhijacking
一、劫持没有的Dll
打开Process Monitor 点击筛选
设置过滤条件
此处的path为安装包所在路径
双击打开程序
查看点击安装包启动时,加载的dll情况
找一个有loadlibrary相关API的dll,比如这个SHFOLDER.DLL,双击打开
这里简单说一下,为什么要找Loadlibrary相关的DLL
如果该DLL的调用栈中存在有 LoadLibrary(Ex),说明这个DLL是被进程所动态加载的。在这种利用场景下,伪造的DLL文件不需要存在任何导出函数即可被成功加载
LoadLibrary与LoadLibraryEx的区别
若DLL不在调用方的同一目录下,可以用LoadLibrary(L”DLL绝对路径”)加载。但若被调DLL内部又调用另外一个DLL,此时调用仍会失败。解决办法是用LoadLibraryEx:
LoadLibraryEx("DLL绝对路径", NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
通过指定
LOAD_WITH_ALTERED_SEARCH_PATH
让系统DLL搜索顺序从DLL所在目录开始
打开visual studio,编译恶意的dll文件,重命名为SHFOLDER.DLL
将恶意程序放到与劫持程序同一路径下
双击被劫持的程序打开,可以看到劫持成功
二、劫持存在的DLL
这里使用一个工具GoDhijacking检测
下载地址
https://github.com/m7rick/GoDHijacking
查看用法
检测安装路径下存在问题的dll
GoDHijack_x64.exe find -p path
生成劫持模版
GoDHijack_x64.exe generate -f X:\XXXXX\libcurl.dll -m cpp -i true
编译生成恶意dll
劫持成功
总结
一、核心逻辑链
Windows的”就近原则”搜索算法
↓
程序使用相对路径加载DLL
↓
攻击者提前放置同名恶意DLL
↓
程序”认错人”加载恶意代码
↓
用户毫不知情,电脑已沦陷
二、防御口诀
开发者:
三必须:必须用绝对路径、必须验签名、必须清搜索路径
一禁止:禁止用LoadLibrary(“name.dll”)裸加载
普通用户:
不下载”绿色版”、”破解版”软件
不乱装”DLL修复工具”
定期用Process Monitor检查异常DLL加载
企业用户:
部署AppLocker,禁止非System32目录的DLL加载
对高权限进程进行DLL劫持专项扫描
参考资料
https://mp.weixin.qq.com/s/rSlssJd8F–MGBoQ6PpgUA
END
01
AI渗透测试框架使用
02
Frida App测试(android)
03
CodeBuddy Code使用
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:SEVENTEENSEC Faithtiann《你的电脑里,有个”内鬼”叫DLL—–DLL劫持学习》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论