islacchi/Python-Keylogger
GitHub: islacchi/Python-Keylogger
一个用于教学演示的 Python 键盘记录工具,通过多线程架构和队列缓冲机制展示实时输入捕获、活动窗口追踪与结构化日志的底层实现原理。
Stars: 0 | Forks: 0
# 键盘记录与捕获工具







一个基于 Python 的键盘记录捕获工具,**仅供实验和教育目的**使用。本项目旨在探索 Python 中的多线程、基于队列的缓冲区、窗口追踪以及实时输入处理。
## 免责声明
本项目严格仅供**学习与实验**而创建。旨在演示键盘记录捕获、缓冲 I/O 和底层 Python 多线程程序的运作原理。
**本项目创作者对因使用此软件而导致的任何滥用、损害或法律后果不承担任何责任。** 在大多数司法管辖区,未经他人明确知晓和同意,使用此工具监控、监视或捕获他人的输入是违法的,强烈建议不要这样做。严禁恶意使用此工具。
## 功能说明
- 使用 `pynput` 实时捕获键盘输入
- 过滤修饰键和导航键(Shift、Ctrl、Alt、方向键等)
- 将字符批量组合成单词,并在单词边界或标点符号处刷新输出
- 使用 `pygetwindow` 追踪每次按键时的活动窗口标题
- 将带有时间戳和窗口归属的日志条目写入文件
- 正确应用退格键——日志反映了用户意图输入的内容
- 无论是否有键盘输入活动,硬性每 5 分钟刷新一次缓冲区
- 在退出时彻底还原所有状态,即使在遇到 Ctrl+C 或意外崩溃时也是如此
## 运行原理
### 线程模型
该程序同时运行三个线程:
| 线程 | 职责 |
|---|---|
| 线程 1 — pynput 监听器 | 每次按键时触发 `on_press` |
| 线程 2 — 写入器 | 持有缓冲区和文件句柄,处理队列 |
| 线程 3 — 定时触发器 | 休眠 5 分钟,发送硬性刷新信号 |
所有线程之间的通信都通过单一的 `queue.Queue` 进行。没有任何线程直接与其他线程共享状态——队列是唯一的桥梁。
### 刷新触发器
缓冲区在以下五种情况下会被刷新:
| 触发条件 | 日志中的标签 |
|---|---|
| 空格、标点符号 | (无标签) |
| Enter 键 | `[newline]` |
| 空闲 2 秒 | `[timeout]` |
| 缓冲区达到 50 个字符 | `[size]` |
| 精确每 5 分钟一次 | `[interval]` |
| 活动窗口发生变化 | `[window_switch]` |
| 程序退出 | `[shutdown]` |
### 窗口追踪
活动窗口标题通过 `pygetwindow.getActiveWindow()` 获取。为了避免缓慢的操作系统调用阻塞键盘记录,窗口标题会被缓存并每 200ms 刷新一次。为了确保准确性,每次在单词边界刷新后缓存也会被重置。
### 准确性改进
- **监听器就绪状态** — 使用 `threading.Event` 标志确认监听器在接收输入前已完全注册到操作系统,消除了首次按键丢失的 bug
- **窗口缓存** — 每 200ms 刷新一次,并在单词边界重置,以最大限度地减少过时的窗口归属问题
- **退格键处理** — 通过队列传递并应用到缓冲区,因此日志能反映修改后的正确文本
## 日志格式
每个条目遵循以下格式:
```
[HH:MM:SS.microseconds] [Window Title] word [tag]
```
输出示例:
```
[10:23:01.123456] [Visual Studio Code] def
[10:23:01.502910] [Visual Studio Code] main
[10:23:03.612340] [Google Chrome] search [timeout]
[10:23:05.100000] [Visual Studio Code] hello [window_switch]
[10:28:00.000000] [Visual Studio Code] working [interval]
```
## 环境要求
- Python 3.8+
- pynput 1.8.2+
- pygetwindow
安装依赖项:
```
pip install pynput pygetwindow
```
## 用法
**开始捕获:**
```
python main.py
```
按下 `Ctrl+C` 停止。日志将写入同一目录下的 `test.log` 文件中。
## 配置
所有可配置的值都位于 `main.py` 的顶部:
| 常量 | 默认值 | 描述 |
|---|---|---|
| `LOG_FILE` | `test.log` | 输出文件路径 |
| `TIME_WINDOW` | `2.0` | 超时刷新前的空闲秒数 |
| `FLUSH_INTERVAL` | `300` | 硬性刷新间隔时间(以秒为单位,5 分钟) |
| `MAX_BUFFER_SIZE` | `50` | 触发大小刷新的字符数量 |
| `WINDOW_CHECK_INTERVAL` | `0.2` | 刷新活动窗口缓存的频率 |
## 项目结构
```
Python-Keylogger/
├── main.py — main program
├── test.log — captured output (gitignored)
└── .gitignore — excludes test.log from version control
```
## 许可证
本项目按“原样”提供,仅用于教育目的。不提供任何担保。创作者不对本软件的使用方式承担任何责任。
标签:Python, 恶意软件, 数据捕获, 无后门, 逆向工具, 键盘记录