keylogger2.0
键盘记录器2.0
发布日期:2025-11-25
键盘记录器的功能十分完善,可以十分详细地记录按键及所操作的窗口。但各班台安装键盘记录器后,需要去各班查看记录的内容实在是过于麻烦。于是我制作了键盘记录器2.0,可以将日志上传至服务器。
核心问题分析
要实现这一功能,有2个核心问题需要解决:上传与接收。
接收端设计
服务器需要有一个能够接收文件的后端,正当我兴冲冲地准备写一个后端时突然想到,Alist应该有此类的功能吧?翻阅其文档,我找到了 Alist API 的说明,依照 Alist API 的设计,首先需要获取用户的token,然后再上传文件。
日志文件设计
而上传的文件也需要智能筛选,按照之前程序的设计,所有记录都存储在同一个文件(即log.txt中),但这样这个文件会越来越大,造成不必要的空间浪费,于是我重新设计日志的保存功能。由于不同班每天都会产生新的日志,我决定将日志的格式设计为**ip_YYYYMMDD**,这样可以同时区分是那一台电脑产生的日志,以及产生日志的时间。①
以此日志的名称命名逻辑,我们以高一二班的电脑为例,将会产生名称为10.88.202.70_251117.log的日志文件。明天运行后将会产生名为10.88.202.70_251118.log的日志。那难道要上传整个日志文件夹,那和直接写在同一个日志文件中并无区别了。所以我在想,既然如此,只要选取日期最晚的日志上传即可。如此,每次都只要上传一个文件,只需检查日志文件名中日期最晚的日志就行啦。
综上,上传日志筛选部分逻辑如下:
1 | 在文件夹中挑选文件 → 上传 → 创建新日志 |
上传功能实现
接下来就到了实现最复杂的部分:上传。我一开始真的准备用node.js写一个后端,但后来想到 Alist 应该也会有类似的功能吧。在官方文档上一看,果不其然有API。在Alist上传文件,根据我们设置的权限,不登录无法上传文件,所以要上传文件需要登录账号。在Alist API的设计中,可以使用账号与密码获取一个48小时内有效的token,上传文件时需要填写token,Alist会根据token判断是否有权限上传文件。
所以要实现这一功能需要使用2个API:
- token获取:使用
POST请求,路径为/api/auth/login,要求两个必选参数:username和password,返回的data字段将包含token字段。 - 流式上传文件:使用
PUT请求,路径为/api/fs/put,需要的参数有authorization、File-Path、Content-Type、Content-Length。
C++用起来确实有些难受,效率也比较低。为了发送网络请求,我使用了curl,解析返回值时,我使用了json.hpp。获取token后在返回的字符串中提取获取到的token值,然后将其作为上传的authorization参数,File-Path选择获取到的最晚日期的日志,Content-Length可以使用获取文件的函数获取,这样就可以将指定的日志文件上传上Alist啦。
完整逻辑流程
所以至此更改完整逻辑为:
1 | 筛选日志 → 获取Alist用户token → 上传日志 → 创建日志 |
功能总结
大功告成,现在键盘记录器就可以实现键盘记录+自动上传日志啦。我们只需要在尽可能多的班级安装键盘记录器,我们只需每日在Alist上查看日志就行了。
我还准备专门创建一个供键盘记录器上传文件的Alist用户,这样在不需要接收日志时只需在Alist上停用此账号即可(我们之前使用的是管理员账户qwq)
① 此中还产生了一个问题,有时可能会获取到其他网卡的IP地址,如在微软上测试时就获取成了Radom网络中的ip。为了避免这个问题,我在获取IP地址的代码中加入了优先获取以10.88开头的IP地址。
