0xtrishul/PadaSentry
GitHub: 0xtrishul/PadaSentry
PadaSentry 是一款用 C 语言编写的 Windows 键盘记录器检测工具,通过结构性 hook 检测与行为信号评分两种互补机制,从用户空间识别击键监控行为。
Stars: 0 | Forks: 0
# PadaSentry
PadaSentry 监控系统中具有击键记录特征的行为信号:导入或调用键盘输入 API(`SetWindowsHookEx`、`GetAsyncKeyState`、`RegisterRawInputDevices`)但没有可见窗口或合法身份的进程、运行消息循环的隐藏进程,以及具有可疑的输入读取和文件写入组合行为的可执行文件。检测是基于信号的,而不是基于 hook 枚举的——Windows 没有提供公共 API 来从用户空间列出已安装的键盘 hook,因此任何声称可以直接做到这一点的工具,要么是在使用未公开的内核结构,要么是在撒谎。
**状态:** 早期开发中 —— 检测引擎正在开发中,请关注下方的[开发系列](#dev-series)。
## 检测方法
Windows 上的键盘记录器使用三种主要机制之一 —— 它们都无法通过干净且文档化的 API 从用户空间直接枚举:
- **使用 `WH_KEYBOARD_LL` 的 `SetWindowsHookEx`** —— hook 回调在 hook 进程自己的线程中运行;任何地方都没有注入 DLL,因此没有可以直接扫描的共享产物
- **`GetAsyncKeyState` / `GetKeyboardState` 轮询** —— 一个紧凑的循环查询按键状态,零 hook,在 API 层面上与任何其他输入读取循环没有区别
- **Raw Input (`RegisterRawInputDevices`)** —— 合法游戏用于低延迟输入的相同 API;键盘记录器注册一个 raw input 设备并读取 `WM_INPUT`
Windows 不公开从用户空间枚举已安装键盘 hook 的公共 API,因此 PadaSentry 使用多种检测向量而不是单一机制:
**结构性 hook 检测** —— 对于目标 DLL 中的每个导出函数,将其内存版本的前 N 个字节与磁盘版本进行比较。Inline hook 会在内存中的函数序言处留下一个文件中不存在的 `JMP`。IAT hook 则被单独捕获:检查每个 Import Address Table 条目,以验证其解析后的地址是否落在预期模块的内存范围内 —— 如果指向外部,则说明某些内容重定向了它。
**行为信号评分** —— 将进程拓扑(无可见窗口 + 活跃的消息循环)、可疑的输入读取和文件写入活动的组合,以及 API 导入指纹关联为一个分数。没有任何单一信号会被视为证据;它们的组合才是标记进程的标准。
目标是实现分层覆盖:结构性检测可捕获修改了 DLL 代码或 IAT 条目的 hook;行为评分可捕获未留下结构痕迹的机制(`GetAsyncKeyState` 轮询、raw input)。它们结合在一起涵盖了整个攻击面 —— 没有任何单一向量与另一个重复。
**ETW (Event Tracing for Windows)** —— 属于计划中的架构改进,而不是第三个检测类别。订阅 `Microsoft-Windows-Kernel-Process` 及相关 provider 可以让 PadaSentry 在新进程启动或加载新模块的那一刻立即重新运行其结构性和行为检查,而不是在固定的轮询间隔上进行。检测逻辑保持不变;ETW 只是用事件驱动的触发器替代了定时器。完全文档化,无需内核访问权限 —— Process Monitor 在底层使用了相同的机制。
## 开发系列
完整的开发过程已在 [writeups.trishul.re](https://writeups.trishul.re) 上记录为系列文章:
| # | 文章 | 涵盖内容 |
|---|------|----------------|
| 01 | [代码前的计划 (PT-BR)](https://writeups.trishul.re/padasentry/01-roadmap) | 项目路线图 —— 从 Win32 C 基础到 inline hook 和 IAT 检测的七个学习阶段 |
| 02 | [C 和一些由 Windows 创建的类型 (PT-BR)](https://writeups.trishul.re/padasentry/02-c-e-os-tipos-que-o-windows-inventou) | 映射到 Zhirkov 基础知识的 Win32 类型系统,Microsoft x64 ABI 与 System V 对比,MinGW 工具链 |
| 03 | [隐藏的 Hook (PT-BR)](https://writeups.trishul.re/padasentry/03-o-hook-que-nao-da-pra-ver) | 为什么 `WH_KEYBOARD_LL` 从用户空间不可见,三种键盘记录器机制,转向行为/结构检测 |
随着开发的推进,该系列会持续更新。
## 许可证
[GPL v3.0](https://github.com/0xtrishul/PadaSentry?tab=GPL-3.0-1-ov-file#)
标签:C/C++, Gophish, Linux, 事务性I/O, 系统行为监控, 终端检测与响应, 键盘记录器检测