文章总结: 本文分析DDE回调劫持这一进程注入技术,利用explorer.exe托管的DDE服务中可写的pfnCallback函数指针,通过改写该指针并触发DDE事务实现代码执行。该技术源自2019年odzhan的BreakingBaDDEr研究,目标基本限于explorer.exe,需一定权限且EDR可观测。防御建议包括最小权限原则、代码完整性策略及EDR行为监控。 综合评分: 85 文章分类: 恶意软件,漏洞分析,红队,内网渗透,安全运营
DDE 回调劫持:一个藏在 explorer.exe 里的进程注入 primitive
Ots安全
2026年9月29日 13:20 广东
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
威胁简报
恶意软件
漏洞攻击
一、开篇:一个被遗忘的 IPC 机制,成了注入的跳板
当你以为进程注入离不开 CreateRemoteThread、WriteProcessMemory 这种“标准动作”时,Windows 上一个年头不小的进程间通信(IPC)机制——动态数据交换(DDE)——却悄悄留了一扇后门。
explorer.exe 在后台默默托管着 DDE 服务。这套服务为每个 DDE 会话在用户态堆上分配一个结构体,并把结构体地址挂在窗口的“额外字节”里。更关键的是,这个结构体里有一个可写的函数指针 pfnCallback。一旦它被改写,再随便触发一次 DDE 事务,目标进程就会“主动”调用攻击者的代码。
这不是新发现。它的公开出处可以追溯到 2019 年 odzhan(modexp)发布的 “Breaking BaDDEr” 研究,原理与近期社区讨论的 WDML_INSTANCE 中 PFNCALLBACK 可写性完全一致。本文带你把它拆透。
二、背景:DDE 与 DDEML 到底是什么
DDE(Dynamic Data Exchange,动态数据交换) 是 Windows 早期用于应用程序之间共享数据的协议;DDEML(DDE Management Library) 则是封装这套协议的库,让开发者用更友好的 API 来收发数据。
DDE 真正“出圈”是在 2017 年 10 月:微软 Office 被曝可通过 DDE 公式执行命令(安全公告 4053440)。此后 Office 默认禁用了 DDE,它不再被视为关键风险面。但 DDEML 本身仍由系统组件(如 shell32.dll)在 explorer.exe 中提供 DDE 服务,这成了少数仍存活的注入面。
在 Windows 10 上,真正提供 DDE 服务的 DLL 屈指可数:shell32.dll、ieframe.dll、twain_32.dll。其中 shell32.dll 会创建三个 DDE 服务,宿主就是 explorer.exe。换句话说,这套注入技术的天然目标,基本就是 explorer.exe。
三、核心原理:那个“可写的函数指针”
DDEML 在初始化时(user32!DdeInitializeW)会在堆上分配一个未公开文档化的结构体——各研究里叫 CL_INSTANCE_INFO(modexp)或 WDML_INSTANCE(社区新近命名),两者指向同一类结构。我们关心的字段只有一个:pfnCallback。
这个结构体的地址,被存放在 DDE 服务“母窗口”的**窗口额外字节(Extra Window Memory, EWM)**里。在 user32 中,该母窗口的类名是 DDEMLMom。只要拿到这个窗口句柄,就能用 GetWindowLongPtr(hwnd, GWLP_INSTANCE_INFO) 跨进程读回结构体地址——而窗口额外字节本来就是设计为跨进程可读的。
于是整个脆弱性链条就清晰了:
DDEMLMom 隐藏窗口 → EWM 存结构地址(跨进程可读)→ 结构内含可写的
pfnCallback→ 覆盖它并触发 DDE 事务 → 代码在explorer.exe中执行。
四、注入五步详解(逻辑骨架)
下面给出已公开研究(Breaking BaDDEr)中描述的技术流程骨架。此处仅以 API 序列呈现原理,不构成可运行的武器化实现;完整源码已在作者公开仓库中,本文不做搬运与拼接。
① 定位窗口
通过窗口类名 DDEMLMom 找到 explorer.exe 托管的 DDE 母窗口。
② 读取结构地址
用 GetWindowLongPtr(hwnd, GWLP_INSTANCE_INFO) 取回 CL_INSTANCE_INFO 的用户态地址;再用 GetWindowThreadProcessId 取得宿主进程 PID。
③ 在目标进程分配并写入 payload
以 OpenProcess 打开 explorer.exe,VirtualAllocEx 在其地址空间分配一块 PAGE_EXECUTE_READWRITE(RWX)内存,并用 WriteProcessMemory 写入 shellcode。
④ 劫持回调指针
再次用 WriteProcessMemory,仅覆盖结构体中 pfnCallback 字段,使其指向刚写入的 payload 地址。
⑤ 触发执行并清理
调用 DdeInitialize / DdeConnectList 触发一次 DDE 事务——DDEML 会像往常一样回调 pfnCallback,于是 payload 在 explorer.exe 上下文里运行。执行完后,把原始 pfnCallback 写回、释放内存、关闭句柄,痕迹被抹平。
注意第 ⑤ 步的“隐身”本质:代码是被 explorer.exe自己调用的,全程没有 CreateRemoteThread、QueueUserAPC 这类特征鲜明的注入 API,因此单纯监控“建远程线程”的防御规则会直接漏掉它。
五、范围与限制:它并非无所不能
必须客观地说,这项技术的实战天花板并不高:
-
目标受限
:DDE 服务主要由
explorer.exe托管,注入面基本锁定在它身上,无法随意挑选高权限进程(除非该进程本身提供 DDE 服务)。 -
需要一定权限
:攻击者进程必须能
OpenProcess到explorer.exe并写其内存——在严格的权限隔离与代码完整性策略下会受到制约。 -
残留可见性
:RWX 内存分配、
explorer.exe执行非预期可执行内存等行为,仍会被现代 EDR 的行为监控捕获。 -
历史包袱
:自 2017 年 Office DDE 事件后,DDE 在很多场景已被默认禁用,现实攻击面进一步收窄。
所以它的研究价值不在于“多么犀利”,而在于提醒我们:遗留的 IPC 机制里,往往藏着被忽视的可写 primitive——防御侧如果只盯着“标准”注入 API,就会留出盲区。
六、检测与防御
蓝队可监控的异常行为:
-
跨进程写入
DDEMLMom窗口额外字节; -
explorer.exe中出现异常的 RWX 内存分配;
-
可疑的
DdeConnectList/DdeInitialize调用(尤其是无对应业务背景时); -
explorer.exe执行非预期的可执行内存页;
-
CL_INSTANCE_INFO内容被异常改写。
缓解措施:
-
最小权限原则(PoLP)
:收紧进程间写权限,降低低权限代码改写高信任进程结构的能力;
-
代码完整性策略(WDAC / AppLocker)
:限制未签名/未授权代码的加载与执行;
-
漏洞利用防护
:启用 CFG(控制流防护)、DEP,提高劫持控制流的难度;
-
EDR / XDR 行为监控
:对跨进程写窗口字节、异常 RWX 分配等做行为级告警与阻断;
-
及时打补丁
:Office DDE 已默认禁用,保持系统更新以收缩现实攻击面。
七、真实性核实
-
技术真实性
:核心机制(
DDEMLMom窗口、GWLP_INSTANCE_INFO取结构地址、CL_INSTANCE_INFO/WDML_INSTANCE中可写的pfnCallback、用 DDE 事务触发回调)与 odzhan(modexp)2019 年公开研究 “Windows Process Injection: Breaking BaDDEr”(modexp.wordpress.com,2019-08-09)完全一致;近期安全社区(LinkedIn 等)关于WDML_INSTANCE.PFNCALLBACK可写性的讨论亦印证同一 primitive。 -
源头核实
:本文编译自 Medium 用户
jaytiwari05的同名技术博客《DDE Callback Hijacking — A Process Injection Technique》。Medium 页面为 JS 渲染,正文未能直接抓取,故以公开权威来源(Breaking BaDDEr)交叉核实技术细节,未对原文做无依据的增补。 -
限制说明
:该注入面的现实影响受“目标基本限于 explorer.exe、需相应进程权限、EDR 可观测”等因素制约,不宜夸大其威胁等级。
参考地址
-
Medium 原文
:https://medium.com/@jaytiwari05/dde-callback-hijacking-a-process-injection-technique-768ad16b1379
-
modexp《Windows Process Injection: Breaking BaDDEr》(2019-08-09)
:https://modexp.wordpress.com/2019/08/09/windows-process-injection-breaking-badder/
-
odzhan 公开 PoC 源码(GitHub)
:https://github.com/odzhan/injection/tree/master/dde
-
MITRE ATT&CK T1055 Process Injection
:https://attack.mitre.org/techniques/T1055/
-
MITRE ATT&CK T1559.002 Inter-Process Communication: DDE
:https://attack.mitre.org/techniques/T1559/002/
-
微软安全公告 4053440(Office DDE 命令执行,防御规避更新)
:https://msrc.microsoft.com/update-guide/
END
公众号内容都来自国外等平台- 搜索的内容通过结合编写 –
公众号 | AnQuan7 (Ots安全)
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:Ots安全 《DDE 回调劫持:一个藏在 explorer.exe 里的进程注入 primitive》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论