DLL通知注入:让EDR的注入检测彻底失明

admin 2026-08-08 07:06:20 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文介绍DLLNotificationInjection技术,一种滥用WindowsLoader回调链表的threadless进程注入方法,通过将shellcode伪装成DLL加载通知回调,绕过EDR对传统四步法(开句柄、分配内存、写内存、建线程)的检测。文章详细解析了技术原理、回调链表位置、节点插入方法及递归崩溃解决方案,并提供了实战场景和防御建议。该技术强调无远程线程创建,行为更隐蔽,适合长期潜伏。 综合评分: 95 文章分类: 红队,渗透测试,免杀,安全工具,实战经验


cover_image

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 加载回调,没有任何 CreateRemoteThreadNtCreateThreadExQueueUserAPC 之类的典型痕迹。

更微妙的是:很多 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 的内部实现,审计 LdrpDllNotificationListCallback 指向「远程写入的可执行内存」的节点。
  • 异常分配检测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的注入检测彻底失明》

评论:0   参与:  0