你的电脑里,有个”内鬼”叫DLL—–DLL劫持学习

admin 2026-01-05 18:09:52 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文深入讲解WindowsDLL劫持原理,即利用系统搜索顺序漏洞让程序加载恶意DLL。介绍了DLL替换、代理转发、提权攻击及白加黑等攻击手法。结合ProcessMonitor和GoDhijacking工具演示了劫持缺失与存在DLL的实战过程。最后给出了开发者使用绝对路径与验签、用户规避破解软件及企业部署AppLocker等防御建议。 综合评分: 89 文章分类: 漏洞分析,内网渗透,免杀,二进制安全,终端安全


cover_image

你的电脑里,有个”内鬼”叫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劫持学习》

评论:0   参与:  0