Windows 10 1809+已彻底封禁EPROCESS链表隐藏:因引入只读影子链表、KASLR强化及ActiveProcessLinks页写保护,强行摘链会触发CRITICAL_STRUCTURE_CORRUPTION蓝屏;PsSetCreateProcessNotifyRoutineEx仅支持审计拦截,无法实现系统级隐藏;用户态规避(如重命名、ETW过滤)才是可行路径。

不能在现代 Windows 内核驱动中安全、稳定地“隐藏”进程的 EPROCESS 结构——这不是一个可工程化实现的功能,而是早已被系统机制封死的危险操作。
为什么直接操作 EPROCESS 链表已失效(Win10 1809+)
旧教程里通过遍历 PsActiveProcessHead 并摘链(Flink/Blink)来隐藏进程的方式,在 Windows 10 1809 及之后版本完全失效。系统引入了 PsActiveProcessHead 的只读影子链表(shadow list)、内核地址空间布局随机化(KASLR)强化、以及对 EPROCESS 关键字段的写保护(如 ActiveProcessLinks 所在页被设为 PAGE_READONLY)。
- 尝试用
MmProtectMdlSystemAddress或MmSetPageProtection解除写保护,大概率触发CRITICAL_STRUCTURE_CORRUPTION蓝屏 - 即使临时绕过,系统定时器(如
PsUpdateActiveProcessCount)或 PnP/电源管理事件会重新校验链表完整性,导致崩溃 -
!process 0 0在 WinDbg 中仍能列出进程,因为该命令不依赖PsActiveProcessHead,而是扫描内核对象管理器或使用 ETW 事件源
PsSetCreateProcessNotifyRoutineEx 的实际效果有限
注册回调函数拦截进程创建/退出通知,仅能用于日志、审计或早期拦截(如拒绝启动),无法让进程“从系统视角消失”。它不修改 EPROCESS 状态,也不影响任务管理器、tasklist、WMI 查询或性能计数器。
- 回调本身会被
PsSetCreateProcessNotifyRoutineEx的反向注册检测到,EDR 常监控此 API 调用 - 回调中若执行耗时操作(如内存扫描、IO),会阻塞系统线程调度,引发超时或死锁
- Windows 11 22H2 后,部分回调可能被内核延迟执行或合并,失去实时性
用户态隐藏比内核态更可行(但仍是规避而非隐藏)
真正能落地的“隐藏”,是让进程不被常规工具枚举,而不是篡改内核数据结构。这需要组合用户态技巧:
- 使用
CreateToolhelp32Snapshot时,目标进程若以DEBUG_PROCESS或DEBUG_ONLY_THIS_PROCESS启动,部分旧版工具(非 WinDbg)可能跳过它 - 避免调用
OpenProcess或暴露句柄,减少在NtQuerySystemInformation(SystemProcessInformation)中的可见痕迹 - 重命名进程映像文件为系统常见名(如
svchost.exe),配合合法签名,降低 AV/EDR 行为检出率 - 利用
ETW事件过滤或禁用特定提供者(需SeDebugPrivilege),干扰 PowerShell 的Get-Process数据源
调试和验证时最易忽略的崩溃点
所有试图修改 EPROCESS 字段的操作,最常在以下两个环节静默失败:
-
MmMapIoSpace映射物理页后未检查返回值,导致后续解引用空指针;现代系统中,EPROCESS所在页可能位于不可映射的非分页池区域 - 未同步更新
EPROCESS->UniqueProcessId对应的ObHeaderCookie校验值,触发对象管理器校验失败(错误码常为STATUS_OBJECT_TYPE_MISMATCH)
如果你看到 KMODE_EXCEPTION_NOT_HANDLED 伴随 IRQL_NOT_LESS_OR_EQUAL,八成是在 DISPATCH_LEVEL 下访问了分页内存,或者用了未初始化的 LIST_ENTRY* 指针做 CONTAINING_RECORD 计算。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











