m-hasan-2004/void_keylogger
GitHub: m-hasan-2004/void_keylogger
一款基于 Win32 低级键盘钩子的轻量级 Windows 键盘记录器,用于授权渗透测试与安全研究。
Stars: 0 | Forks: 0
# Void 键盘记录器




一个使用 Windows Low-Level Keyboard Hook API (`WH_KEYBOARD_LL`) 编写的轻量级、隐身模式 Windows 键盘记录器,采用 C++ 编写。专为授权的渗透测试、安全研究和教育目的而设计。
```
_ _ _ _
__ _____ (_) __| | | | _____ _ _| | ___ __ _ __ _ ___ _ __
\ \ / / _ \| |/ _` | | |/ / _ \ | | | |/ _ \ / _` |/ _` |/ _ \ '__|
\ V / (_) | | (_| | | < __/ |_| | | (_) | (_| | (_| | __/ |
\_/ \___/|_|\__,_| |_|\_\___|\__, |_|\___/ \__, |\__, |\___|_|
|___/ |___/ |___/
```
## 目录
- [功能](#features)
- [架构](#architecture)
- [配置](#configuration)
- [输出格式](#output-formats)
- [构建](#building)
- [用法](#usage)
- [日志文件格式](#log-file-format)
- [隐身机制](#stealth-mechanisms)
- [检测与绕过注意事项](#detection--bypass-considerations)
- [用例](#use-cases)
- [免责声明](#disclaimer)
- [许可证](#license)
## 功能
- **全局键盘钩子** — 通过 `WH_KEYBOARD_LL` 捕获系统范围内的所有按键
- **多格式输出** — 支持命名键、十进制代码和十六进制代码
- **按小时轮转日志** — 每小时自动创建一个带有时间戳文件名的新日志文件
- **活动窗口追踪** — 记录用户正在交互的应用程序窗口
- **Shift/CapsLock 感知** — 正确处理大写/小写输入
- **控制台可视化** — 实时按键显示,带有彩色输出
- **启动等待模式** — 可选择延迟捕获,直到系统启动完成
- **隐身模式** — 隐藏控制台窗口,并可选择完全释放控制台
- **鼠标事件过滤** — 可选择忽略鼠标点击(1=左键,2=右键)
## 架构
```
┌─────────────────────────────────────┐
│ main() │
│ ┌─ Banner Display ───────────────┐ │
│ └────────────────────────────────┘ │
│ ┌─ Stealth() ────────────────────┐ │
│ │ Hides console window │ │
│ └────────────────────────────────┘ │
│ ┌─ BootCheck ────────────────────┐ │
│ │ (optional bootwait) │ │
│ └────────────────────────────────┘ │
│ ┌─ SetHook() ────────────────────┐ │
│ │ SetWindowsHookEx(...) │ │
│ └────────────────────────────────┘ │
│ ┌─ Message Loop ─────────────────┐ │
│ │ while(GetMessage()) │ │
│ │ ┌──────────────────────────┐ │ │
│ │ │ HookCallback() │ │ │
│ │ │ ┌────────────────────┐ │ │ │
│ │ │ │ Save() │ │ │ │
│ │ │ │ ├─ Window Track │ │ │ │
│ │ │ │ ├─ Key Mapping │ │ │ │
│ │ │ │ ├─ Console Output │ │ │ │
│ │ │ │ └─ File Output │ │ │ │
│ │ │ └────────────────────┘ │ │ │
│ │ └──────────────────────────┘ │ │
│ └────────────────────────────────┘ │
└─────────────────────────────────────┘
```
### 组件说明
| 组件 | 描述 |
|-----------|-------------|
| `HookCallback()` | 低级键盘钩子过程。在每次 `WM_KEYDOWN` 事件时触发。 |
| `Save()` | 核心记录功能 — 将虚拟键码映射为人类可读的输出,追踪活动窗口,并写入文件 + 控制台。 |
| `Stealth()` | 隐藏控制台窗口或调用 `FreeConsole()` 将其完全移除。 |
| `SetHook()` / `ReleaseHook()` | 安装和卸载全局键盘钩子。 |
| `IsSystemBooting()` | 检查 `GetSystemMetrics(SM_GETSYSTEMMETRICS)` 以确定系统是否仍在初始化。 |
| `LogWithColor()` | 使用 `SetConsoleTextAttribute()` 进行彩色控制台输出的辅助函数。 |
## 配置
所有配置均通过 `main.cpp` 顶部的预处理器 `#define` 指令进行处理:
```
#define invisible // visible / invisible
#define bootwait // bootwait / nowait
#define FORMAT 0 // 0 = names, 10 = decimal, 16 = hex
#define mouseignore // comment out to track mouse clicks
```
### 可见性
| 选项 | 效果 |
|--------|--------|
| `#define invisible` | 隐藏控制台窗口(隐身模式) |
| `#define visible` | 保持控制台窗口可见(调试模式) |
### 启动行为
| 选项 | 效果 |
|--------|--------|
| `#define bootwait` | 暂停记录直到系统启动完成(10秒轮询) |
| `#define nowait` | 立即开始记录 |
### 输出格式
| 值 | 输出 | 示例 |
|-------|--------|---------|
| `0` | 命名键 | `[ENTER]`, `_` (空格) |
| `10` | 十进制代码 | `[13]`, `[32]` |
| `16` | 十六进制代码 | `[D]`, `[20]` |
### 鼠标过滤
| 指令 | 效果 |
|-----------|--------|
| `#define mouseignore` | 忽略鼠标点击事件(默认) |
| 将其注释掉 | 记录鼠标按键(1 = 左键,2 = 右键) |
## 输出格式
### 格式 0 — 命名键(默认)
```
[Window: Notepad - at 2026-06-19T14:23:45]
Hello_world[ENTER]
[Window: Chrome - at 2026-06-19T14:24:01]
www[.].example[.].com[ENTER]
```
### 格式 10 — 十进制代码
```
[Window: Notepad - at 2026-06-19T14:23:45]
[72][101][108][108][111][95][119][111][114][108][100][13]
```
### 格式 16 — 十六进制代码
```
[Window: Notepad - at 2026-06-19T14:23:45]
[48][65][6c][6c][6f][5f][77][6f][72][6c][64][d]
```
## 构建
### 前置条件
- Windows Vista 或更高版本(`WH_KEYBOARD_LL` 所需)
- Microsoft Visual Studio 2019+ 或 MinGW-w64
- CMake(可选)
### Visual Studio(命令行)
```
cl /EHsc /Fe:VoidKeyLogger.exe main.cpp user32.lib
```
### Visual Studio(IDE)
1. 创建一个新的 **Console Application** 项目
2. 添加 `main.cpp`
3. Build → Build Solution(Ctrl+Shift+B)
### MinGW-w64
```
x86_64-w64-mingw32-g++ -static -o VoidKeyLogger.exe main.cpp -luser32 -lgdi32
```
### CMake
```
cmake_minimum_required(VERSION 3.10)
project(VoidKeyLogger)
add_executable(VoidKeyLogger main.cpp)
target_link_libraries(VoidKeyLogger user32 gdi32)
```
```
mkdir build && cd build
cmake .. -G "MinGW Makefiles"
make
```
## 用法
```
VoidKeyLogger.exe
```
无需命令行参数。记录器将会:
1. 显示 ASCII 横幅(如果是 `visible` 模式)
2. 可选地等待系统启动(如果是 `bootwait` 模式)
3. 安装全局键盘钩子
4. 开始在当前目录中记录到带有时间戳的 `.log` 文件
5. 运行直到被终止(Ctrl+C、taskkill 或系统关机)
### 停止
```
taskkill /IM VoidKeyLogger.exe /F
```
或者使用 Process Explorer / 任务管理器。
## 日志文件格式
文件以创建时的时间戳命名:
```
2026-06-19__14-23-45.log
2026-06-19__15-00-00.log
```
**每小时**(当 `tm_hour` 改变时)会创建一个新文件。每个日志条目包含:
```
[Window: - at ]
```
## 隐身机制
### 控制台隐藏(`invisible` 模式)
两层隐藏:
1. `ShowWindow(FindWindowA("ConsoleWindowClass", NULL), 0)` — 隐藏控制台窗口
2. `FreeConsole()` — 将进程与其控制台完全分离(更强的隐身性)
若要使用 **可见/调试** 模式,请改为定义 `visible`,它会调用 `ShowWindow(..., 1)`。
### 启动等待(`bootwait` 模式)
```
while (IsSystemBooting()) { Sleep(10000); }
```
使用 `GetSystemMetrics(0x2004)`(未公开 — `SM_GETSYSTEMMETRICS`)来检测系统是否仍在初始化。这降低了在早期启动安全软件加载期间被检测到的几率。
## 检测与绕过注意事项
该工具为了教育和授权测试目的,**刻意保持简单直接**。它使用了具有完善记录签名的技术:
| 检测向量 | 描述 |
|-----------------|-------------|
| `WH_KEYBOARD_LL` 钩子 | EDR/AV 通常会标记全局钩子 |
| `FreeConsole()` 调用 | 隐身意图的指标 |
| `GetWindowTextA` API | 窗口枚举模式 |
| 写入 `.log` 文件 | 在某些情况下的可疑文件扩展名 |
| 带有 `NULL` 模块的 `SetWindowsHookEx` | 无 DLL 注入的钩子(在调用进程中运行) |
### 绕过建议(用于授权测试)
*编译时使用自定义入口点混淆*
*与进程镂空或反射式加载器集成*
*在写入磁盘之前加密日志输出*
*使用命名管道或网络套接字代替文件 I/O*
*修改钩子技术,改用 `GetAsyncKeyState` 轮询*
## 用例
- **红队演练** — 凭证收集、用户行为分析
- **安全审计** — 测试 DLP(数据防泄漏)解决方案
- **事件响应培训** — 了解键盘记录器行为以进行取证分析
- **恶意软件分析教育** — 研究基于钩子的键盘记录技术
- **家长控制研究** — 了解按键捕获机制
## 免责声明
## 许可证
MIT 许可证 — 详情请参阅 [LICENSE](LICENSE)。
## 鸣谢
- Windows Low-Level Keyboard Hooks (MSDN)
- Win32 API 文档
- 安全研究社区
*为实战而生。请在授权下使用。*
标签:Bash脚本, C++, Gophish, Linux, Win32 API, 数据擦除, 键盘记录器