文章总结: 本文介绍DLLNotificationInjection技术,一种滥用WindowsLoader回调链表的threadless进程注入方法,通过将shellcode伪装成DLL加载通知回调,绕过EDR对传统四步法(开句柄、分配内存、写内存、建线程)的检测。文章详细解析了技术原理、回调链表位置、节点插入方法及递归崩溃解决方案,并提供了实战场景和防御建议。该技术强调无远程线程创建,行为更隐蔽,适合长期潜伏。 综合评分: 95 文章分类: 红队,渗透测试,免杀,安全工具,实战经验
DLL通知注入:让EDR的注入检测彻底失明
原创
星夜AI安全 星夜AI安全
星夜AI安全
2026年8月5日 11:14 吉林
在小说阅读器读本章
去阅读
🌈
ShorSec 公开的 DLL Notification Injection 是一种 threadless 进程注入技术,滥用 Windows Loader 的 LdrRegisterDllNotification 回调链表,把 shellcode 执行转嫁给远程进程的 DLL 加载事件,彻底绕开 EDR 对「开句柄+分配+写内存+建线程」四步法的检测。
一、技术全貌:这是什么?
2026 年的红队进程注入已经彻底告别了「分配内存 + 写 shellcode + 建远程线程」的老三样。EDR 厂商用几年时间把这套四步法训练成了通用行为规则——只要一个进程在短时间内连续做完 OpenProcess、VirtualAllocEx、WriteProcessMemory、CreateRemoteThread,基本就会被标红。
于是「无线程(threadless)注入」家族登场:
- ThreadlessInject(@CCob,BSides 演讲):把「执行」这一步从攻击进程转嫁给远程进程自身——hook 远程进程某个函数,等它自己调用时触发 shellcode。
- EPI(@Kudaes):篡改远程进程 PEB 里某个 DLL 的入口点,指向 shellcode,借 Windows Loader 调用 DLL 入口点的机制执行。
- DLL Notification Injection(ShorSec,已开源):滥用
LdrRegisterDllNotification回调链表,把 shellcode 伪装成一个「DLL 加载/卸载通知回调」,等远程进程自己加载 DLL 时,Loader 顺手就把我们的代码跑了。
三者是一个思路的三种实现:干掉四步法里最显眼的第四步(创建线程),让执行由目标进程自身的合法机制触发。本文聚焦第三种——它最「正统」,也最容易在真实环境落地,因为几乎所有进程都会周期性地加载 DLL。
二、为什么这个技术如此重要
传统 EDR 对注入的判定逻辑本质是「找四步法的组合」。哪怕你把内存分配藏得再深,只要最后 CreateRemoteThread 一出来,线程创建遥测就会亮。DLL Notification Injection 的狠处在于:
它根本没有远程线程创建这一步。 shellcode 的执行权,是 Windows Loader 在遍历 DLL 通知回调链表时「主动」交给我们的。对 EDR 而言,那只是一次再正常不过的 DLL 加载回调,没有任何 CreateRemoteThread、NtCreateThreadEx、QueueUserAPC 之类的典型痕迹。
更微妙的是:很多 EDR 自己也在用 LdrRegisterDllNotification 收集 DLL 加载遥测——攻击者甚至可以反过来 LdrUnregisterDllNotification 注销 EDR 的回调,削减它的可见性。这条技术路线直接把攻防拉到了「Loader 内部回调机制」这一层,比单纯的内存分配对抗更难检测。
三、技术原理解析
要点 1:回调链表藏在哪
LdrRegisterDllNotification 注册的回调,并不是孤立存在的,而是串在一个名为 LdrpDllNotificationList 的循环双向链表里。这个链表位于 ntdll.dll 的 .data 段,每个节点是一个 _LDR_DLL_NOTIFICATION_ENTRY:
typedef struct _LDR_DLL_NOTIFICATION_ENTRY {
LIST_ENTRY List; // 双向链表前后指针
PVOID Callback; // 回调函数地址(我们的目标)
PVOID Context;
} LDR_DLL_NOTIFICATION_ENTRY, *PLDR_DLL_NOTIFICATION_ENTRY;
当任意 DLL 被加载或卸载时,Windows Loader 会遍历这条链表,逐个调用 Callback。
要点 2:把伪造节点插进远程进程的链表
所有进程加载的是同一份 ntdll,因此 LdrpDllNotificationList 头相对 ntdll 基址的偏移是固定的。攻击流程:
// 1. 拿到远程进程 ntdll 基址(通过 PEB)
NtQueryInformationProcess(hProc, ProcessBasicInformation, &pbi, ...);
ReadProcessMemory(hProc, (PBYTE)pbi.PebBaseAddress + OFFSET_LDR, ...);
// 遍历 InLoadOrderModuleList 找到 ntdll.dll 的 DllBase
// 2. 在远程进程分配并写入 shellcode
LPVOID sc = VirtualAllocEx(hProc, NULL, scSize, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProc, sc, shellcode, scSize, NULL);
// 3. 构造伪造节点,Callback 指向 shellcode
LDR_DLL_NOTIFICATION_ENTRY entry = {0};
entry.Callback = sc;
entry.List.Blink = listHead; // 指向链表头
entry.List.Flink = originalFirst; // 指向原第一个节点
VirtualAllocEx + WriteProcessMemory 把 entry 写入远程进程
// 4. 改写链表指针,把 entry 插到头部
// listHead.Flink -> entry ; originalFirst.Blink -> entry
插入完成后,只要远程进程加载任意一个 DLL,Loader 就会调用我们的 Callback → 执行 shellcode。全程没有 CreateRemoteThread。
要点 3:解决递归崩溃(C2 专属坑)
如果 shellcode 是 C2 beacon,它本身加载 DLL(如 ws2_32、加密库)会再次触发回调,造成无限递归崩溃。ShorSec 的解法是 Trampoline:shellcode 入口先用 TpAllocWork / TpPostWork / TpReleaseWork(来自 ntdll 的线程池 API)把自己投递为一个线程池工作项,由其他线程执行真正的恶意逻辑,同时把自身节点从链表摘除,避免二次触发。
// shellcode 入口用线程池把工作转交其他线程,规避递归
TpAllocWork(&work, RealRoutine, Context, NULL);
TpPostWork(work);
TpReleaseWork(work);
四、实战应用场景
- 目标进程选择:必须挑「频繁加载/卸载 DLL」的进程,如
explorer.exe(约每 5 秒)、RuntimeBroker.exe(约每分钟)。目标不怎么加载 DLL,回调永远不触发。 - 无痕驻留:相比 APC 注入、进程镂空,本技术不创建远程线程、不挂起进程,行为画像更接近「合法 Loader 回调」,适合长期潜伏的横向移动。
- 组合拳:可先
LdrUnregisterDllNotification注销 EDR 的 DLL 遥测回调,再插入自己的节点,进一步压缩蓝队可见性。
五、防御对抗建议
- 监控回调链表:EDR 可挂钩
LdrRegisterDllNotification的内部实现,审计LdrpDllNotificationList中Callback指向「远程写入的可执行内存」的节点。 - 异常分配检测:
Callback指向的地址若带有PAGE_EXECUTE且来源是VirtualAllocEx+WriteProcessMemory的远程写入,应直接告警。 - 线程池异常:审计来自可疑内存区的
TpAllocWork/TpPostWork调用。 - 纵深防御:HVCI + 受控文件夹访问 + 驱动块列表仍是底线;本技术不依赖漏洞,但 Hook 摘除类对抗可被内核级保护缓解。
六、技术延伸阅读
- 完整 PoC(ShorSec):https://github.com/ShorSec/DllNotificationInjection[1]
- ThreadlessInject(@CCob):https://github.com/CCob/ThreadlessInject[2]
- EPI(@Kudaes):https://github.com/Kudaes/EPI[3]
- Shellcode 模板(Cracked5pider):https://github.com/Cracked5pider/ShellcodeTemplate[4]
- 注销 EDR DLL 通知回调(rad9800):https://github.com/rad9800/misc/blob/main/bypasses/UnregisterAllLdrRegisterDllNotification.c[5]
圈子介绍
现任职于某头部网络安全企业攻防研究部,核心红队成员。2021-2023年间累计参与40+场国家级、行业级攻防实战演练,精通漏洞挖掘、红蓝对抗策略制定、恶意代码分析、内网横向渗透及应急响应等技术领域。在多次大型演练中,主导突破多个高防护目标网络,曾获”最佳攻击手””突出贡献个人”等荣誉。
已产出的安全工具及成果包括:
- 多款主流杀软通杀工具(兼容卡巴斯基、诺顿、瑞星、360等终端防护,无感知运行,突破多引擎联合检测)
- XXByPassBehider v1.1 冰蝎免杀生成器(定制化冰蝎免杀工具,绕过主流终端防护与EDR动态检测,支持自定义载荷)
- 哥斯拉二开免杀定制版(二开优化,深度免杀,突破终端防护与EDR检测,适配多场景植入)
- NeoCS4.9终极版(高级免杀加载工具,强化载荷注入与进程劫持,适配多系统版本,无兼容问题)
- WinDump_免杀版(浏览器凭证窃取工具,支持Chrome/Edge/Firefox等主流浏览器,一键提取敏感数据,免杀过防护)_
- _DumpBrowser_V1_免杀版(浏览器凭证窃取工具,专攻浏览器密码、Cookie、历史记录提取,免杀性能拉满)
- fscan二开版(二开优化内网扫描工具,增强指纹精度、弱口令爆破与结果标准化输出,适配复杂内网)
- RingQ加载器二开版(二开优化免杀加载器,支持Shellcode内存执行,绕过各类终端防护与EDR检测)
- 多款免杀Webshell集合(覆盖PHP/JSP/ASPX,过主流WAF与终端防护,适配不同Web场景)
- 免杀360专属加载器(支持Shellcode内存执行,针对性绕过360全系防护检测,无感知运行)
- 一键Kill 火绒 defender 工具 HDKiller(包含源码)
- win11 一键kill 360工具 InjectKill(包含源码)
- win11 一键kill defender工具win11_df-killer(包含源码)
- 免杀火绒6.0内存防护加载器BypassMemLoader
- 单文件过360 免杀loader exe_bypass_360
- 单文件过火绒 df 免杀loader exe_bypass_df(包含源码)
- LNK钓鱼文件生成工具V1.0
- EXE捆绑启动器 v2.0
- 火绒6内存免杀加载器bypasshr6
- 火绒一键Kill专杀工具HRKiller
- Ring3 内存免杀工具Ring3bypasshr.exe
- win11 一键kill 360工具 Kill360_V2
- win11 一键kill 360工具 Kill360_V3.1
后续将不断更新到内部圈子中 欢迎加入圈子
引用链接
[1]https://github.com/ShorSec/DllNotificationInjection
[2]https://github.com/CCob/ThreadlessInject
[3]https://github.com/Kudaes/EPI
[4]https://github.com/Cracked5pider/ShellcodeTemplate
[5]https://github.com/rad9800/misc/blob/main/bypasses/UnregisterAllLdrRegisterDllNotification.c
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:星夜AI安全 星夜AI安全 星夜AI安全《DLL通知注入:让EDR的注入检测彻底失明》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。



![[SRC]某公司的存储桶信息泄露](/images/random/titlepic/10.jpg)




评论