m-hasan-2004/void_keylogger

GitHub: m-hasan-2004/void_keylogger

一款基于 Win32 低级键盘钩子的轻量级 Windows 键盘记录器,用于授权渗透测试与安全研究。

Stars: 0 | Forks: 0

# Void 键盘记录器 ![C++](https://img.shields.io/badge/Language-C++-blue.svg) ![Platform](https://img.shields.io/badge/Platform-Windows-lightgrey.svg) ![API](https://img.shields.io/badge/API-Win32-0078D7.svg) ![Status](https://img.shields.io/badge/Status-Active-brightgreen.svg) 一个使用 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, 数据擦除, 键盘记录器