《利用SetWinEventHook进行DLL注入-R3层终止杀软进程》

前言

欧克啊,也是好久没有写文章发公众号了,主播最近忙着在秋招找工作呢,当然更多的也是在摸鱼。同时也不知道写什么,因为翻来覆去自己也没有找到什么比较分享的东西,与其输出同质化的东西,不如选择自己摸鱼先爽一下。

起因

原文:https://trainsec.net/library/windows-internals/dll-injection-with-setwineventhook-the-accessibility-hook-as-an-injector/

《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
2
3
4
5
6
7
8
9
HWINEVENTHOOK SetWinEventHook(
DWORD eventMin, // 事件范围起点,如 EVENT_MIN
DWORD eventMax, // 事件范围终点,如 EVENT_MAX
HMODULE hmodWinEventProc, // 回调所在模块
WINEVENTPROC pfnWinEventProc, // 回调函数地址
DWORD idProcess, // 只看哪个进程(0 = 全部)
DWORD idThread, // 只看哪个线程(0 = 全部)
DWORD dwFlags // 投递方式
);

关键只有 dwFlags 一个参数:*

模式 行为 是否注入
WINEVENT_OUTOFCONTEXT 事件被编组回调用进程,通过隐藏窗口 + 消息队列投递。调用线程必须有消息泵(GetMessage + DispatchMessage) ❌ 不注入
WINEVENT_INCONTEXT 回调必须在 DLL 里;系统把 DLL 加载进“产生事件的那个进程”,并在那里调用回调 ✅ 就是注入

更多的细节可以在作者原文的中了解,这里主播就不再过多啰嗦了

原文:https://trainsec.net/library/windows-internals/dll-injection-with-setwineventhook-the-accessibility-hook-as-an-injector/

简单的发散思维

也算是抛砖引玉了,看见这个技术一下就想到了可以注入杀软托盘程序,然后利用注入的进程关闭杀软。

原因如下

1
2
3
4
5
1. `SetWinEventHook` 是辅助功能(Accessibility)API,屏幕阅读器每天都在用。整个调用序列里没有 `OpenProcess`、`WriteProcessMemory`、`CreateRemoteThread`、`VirtualAllocEx` —— 这些正是自保护驱动重点监控的行为。在系统看来,这只是一个程序注册了 UI 事件钩子。

2. 注入器只做了两件事:`LoadLibrary` 自己的 DLL、`SetWinEventHook`。DLL 的加载动作是 user32 在目标进程内部完成的,不需要注入器持有目标进程句柄。自保护最常见的第一道防线是 `ObRegisterCallbacks`:在 `OpenProcess` 时剥离 `PROCESS_VM_WRITE` / `PROCESS_CREATE_THREAD` 等权限。这条路径在这里根本没有被走到,所以没有可拦截的点。

3. 触发事件的是目标进程自己的线程(点击、悬停、菜单……),user32 在这个线程的上下文里加载 DLL 并调用导出函数。对目标进程来说,这更像一次普通的模块加载,而不是“外部线程突然出现在自己的地址空间里”。

结果演示

DLL 被注入到 HipsTray.exe,代码继承宿主的令牌与完整性级别。

从“杀软进程”内部去终止另一个“杀软进程”,在权限模型上和普通进程互杀没有区别。

至于其他杀软和 edr 的测试 就交给大家了 也算抛砖引玉,希望师傅们能够多多提出自己的想法,哈哈。

最后的最后

最后的最后就是关注 yawataa,因为主播会不定期诈尸


《利用SetWinEventHook进行DLL注入-R3层终止杀软进程》
http://example.com/2026/10/27/《利用SetWinEventHook进行DLL注入-R3层终止杀软进程》/
Author
John Doe
Posted on
October 27, 2026
Licensed under