islacchi/Python-Keylogger

GitHub: islacchi/Python-Keylogger

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

Stars: 0 | Forks: 0

# 键盘记录与捕获工具 ![Python](https://img.shields.io/badge/Python-3.8+-3776AB?style=flat&logo=python&logoColor=white) ![Platform](https://img.shields.io/badge/Platform-Windows-0078D6?style=flat&logo=windows&logoColor=white) ![Threading](https://img.shields.io/badge/Threads-3-brightgreen?style=flat) ![pynput](https://img.shields.io/badge/pynput-1.8.2+-informational?style=flat) ![pygetwindow](https://img.shields.io/badge/pygetwindow-latest-informational?style=flat) ![Educational](https://img.shields.io/badge/Purpose-Educational-yellow?style=flat) ![License](https://img.shields.io/badge/License-As--Is-lightgrey?style=flat) 一个基于 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, 恶意软件, 数据捕获, 无后门, 逆向工具, 键盘记录