mirror of
https://github.com/Mumuzi7179/UsbKeyboard_Mouse_Hacker_Gui.git
synced 2025-06-21 10:21:07 +00:00
upload main files
This commit is contained in:
commit
aa13f92e0b
106
KeyboardDecrypt.py
Normal file
106
KeyboardDecrypt.py
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
from PySide6.QtWidgets import QComboBox,QStackedWidget,QApplication, QMainWindow, QPushButton, QTextEdit, QFileDialog, QVBoxLayout, QWidget, QLabel, QLineEdit, QHBoxLayout, QRadioButton, QButtonGroup, QTabWidget, QMenuBar, QToolBar
|
||||||
|
from PySide6.QtGui import QAction
|
||||||
|
from PySide6.QtCore import Qt, Signal
|
||||||
|
import sys,os
|
||||||
|
import datetime
|
||||||
|
from UsbKeyboardExtract import extract_data,process_data
|
||||||
|
|
||||||
|
class KeyboardDecryptWindow(QWidget):
|
||||||
|
file_name = Signal(str) # 文件名信号
|
||||||
|
file_dropped = Signal(str)
|
||||||
|
|
||||||
|
def __init__(self,parent=None):
|
||||||
|
super(KeyboardDecryptWindow, self).__init__(parent)
|
||||||
|
|
||||||
|
self.layout = QVBoxLayout()
|
||||||
|
self.setLayout(self.layout)
|
||||||
|
|
||||||
|
# 选择执行的类型
|
||||||
|
self.type_layout = QHBoxLayout()
|
||||||
|
self.type_label = QLabel("选择执行类型:")
|
||||||
|
self.type_layout.addWidget(self.type_label)
|
||||||
|
self.button_group = QButtonGroup(self)
|
||||||
|
self.select_type1 = QRadioButton("capdata")
|
||||||
|
self.select_type2 = QRadioButton("usbhid")
|
||||||
|
|
||||||
|
self.button_group.addButton(self.select_type1)
|
||||||
|
self.button_group.addButton(self.select_type2)
|
||||||
|
self.type_layout.addWidget(self.select_type1)
|
||||||
|
self.type_layout.addWidget(self.select_type2)
|
||||||
|
# 确定按钮
|
||||||
|
self.run_button = QPushButton("点击执行")
|
||||||
|
stylesheet = load_stylesheet("./css/style.css")
|
||||||
|
self.run_button.setStyleSheet(stylesheet)
|
||||||
|
self.run_button.clicked.connect(self.run_command)
|
||||||
|
self.type_layout.addWidget(self.run_button)
|
||||||
|
self.layout.addLayout(self.type_layout)
|
||||||
|
|
||||||
|
# 输出窗口
|
||||||
|
self.output = QTextEdit()
|
||||||
|
self.layout.addWidget(self.output)
|
||||||
|
self.output.setReadOnly(True)
|
||||||
|
|
||||||
|
self.setAcceptDrops(True)
|
||||||
|
|
||||||
|
# 文件名变量
|
||||||
|
self.file = ''
|
||||||
|
|
||||||
|
# 接收文件名信号
|
||||||
|
self.file_name.connect(self.set_file)
|
||||||
|
|
||||||
|
def set_file(self, file):
|
||||||
|
self.file = file
|
||||||
|
|
||||||
|
def dragEnterEvent(self, event):
|
||||||
|
|
||||||
|
if event.mimeData().hasUrls():
|
||||||
|
event.accept()
|
||||||
|
else:
|
||||||
|
event.ignore()
|
||||||
|
|
||||||
|
def dropEvent(self, event):
|
||||||
|
urls = event.mimeData().urls()
|
||||||
|
|
||||||
|
url = urls[0]
|
||||||
|
|
||||||
|
filePath = url.toLocalFile()
|
||||||
|
|
||||||
|
self.file_dropped.emit(filePath)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def run_command(self):
|
||||||
|
self.output.clear()
|
||||||
|
|
||||||
|
current_time = datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")
|
||||||
|
self.output.append(f"{current_time}")
|
||||||
|
|
||||||
|
checked_button = self.button_group.checkedButton()
|
||||||
|
if checked_button:
|
||||||
|
type = checked_button.text()
|
||||||
|
else:
|
||||||
|
type = None
|
||||||
|
if not self.file:
|
||||||
|
self.output.append("错误:没有选择文件。")
|
||||||
|
return
|
||||||
|
if not type:
|
||||||
|
self.output.append("错误:没有选择执行类型。")
|
||||||
|
return
|
||||||
|
self.output.append(f"执行的类型: {type}")
|
||||||
|
try:
|
||||||
|
result,result1 = extract_data(type, self.file)
|
||||||
|
result2,result_delete = process_data(result1)
|
||||||
|
except Exception as e:
|
||||||
|
self.output.append(f"执行出错:{e}")
|
||||||
|
else:
|
||||||
|
self.output.append("执行成功。结果如下:")
|
||||||
|
self.output.append(result)
|
||||||
|
self.output.append("处理后的结果如下:")
|
||||||
|
self.output.append(result2)
|
||||||
|
self.output.append("删除的字符如下:")
|
||||||
|
self.output.append(result_delete)
|
||||||
|
|
||||||
|
|
||||||
|
def load_stylesheet(filename):
|
||||||
|
with open(filename, "r") as f:
|
||||||
|
return f.read()
|
164
MouseDecrypt.py
Normal file
164
MouseDecrypt.py
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
from PySide6.QtWidgets import QSizePolicy,QComboBox,QStackedWidget,QApplication, QMainWindow, QPushButton, QTextEdit, QFileDialog, QVBoxLayout, QWidget, QLabel, QLineEdit, QHBoxLayout, QRadioButton, QButtonGroup, QTabWidget, QMenuBar, QToolBar
|
||||||
|
from PySide6.QtGui import QAction
|
||||||
|
from PySide6.QtCore import Qt, Signal
|
||||||
|
import sys,os,time,datetime
|
||||||
|
from MouseExtract import extract_data
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
|
||||||
|
class MouseDecryptWindow(QWidget):
|
||||||
|
file_name = Signal(str) # 文件名信号
|
||||||
|
file_dropped = Signal(str)
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
super(MouseDecryptWindow, self).__init__()
|
||||||
|
|
||||||
|
self.layout = QVBoxLayout(self)
|
||||||
|
|
||||||
|
# 选择执行的类型
|
||||||
|
self.type_layout = QHBoxLayout()
|
||||||
|
self.type_label = QLabel("选择执行类型:")
|
||||||
|
self.type_layout.addWidget(self.type_label)
|
||||||
|
self.button_group_type = QButtonGroup(self)
|
||||||
|
self.select_type1 = QRadioButton("capdata")
|
||||||
|
self.select_type2 = QRadioButton("usbhid")
|
||||||
|
self.button_group_type.addButton(self.select_type1)
|
||||||
|
self.button_group_type.addButton(self.select_type2)
|
||||||
|
self.type_layout.addWidget(self.select_type1)
|
||||||
|
self.type_layout.addWidget(self.select_type2)
|
||||||
|
self.layout.addLayout(self.type_layout)
|
||||||
|
|
||||||
|
# 选择想要查看的鼠标按键
|
||||||
|
self.button_layout = QHBoxLayout()
|
||||||
|
self.button_label = QLabel("选择想要查看的鼠标按键:")
|
||||||
|
self.button_layout.addWidget(self.button_label)
|
||||||
|
self.button_group_button = QButtonGroup(self)
|
||||||
|
self.select_button1 = QRadioButton("左键")
|
||||||
|
self.select_button2 = QRadioButton("右键")
|
||||||
|
self.select_button3 = QRadioButton("无按键")
|
||||||
|
self.select_button4 = QRadioButton("所有")
|
||||||
|
self.button_group_button.addButton(self.select_button1)
|
||||||
|
self.button_group_button.addButton(self.select_button2)
|
||||||
|
self.button_group_button.addButton(self.select_button3)
|
||||||
|
self.button_group_button.addButton(self.select_button4)
|
||||||
|
self.button_layout.addWidget(self.select_button1)
|
||||||
|
self.button_layout.addWidget(self.select_button2)
|
||||||
|
self.button_layout.addWidget(self.select_button3)
|
||||||
|
self.button_layout.addWidget(self.select_button4)
|
||||||
|
self.layout.addLayout(self.button_layout)
|
||||||
|
|
||||||
|
# 执行按钮
|
||||||
|
self.button_layout = QHBoxLayout()
|
||||||
|
stylesheet = load_stylesheet("./css/style.css")
|
||||||
|
|
||||||
|
self.run_button = QPushButton("保存并打开图片")
|
||||||
|
self.run_button.clicked.connect(self.run_command)
|
||||||
|
self.run_button.setFixedSize(120, 40) # 设置固定大小
|
||||||
|
self.button_layout.addWidget(self.run_button)
|
||||||
|
self.run_button.setStyleSheet(stylesheet)
|
||||||
|
|
||||||
|
# 保存图片按钮
|
||||||
|
self.save_button = QPushButton("仅保存图片")
|
||||||
|
self.save_button.clicked.connect(self.save_image)
|
||||||
|
self.save_button.setFixedSize(120, 40) # 设置固定大小
|
||||||
|
self.button_layout.addWidget(self.save_button)
|
||||||
|
self.save_button.setStyleSheet(stylesheet)
|
||||||
|
|
||||||
|
self.layout.addLayout(self.button_layout)
|
||||||
|
|
||||||
|
# 输出窗口
|
||||||
|
self.output = QTextEdit()
|
||||||
|
self.layout.addWidget(self.output)
|
||||||
|
self.output.setReadOnly(True)
|
||||||
|
|
||||||
|
self.setLayout(self.layout)
|
||||||
|
|
||||||
|
# 文件名变量
|
||||||
|
self.file = ''
|
||||||
|
|
||||||
|
# 接收文件名信号
|
||||||
|
self.file_name.connect(self.set_file)
|
||||||
|
|
||||||
|
self.setAcceptDrops(True)
|
||||||
|
|
||||||
|
def set_file(self, file):
|
||||||
|
self.file = file
|
||||||
|
|
||||||
|
def dragEnterEvent(self, event):
|
||||||
|
# accept the drag only if it contains files
|
||||||
|
if event.mimeData().hasUrls():
|
||||||
|
event.accept()
|
||||||
|
else:
|
||||||
|
event.ignore()
|
||||||
|
|
||||||
|
def dropEvent(self, event):
|
||||||
|
# get the file URLs (a list of QUrls)
|
||||||
|
urls = event.mimeData().urls()
|
||||||
|
|
||||||
|
# assuming only one file is dropped, get the first URL
|
||||||
|
url = urls[0]
|
||||||
|
|
||||||
|
# get the file path (a string)
|
||||||
|
filePath = url.toLocalFile()
|
||||||
|
|
||||||
|
# 发送文件名信号
|
||||||
|
self.file_dropped.emit(filePath)
|
||||||
|
|
||||||
|
def save_image(self):
|
||||||
|
self.run_command(from_save_button=True)
|
||||||
|
|
||||||
|
def run_command(self,from_save_button=False):
|
||||||
|
self.output.clear()
|
||||||
|
|
||||||
|
# 输出当前时间
|
||||||
|
current_time = datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")
|
||||||
|
self.output.append(f"{current_time}")
|
||||||
|
|
||||||
|
# 获取当前选中的执行类型和鼠标按键
|
||||||
|
checked_button_type = self.button_group_type.checkedButton()
|
||||||
|
checked_button_key = self.button_group_button.checkedButton()
|
||||||
|
|
||||||
|
# 检查是否选择了执行类型和鼠标按键以及文件
|
||||||
|
if checked_button_type:
|
||||||
|
type = checked_button_type.text()
|
||||||
|
else:
|
||||||
|
type = None
|
||||||
|
|
||||||
|
if checked_button_key:
|
||||||
|
key = checked_button_key.text()
|
||||||
|
else:
|
||||||
|
key = None
|
||||||
|
|
||||||
|
if not self.file:
|
||||||
|
self.output.append("错误:没有选择文件。")
|
||||||
|
return
|
||||||
|
|
||||||
|
if not type:
|
||||||
|
self.output.append("错误:没有选择执行类型。")
|
||||||
|
return
|
||||||
|
|
||||||
|
if not key:
|
||||||
|
self.output.append("错误:没有选择鼠标按键。")
|
||||||
|
return
|
||||||
|
|
||||||
|
self.output.append(f"执行的类型: {type}")
|
||||||
|
self.output.append(f"选择的鼠标按键: {key}")
|
||||||
|
self.output.append("正在执行,若文件较大可能会出现无响应情况,请稍后……")
|
||||||
|
|
||||||
|
QApplication.processEvents()
|
||||||
|
|
||||||
|
try:
|
||||||
|
result = extract_data(type, key, self.file)
|
||||||
|
except Exception as e:
|
||||||
|
self.output.append(f"执行出错:{e}")
|
||||||
|
else:
|
||||||
|
self.output.append("执行成功。")
|
||||||
|
self.output.append("已将转换后的坐标写入result.txt,如有需要可自行利用")
|
||||||
|
self.output.append(f"已将图片保存至当前环境运行目录下的{key}.png")
|
||||||
|
time.sleep(0.5)
|
||||||
|
result.savefig(f"{key}.png")
|
||||||
|
if not from_save_button:
|
||||||
|
os.system(f"{key}.png")
|
||||||
|
|
||||||
|
def load_stylesheet(filename):
|
||||||
|
with open(filename, "r") as f:
|
||||||
|
return f.read()
|
74
MouseExtract.py
Normal file
74
MouseExtract.py
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import numpy as np
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
|
||||||
|
def extract_data(types,choise,filename):
|
||||||
|
posX, posY = 0, 0
|
||||||
|
X, Y = [], []
|
||||||
|
type_dicts = {"capdata": "usb.capdata", "usbhid": "usbhid.data"}
|
||||||
|
mytype = type_dicts[types]
|
||||||
|
choise_dicts = {"左键": "L", "右键": "R","无按键" : "N" ,"所有" : "ALL"}
|
||||||
|
mychoise = choise_dicts[choise]
|
||||||
|
os.system(f'tshark.exe -r "{filename}" -T fields -e {mytype} > usb.dat')
|
||||||
|
data = []
|
||||||
|
|
||||||
|
result = open('result.txt', 'w')
|
||||||
|
|
||||||
|
with open('usb.dat', "r") as f:
|
||||||
|
for line in f:
|
||||||
|
data.append(line[0:-1])
|
||||||
|
|
||||||
|
for i in data:
|
||||||
|
Bytes = bytes.fromhex(i)
|
||||||
|
if(len(Bytes) == 8):
|
||||||
|
horizontal = 2
|
||||||
|
vertical = 4
|
||||||
|
key = 1
|
||||||
|
elif(len(Bytes) == 6):
|
||||||
|
horizontal = 2
|
||||||
|
vertical = 3
|
||||||
|
key = 1
|
||||||
|
elif(len(Bytes) == 4):
|
||||||
|
horizontal = 1
|
||||||
|
vertical = 2
|
||||||
|
key = 0
|
||||||
|
else:
|
||||||
|
continue
|
||||||
|
offsetX = Bytes[horizontal]
|
||||||
|
offsetY = Bytes[vertical]
|
||||||
|
if offsetX > 127:
|
||||||
|
offsetX -= 256
|
||||||
|
if offsetY > 127:
|
||||||
|
offsetY -= 256
|
||||||
|
posX += offsetX
|
||||||
|
posY += offsetY
|
||||||
|
if Bytes[key] == 1:
|
||||||
|
if mychoise == "L":
|
||||||
|
X.append(posX)
|
||||||
|
Y.append(-posY)
|
||||||
|
result.write(str(posX) + ' ' + str(-posY) + '\n')
|
||||||
|
elif Bytes[key] == 2:
|
||||||
|
if mychoise == "R":
|
||||||
|
X.append(posX)
|
||||||
|
Y.append(-posY)
|
||||||
|
result.write(str(posX) + ' ' + str(-posY) + '\n')
|
||||||
|
elif Bytes[key] == 0:
|
||||||
|
if mychoise == "N":
|
||||||
|
X.append(posX)
|
||||||
|
Y.append(-posY)
|
||||||
|
result.write(str(posX) + ' ' + str(-posY) + '\n')
|
||||||
|
else:
|
||||||
|
pass
|
||||||
|
if mychoise == "ALL":
|
||||||
|
X.append(posX)
|
||||||
|
Y.append(-posY)
|
||||||
|
result.write(str(posX) + ' ' + str(-posY) + '\n')
|
||||||
|
result.close()
|
||||||
|
|
||||||
|
fig = plt.figure()
|
||||||
|
ax1 = fig.add_subplot(111)
|
||||||
|
|
||||||
|
ax1.scatter(X, Y, c='r', marker='o')
|
||||||
|
return plt
|
||||||
|
|
42
README.md
Normal file
42
README.md
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
# UsbKeyboard&Mouse_Hacker_Gui
|
||||||
|
|
||||||
|
> 本工具作用为对CTF中常见的键盘流量与鼠标流量进行解密,采用GUI的形式方便使用
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 使用帮助
|
||||||
|
|
||||||
|
使用python3执行run_GUI.py加载
|
||||||
|
|
||||||
|
```shell
|
||||||
|
python3 run_GUI.py
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
> Note:需安装PySide6、numpy、matplotlib库
|
||||||
|
> 若未换源可使用 `pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple执行`
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> 该工具并不能保证百分百能够提取出想要的内容,如果不符合常见规则可能提取结果为空。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### 键盘流量
|
||||||
|
|
||||||
|
加载文件后,选择执行类型后点击执行即可
|
||||||
|
|
||||||
|
若知道类型,可以直接选择,~~若不知道类型,反正就两种都试一下就行了~~
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### 鼠标流量
|
||||||
|
|
||||||
|
与键盘一样,加载文件后,选择执行类型后点击执行即可。
|
||||||
|
|
||||||
|
建议先选择`所有`,确定是否有输出后,再按照鼠标按键进行分类查看。
|
||||||
|
|
||||||
|

|
74
UsbKeyboardExtract.py
Normal file
74
UsbKeyboardExtract.py
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
import sys,os
|
||||||
|
|
||||||
|
normalKeys = {"04":"a", "05":"b", "06":"c", "07":"d", "08":"e", "09":"f", "0a":"g", "0b":"h", "0c":"i", "0d":"j", "0e":"k", "0f":"l", "10":"m", "11":"n", "12":"o", "13":"p", "14":"q", "15":"r", "16":"s", "17":"t", "18":"u", "19":"v", "1a":"w", "1b":"x", "1c":"y", "1d":"z","1e":"1", "1f":"2", "20":"3", "21":"4", "22":"5", "23":"6","24":"7","25":"8","26":"9","27":"0","28":"<RET>","29":"<ESC>","2a":"<DEL>", "2b":"\t","2c":"<SPACE>","2d":"-","2e":"=","2f":"[","30":"]","31":"\\","32":"<NON>","33":";","34":"'","35":"<GA>","36":",","37":".","38":"/","39":"<CAP>","3a":"<F1>","3b":"<F2>", "3c":"<F3>","3d":"<F4>","3e":"<F5>","3f":"<F6>","40":"<F7>","41":"<F8>","42":"<F9>","43":"<F10>","44":"<F11>","45":"<F12>","54":"/","55":"*","56":"-","57":"+","58":"<ENTER>","59":"1","5a":"2","5b":"3","5c":"4","5d":"5","5e":"6","5f":"7","60":"8","61":"9","62":"0","63":"."}
|
||||||
|
shiftKeys = {"04":"A", "05":"B", "06":"C", "07":"D", "08":"E", "09":"F", "0a":"G", "0b":"H", "0c":"I", "0d":"J", "0e":"K", "0f":"L", "10":"M", "11":"N", "12":"O", "13":"P", "14":"Q", "15":"R", "16":"S", "17":"T", "18":"U", "19":"V", "1a":"W", "1b":"X", "1c":"Y", "1d":"Z","1e":"!", "1f":"@", "20":"#", "21":"$", "22":"%", "23":"^","24":"&","25":"*","26":"(","27":")","28":"<RET>","29":"<ESC>","2a":"<DEL>", "2b":"\t","2c":"<SPACE>","2d":"_","2e":"+","2f":"{","30":"}","31":"|","32":"<NON>","33":"\"","34":":","35":"<GA>","36":"<","37":">","38":"?","39":"<CAP>","3a":"<F1>","3b":"<F2>", "3c":"<F3>","3d":"<F4>","3e":"<F5>","3f":"<F6>","40":"<F7>","41":"<F8>","42":"<F9>","43":"<F10>","44":"<F11>","45":"<F12>","54":"/","55":"*","56":"-","57":"+","58":"<ENTER>","59":"1","5a":"2","5b":"3","5c":"4","5d":"5","5e":"6","5f":"7","60":"8","61":"9","62":"0","63":"."}
|
||||||
|
|
||||||
|
|
||||||
|
def extract_data(types,filename):
|
||||||
|
presses = []
|
||||||
|
type_dicts = {"capdata": "usb.capdata", "usbhid": "usbhid.data"}
|
||||||
|
mytype = type_dicts[types]
|
||||||
|
|
||||||
|
os.system(f'tshark.exe -r "{filename}" -T fields -e {mytype} > usb.dat')
|
||||||
|
with open("usb.dat", "r") as f:
|
||||||
|
for line in f:
|
||||||
|
presses.append(line[0:-1])
|
||||||
|
result = ""
|
||||||
|
result_data = []
|
||||||
|
for press in presses:
|
||||||
|
if press == '':
|
||||||
|
continue
|
||||||
|
if ':' in press:
|
||||||
|
Bytes = press.split(":")
|
||||||
|
else:
|
||||||
|
Bytes = [press[i:i+2] for i in range(0, len(press), 2)]
|
||||||
|
if Bytes[0] == "00":
|
||||||
|
if Bytes[2] != "00" and normalKeys.get(Bytes[2]):
|
||||||
|
result += normalKeys[Bytes[2]]
|
||||||
|
result_data.append(normalKeys[Bytes[2]])
|
||||||
|
elif int(Bytes[0],16) & 0b10 or int(Bytes[0],16) & 0b100000:
|
||||||
|
if Bytes[2] != "00" and normalKeys.get(Bytes[2]):
|
||||||
|
result += shiftKeys[Bytes[2]]
|
||||||
|
result_data.append(shiftKeys[Bytes[2]])
|
||||||
|
else:
|
||||||
|
pass
|
||||||
|
|
||||||
|
return result,result_data
|
||||||
|
|
||||||
|
#以下是对提取的键盘流量进行加工
|
||||||
|
def process_data(res):
|
||||||
|
datas = []
|
||||||
|
delete_data = []
|
||||||
|
temp_del = []
|
||||||
|
not_last_del = False
|
||||||
|
CAP = 0
|
||||||
|
for data in res:
|
||||||
|
if(data == '<CAP>'):
|
||||||
|
CAP ^= 1
|
||||||
|
elif(data == '<DEL>'):
|
||||||
|
try:
|
||||||
|
temp_del.append(datas.pop())
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
not_last_del = True
|
||||||
|
elif(data == '<SPACE>'):
|
||||||
|
if(not_last_del):
|
||||||
|
delete_data += temp_del[::-1]
|
||||||
|
temp_del = []
|
||||||
|
datas.append(' ')
|
||||||
|
not_last_del = False
|
||||||
|
else:
|
||||||
|
if(not_last_del):
|
||||||
|
delete_data += temp_del[::-1]
|
||||||
|
temp_del = []
|
||||||
|
if(CAP == 0 or not data.isalpha()):
|
||||||
|
datas.append(data)
|
||||||
|
else:
|
||||||
|
key = [k for k, v in normalKeys.items() if v == data][0]
|
||||||
|
corresponding_value_in_shiftKeys = shiftKeys.get(key)
|
||||||
|
datas.append(corresponding_value_in_shiftKeys)
|
||||||
|
not_last_del = False
|
||||||
|
|
||||||
|
datas = ''.join(datas)
|
||||||
|
delete_data = ''.join(delete_data)
|
||||||
|
return datas,delete_data
|
3
requirements.txt
Normal file
3
requirements.txt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
PySide6
|
||||||
|
numpy
|
||||||
|
matplotlib
|
84
run_GUI.py
Normal file
84
run_GUI.py
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
from PySide6.QtWidgets import QStackedWidget,QApplication, QMainWindow, QFileDialog, QVBoxLayout, QWidget, QLabel, QLineEdit, QToolBar
|
||||||
|
from PySide6.QtGui import QAction,QIcon
|
||||||
|
import sys
|
||||||
|
from KeyboardDecrypt import KeyboardDecryptWindow
|
||||||
|
from MouseDecrypt import MouseDecryptWindow
|
||||||
|
|
||||||
|
|
||||||
|
class MainWindow(QMainWindow):
|
||||||
|
def __init__(self):
|
||||||
|
super(MainWindow, self).__init__()
|
||||||
|
|
||||||
|
self.setWindowTitle("键盘流量&鼠标流量 GUI by mumuzi")
|
||||||
|
self.keyboardDecryptWindow = KeyboardDecryptWindow(self)
|
||||||
|
self.keyboardDecryptWindow.file_dropped.connect(self.set_file)
|
||||||
|
self.mouseDecryptWindow = MouseDecryptWindow()
|
||||||
|
self.mouseDecryptWindow.file_dropped.connect(self.set_file)
|
||||||
|
|
||||||
|
self.stackedWidget = QStackedWidget(self)
|
||||||
|
self.stackedWidget.addWidget(self.keyboardDecryptWindow)
|
||||||
|
self.stackedWidget.addWidget(self.mouseDecryptWindow)
|
||||||
|
|
||||||
|
self.typeToolBar = QToolBar(self)
|
||||||
|
self.keyboardAction = QAction('键盘流量解密', self)
|
||||||
|
self.mouseAction = QAction('鼠标流量解密', self)
|
||||||
|
self.keyboardAction.triggered.connect(lambda: self.switch_window(0))
|
||||||
|
self.mouseAction.triggered.connect(lambda: self.switch_window(1))
|
||||||
|
self.typeToolBar.addAction(self.keyboardAction)
|
||||||
|
self.typeToolBar.addAction(self.mouseAction)
|
||||||
|
self.addToolBar(self.typeToolBar)
|
||||||
|
|
||||||
|
# 文件选择功能
|
||||||
|
|
||||||
|
self.fileToolBar = QToolBar(self)
|
||||||
|
self.select_file_label = QLabel("选择或拖拽文件")
|
||||||
|
self.fileToolBar.addWidget(self.select_file_label)
|
||||||
|
self.file_name = QLineEdit()
|
||||||
|
self.file_name.setReadOnly(True)
|
||||||
|
self.fileToolBar.addWidget(self.file_name)
|
||||||
|
self.select_file_button = QAction("浏览文件", self)
|
||||||
|
self.select_file_button.triggered.connect(self.select_file)
|
||||||
|
self.fileToolBar.addAction(self.select_file_button)
|
||||||
|
self.addToolBar(self.fileToolBar)
|
||||||
|
|
||||||
|
layout = QVBoxLayout()
|
||||||
|
layout.addWidget(self.stackedWidget)
|
||||||
|
|
||||||
|
self.setWindowIcon(QIcon('./img/myico.ico'))
|
||||||
|
self.setStyleSheet("""
|
||||||
|
MainWindow {background-image: url(img/mybg.jpg)}
|
||||||
|
QPushButton {background-color: transparent}
|
||||||
|
QTextEdit {background-color: rgba(255, 255, 255, 200)}
|
||||||
|
QLineEdit {background-color: rgba(255, 255, 255, 200)}
|
||||||
|
""")
|
||||||
|
|
||||||
|
centralWidget = QWidget(self)
|
||||||
|
centralWidget.setLayout(layout)
|
||||||
|
|
||||||
|
self.setCentralWidget(centralWidget)
|
||||||
|
|
||||||
|
# 设置窗口大小
|
||||||
|
self.resize(600, 450)
|
||||||
|
|
||||||
|
def switch_window(self, index):
|
||||||
|
self.stackedWidget.setCurrentIndex(index)
|
||||||
|
|
||||||
|
def select_file(self):
|
||||||
|
options = QFileDialog.Options()
|
||||||
|
fileName, _ = QFileDialog.getOpenFileName(self, "选择文件", "", "Wireshark pcapng (*.ntar *.ntar.* *.pcapng.gz *.pcapng.zst *.pcapng.lz4 *.pcapng);;tcpdump pcap (*.dmp.* *.dmp *.cap.* *.cap *.pcap.* *.pcap);;other (*.*)", options=options)
|
||||||
|
if fileName:
|
||||||
|
self.file_name.setText(fileName) # 更新file_name文本框的文本
|
||||||
|
self.keyboardDecryptWindow.set_file(fileName)
|
||||||
|
self.mouseDecryptWindow.set_file(fileName)
|
||||||
|
|
||||||
|
def set_file(self, file_name):
|
||||||
|
self.file_name.setText(file_name)
|
||||||
|
self.keyboardDecryptWindow.set_file(file_name)
|
||||||
|
self.mouseDecryptWindow.set_file(file_name)
|
||||||
|
|
||||||
|
app = QApplication(sys.argv)
|
||||||
|
|
||||||
|
window = MainWindow()
|
||||||
|
window.show()
|
||||||
|
|
||||||
|
app.exec_()
|
BIN
tshark.exe
Normal file
BIN
tshark.exe
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user