《利用SetWinEventHook进行DLL注入-R3层终止杀软进程》
前言
欧克啊,也是好久没有写文章发公众号了,主播最近忙着在秋招找工作呢,当然更多的也是在摸鱼。同时也不知道写什么,因为翻来覆去自己也没有找到什么比较分享的东西,与其输出同质化的东西,不如选择自己摸鱼先爽一下。
起因
《Windows Internals 第 7 版,第 1 部分》的合著者、以及《Windows Native API 编程》一书的作者帕维尔·约西福维奇,又为现有的注入技术列表添加了一项
这项技术利用了 SetWinEventHook 这个 API 来实现,该 API 原本是用于实现无障碍功能的。它的使用方式与 SetWindowsHookEx 类似:你无需手动向目标进程写入任何数据。只需注册一些用户界面事件,将 DLL 交给 Windows 系统,系统会自动将该 DLL 加载到触发这些事件的进程中。
简单介绍
SetWinEventHook 原本是辅助功能(Accessibility) API,屏幕阅读器用它订阅 UI 事件。
但当它和 WINEVENT_INCONTEXT 标志、一个 DLL 模块一起使用时,就变成了一种 DLL 注入手段:
- 注入器不打开目标进程句柄,不写内存,不创建远程线程;
- 只需要把 DLL 在自己进程里
LoadLibrary一次,拿到模块句柄和导出函数地址; - 剩下的加载和执行,由 user32 自己在目标进程里完成;
- 触发条件是:目标进程自己的线程产生一个 UI 事件。
WinEvent 是什么
Windows 的 UI(窗口、菜单、控件)发生变化时,user32 会产生“WinEvent”,例如:
| 事件 | 值 | 含义 |
|---|---|---|
EVENT_SYSTEM_FOREGROUND |
0x0003 | 前台窗口切换 |
EVENT_OBJECT_CREATE |
0x8000 | 对象创建 |
EVENT_OBJECT_SHOW |
0x8002 | 对象显示 |
EVENT_OBJECT_HIDE |
0x8003 | 对象隐藏 |
EVENT_OBJECT_LOCATIONCHANGE |
0x800B | 位置/大小变化 |
EVENT_OBJECT_NAMECHANGE |
0x800C | 名称/标题变化 |
这些事件是通过 NotifyWinEvent 从用户态线程发出的,屏幕阅读器、自动化工具靠订阅它们
来感知界面变化。
SetWinEventHook 的两种投递方式
1 | |
关键只有 dwFlags 一个参数:*
| 模式 | 行为 | 是否注入 |
|---|---|---|
WINEVENT_OUTOFCONTEXT |
事件被编组回调用进程,通过隐藏窗口 + 消息队列投递。调用线程必须有消息泵(GetMessage + DispatchMessage) |
❌ 不注入 |
WINEVENT_INCONTEXT |
回调必须在 DLL 里;系统把 DLL 加载进“产生事件的那个进程”,并在那里调用回调 | ✅ 就是注入 |
更多的细节可以在作者原文的中了解,这里主播就不再过多啰嗦了
简单的发散思维
也算是抛砖引玉了,看见这个技术一下就想到了可以注入杀软托盘程序,然后利用注入的进程关闭杀软。
原因如下
1 | |
结果演示
DLL 被注入到 HipsTray.exe,代码继承宿主的令牌与完整性级别。
从“杀软进程”内部去终止另一个“杀软进程”,在权限模型上和普通进程互杀没有区别。

至于其他杀软和 edr 的测试 就交给大家了 也算抛砖引玉,希望师傅们能够多多提出自己的想法,哈哈。
最后的最后
最后的最后就是关注 yawataa,因为主播会不定期诈尸