恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
Loki键盘记录器代码详解:pynput监听键盘输入的完整实现与Shift键处理
首页
资讯中心
/
Loki键盘记录器代码详解:pynput监听键盘输入的完整实现与Shift键处理
Loki键盘记录器代码详解:pynput监听键盘输入的完整实现与Shift键处理
发布时间:2026/8/27 14:54:51
Loki键盘记录器代码详解pynput监听键盘输入的完整实现与Shift键处理【免费下载链接】LokiRemote Access Tool项目地址: https://gitcode.com/gh_mirrors/loki1/LokiLoki 键盘记录器是开源远程访问工具 Loki 的核心功能之一。本文面向新手完整讲解基于 pynput 库监听键盘输入的键盘记录器实现从监听线程的启动、按键事件的分类处理到最容易被忽略的Shift 键处理逻辑并顺带梳理开始记录 → 停止记录 → 导出按键三条命令从 Web 控制台到远程主机的完整链路。 项目声明Loki 及其键盘记录器仅供学习与安全教育用途。一、Loki 是什么键盘记录器在功能中的位置Loki 是一款结构清晰的远程控制工具Remote Access Tool使用RSA-2048 AES-256加密通道与目标机器通信。它由三部分组成服务端Flask 应用提供 Web 控制台与命令调度入口为 loki.pyBot 端运行在被控机器上的代理按键监听就发生在这里核心代码在 agent/bot/lib/keylogger.py前端浏览器控制台命令定义在 static/js/command.js在功能列表中Keylogger 与截屏、SFTP、SSH 等并列是 README 明确列出的特性之一见 README.md。二、键盘记录器三条命令logger_start、logger_stop、logger_dump所有键盘记录操作都通过 Web 终端执行前端用数字 ID 标识命令命令命令ID作用logger_start12开始键盘监听logger_stop13停止键盘监听logger_dump14导出已记录的按键序列前端通过 AJAX 把cmd_id和参数 POST 到/control/cmd服务端收到后转发给对应 Bot。三、keylogger.py 源码详解pynput 监听的核心实现整个键盘记录器只有 80 多行但设计得很典型值得逐段拆解。3.1 用守护线程跑一个全局监听器Keylogger类在 agent/bot/lib/keylogger.py 中定义启动逻辑是两行代码def _start(self): with Listener(on_pressself.on_press, on_releaseself.on_release) as self.listener: self.listener.join() def start(self): Thread(targetself._start, daemonTrue).start()这里用 pynput 的Listener注册on_press按下和on_release抬起两个回调。注意它被包在一个daemon 线程里运行——listener.join()会永久阻塞若放在主线程整个 Bot 就会卡死守护线程让主流程可以继续处理网络通信。stop()则调用self.listener.stop()优雅结束监听并把is_alive置为 False。3.2 on_press先特殊按键后普通字符on_press是记录逻辑的核心按顺序做了三件事backspace直接删除self.data列表的最后一个元素模拟删除效果让记录内容与输入框里看到的完全一致特殊按键tab → \t、enter → \n、space → 普通按键判断条件是len(str(key)) 3pynput 中普通字符键的 str 形如Key包装字符键长度为 3 即形如Key(a)这类可取.char的键此时才交给check_for_shift处理值得学习的小技巧backspace 的可编辑缓冲区思路让 dump 出来的文本就是用户实际看到的文字而非原始按键流。3.3 Shift 键处理lastkey 状态 双映射表这是全文最值得细读的部分。难点在于Shift 本身不产生字符它改变的是下一个按键的形态。实现分三步第一步记住 Shift 按下了。普通按键按下时会执行self.lastkey key所以下一次按键到来时能判断上一个键是不是 Shift。第二步Shift 松开时立即复位。on_release中if any([key Key.shift, key Key.shift_r]): self.lastkey None左 Shift 和右 Shift 都处理松开后清空状态避免按下 Shift 后隔很久再按 a被错误转换成大写。第三步按键时查表转换。check_for_shift的转换规则是一行链式判断key (key.upper() if key.isalpha() else self.num_to_symbol[key] if key.isdigit() else self.sym_to_symbol[key] if key in self.sym_to_symbol else key)字母 →upper()转大写数字 → 查num_to_symbol表1→!、2→、3→#…符号 → 查sym_to_symbol表→~、[→{、-→_、→…其他如 ShiftEnter→ 原样保留这两张映射表就是键盘第二层字符的完整定义放在__init__里作为类初始化的一部分清晰且易于维护。3.4 dump导出即清空dump()把缓冲区用.join()拼成字符串返回然后清空self.data。所以每次logger_dump只导出上次导出之后的新内容天然形成增量记录。若缓冲区为空则返回-1作为占位符。四、Bot 端接线shell.py 中的三个入口监听器不会自己启动它由 Bot 的 Shell 模块驱动。在 agent/bot/lib/shell.py 中logger_start惰性创建Keylogger实例后调用start()logger_stop调用stop()logger_dump调用dump()并通过self.send(-0, data)回传给服务端通信格式由 agent/bot/lib/session.py 统一封装为 JSON 的{code, args}结构与服务端 lib/server/lib/session.py 严格对应。五、服务端状态机interface.py 里的 cmd_id 12/13/14服务端在 lib/server/lib/interface.py 中为三个命令 ID 维护了一个keylogging布尔状态收到12状态为 False 才启动并置 True否则提示 Keylogger is already active收到13状态为 True 才停止否则提示 Keylogger is already inactive收到14状态为 False 时直接拒绝否则调用keystrokes()阻塞等待 Bot 回传的数据这个服务端状态 客户端执行的双向确认设计避免了重复启动监听器或导出空数据的尴尬是小型 C/S 工具中很实用的防误操作模式。六、上手路径小结如果你想完整复现并学习这套键盘监听建议按这个顺序阅读代码pynput的Listener回调模型 —— 理解全局钩子keylogger.py的on_press分支与 Shift 查表转换shell.py的logger_start/stop/dump三个入口interface.py中 cmd_id 12/13/14 的状态流转 最后再次强调键盘记录属于高敏感功能请仅在自己的环境和授权范围内学习研究遵守相关法律法规。【免费下载链接】LokiRemote Access Tool项目地址: https://gitcode.com/gh_mirrors/loki1/Loki创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考