8damon/K2-Detecting-Syscalls

GitHub: 8damon/K2-Detecting-Syscalls

一个 Windows 内核驱动 PoC,通过在内核回调中检查用户态调用栈来检测 SysWhispers、Hell's Gate 等直接和间接系统调用技术。

Stars: 0 | Forks: 0

# K2 ![DBGXSHELL](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/e46a7e3ab1173231.png) `K2` 是一个刻意保持小型的内核 PoC,用于检测由 SysWhispers(及其衍生工具)、HellsGate 以及使用类似技术的框架所执行的直接系统调用。 ## 概述 该驱动程序注册了一些回调; - 进程创建 - 线程创建 - 进程句柄打开 / 复制 - 线程句柄打开 / 复制 当这些事件之一触发时,`K2` 会遍历当前的用户栈并检查: - 顶部的用户栈帧是否解析到真实映射的 `ntdll.dll` - 该栈帧是否位于该回调预期的 `Nt*` 导出函数集中 - 该栈帧是否落在了另一个不同的 `Nt*` 导出函数中 - 调用者的栈帧是否来自可执行的私有内存、可写+可执行内存,或其他非映像的可执行区域 对于对象句柄回调,这意味着也要允许合法的创建系统调用。例如,一个线程句柄的创建自然可能来自 `NtOpenThread`、`NtCreateThreadEx`、`NtCreateUserProcess` 或 `ZwAlpcOpenSenderThread`,而一个进程句柄的创建则可以合法地来自 `NtOpenProcess`、`NtCreateUserProcess` 或 `ZwAlpcOpenSenderProcess`。将每一个非 `NtOpen*` 的路径都视为恶意行为,会产生大量来自常规 WMI、CLR、CSRSS、CTF 及其他 Windows 活动的误报。 检测结果会被记录到内核调试器中,可以在 WinDbg 中查看(不想为一个 PoC 去实现 IOCTL 面板)。 ## 为什么? 许多进攻性的系统调用工具似乎仍然认为直接系统调用是某种神奇的绕过方式,直接执行 `syscall` 就能神奇地绕过用户态挂钩... 是的,确实如此。但是,内核呢? `SysWhispers`、`Hell's Gate` 及其无数衍生工具是操作者如何尝试绕过用户态挂钩的典型示例,这些方法虽然有效,但会导致在内核内部引发更多的检测: - 系统调用路径并非起始于预期的 `ntdll` 存根 即使在更高级的实现中,调用栈被伪造指向了 `ntdll`; - 栈指向了一个与当前正在执行的不同的 `Nt*` 导出函数 或者,如果工具获取的导出函数正确,但该函数已被挂钩,操作者无论如何都会执行你的挂钩;而如果他们对其进行修补,任何成熟的 EDR 都应能立即察觉。 ## 构建 在此目录下执行: ``` msbuild K2.vcxproj /t:Build /p:Configuration=Debug /p:Platform=x64 /p:SignMode=Off ``` 项目端的 WDK 签名路径在我这台机器上不太可靠,因此实际的操作路径是: ``` set K2_PFX_PASSWORD=your-pfx-password installer.bat ``` 或者: ``` installer.bat your-pfx-password ``` 安装程序会在将 `K2.sys` 部署到 `System32\drivers` 之前,使用本地的 `.pfx` 证书对其进行签名。 ## 安装与卸载 将 `K2.sys` 放在与此脚本相同的目录中,然后以管理员身份运行: ``` installer.bat ``` 要卸载它: ``` remover.bat ``` 安装程序会将 `K2.sys` 复制到 `C:\Windows\System32\drivers\K2.sys`,创建或更新 `K2` 内核服务以指向该路径,并启动它。卸载程序会停止并删除该服务,然后移除已部署的驱动程序文件。 ## WINDBG 使用 `K2` 前缀进行过滤: ``` [K2] ============================================================ [K2] id=... event=... process=... [K2] pid=... tid=... frameCount=... [K2] reasons=... [K2] ntdll=... frame0=... [K2] resolved=... base=... span=... [K2] expected=... base=... span=... [K2] alt=... base=... span=... [K2] alt2=... base=... span=... [K2] alt3=... base=... span=... [K2] caller=... type=... [K2] callerProtect=... exec=... private=... writable=... image=... [K2] STACK[0] frame=... [K2] module=... or module=unmapped-or-non-image [K2] regionBase=... type=... protect=... [K2] classification=exec:... private:... writable:... image:... [K2] export=... [K2] ============================================================ ```
标签:EDR, HellsGate, Network, ntdll, PoC, syscall检测, UML, URL发现, Windows驱动程序, 内核回调, 内核驱动, 句柄监控, 回调机制, 子域名枚举, 安全检测, 客户端加密, 攻防, 暴力破解, 系统安全, 线程监控, 网络协议, 网络安全, 脆弱性评估, 调用栈分析, 防御对抗, 隐私保护