增加PC端微信解密条件的判断

This commit is contained in:
shuaikangzhou 2023-11-14 22:52:18 +08:00
parent 54eddea1f3
commit cc059fcbfa
6 changed files with 73 additions and 51 deletions

View File

@ -4,8 +4,13 @@
<option name="autoReloadType" value="SELECTIVE" /> <option name="autoReloadType" value="SELECTIVE" />
</component> </component>
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="84e65474-7da9-466d-baf3-cc88dde3ffdd" name="变更" comment="增加日志模块"> <list default="true" id="84e65474-7da9-466d-baf3-cc88dde3ffdd" name="变更" comment="update readme">
<change beforePath="$PROJECT_DIR$/readme.md" beforeDir="false" afterPath="$PROJECT_DIR$/readme.md" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/Ui/mainview.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/Ui/mainview.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/Ui/pc_decrypt/decryptUi.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/Ui/pc_decrypt/decryptUi.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/Ui/pc_decrypt/decryptUi.ui" beforeDir="false" afterPath="$PROJECT_DIR$/app/Ui/pc_decrypt/decryptUi.ui" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/Ui/pc_decrypt/pc_decrypt.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/Ui/pc_decrypt/pc_decrypt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/decrypt/get_wx_info.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/decrypt/get_wx_info.py" afterDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -71,7 +76,7 @@
<recent name="D:\Project\PythonProject\WeChatMsg\app\Ui" /> <recent name="D:\Project\PythonProject\WeChatMsg\app\Ui" />
</key> </key>
</component> </component>
<component name="RunManager" selected="Python.main"> <component name="RunManager" selected="Python.decrypt_window">
<configuration name="decrypt" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true"> <configuration name="decrypt" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="WeChatMsg" /> <module name="WeChatMsg" />
<option name="INTERPRETER_OPTIONS" value="" /> <option name="INTERPRETER_OPTIONS" value="" />
@ -200,8 +205,8 @@
</configuration> </configuration>
<recent_temporary> <recent_temporary>
<list> <list>
<item itemvalue="Python.main" />
<item itemvalue="Python.decrypt_window" /> <item itemvalue="Python.decrypt_window" />
<item itemvalue="Python.main" />
<item itemvalue="Python.decrypt" /> <item itemvalue="Python.decrypt" />
<item itemvalue="Python.get_wx_info" /> <item itemvalue="Python.get_wx_info" />
<item itemvalue="Python.micro_msg (1)" /> <item itemvalue="Python.micro_msg (1)" />
@ -220,13 +225,6 @@
<option name="presentableId" value="Default" /> <option name="presentableId" value="Default" />
<updated>1672848140146</updated> <updated>1672848140146</updated>
</task> </task>
<task id="LOCAL-00006" summary="导出word文档">
<created>1674438226232</created>
<option name="number" value="00006" />
<option name="presentableId" value="LOCAL-00006" />
<option name="project" value="LOCAL" />
<updated>1674438226232</updated>
</task>
<task id="LOCAL-00007" summary="导出word文档"> <task id="LOCAL-00007" summary="导出word文档">
<created>1674438387238</created> <created>1674438387238</created>
<option name="number" value="00007" /> <option name="number" value="00007" />
@ -563,7 +561,14 @@
<option name="project" value="LOCAL" /> <option name="project" value="LOCAL" />
<updated>1699883702806</updated> <updated>1699883702806</updated>
</task> </task>
<option name="localTasksCounter" value="55" /> <task id="LOCAL-00055" summary="update readme">
<created>1699884085863</created>
<option name="number" value="00055" />
<option name="presentableId" value="LOCAL-00055" />
<option name="project" value="LOCAL" />
<updated>1699884085863</updated>
</task>
<option name="localTasksCounter" value="56" />
<servers /> <servers />
</component> </component>
<component name="UnknownFeatures"> <component name="UnknownFeatures">
@ -622,9 +627,9 @@
<MESSAGE value="增加导航按钮效果" /> <MESSAGE value="增加导航按钮效果" />
<MESSAGE value="新增PC数据库解密" /> <MESSAGE value="新增PC数据库解密" />
<MESSAGE value="main首次加载解密界面" /> <MESSAGE value="main首次加载解密界面" />
<MESSAGE value="update readme" />
<MESSAGE value="增加日志模块" /> <MESSAGE value="增加日志模块" />
<option name="LAST_COMMIT_MESSAGE" value="增加日志模块" /> <MESSAGE value="update readme" />
<option name="LAST_COMMIT_MESSAGE" value="update readme" />
<option name="OPTIMIZE_IMPORTS_BEFORE_PROJECT_COMMIT" value="true" /> <option name="OPTIMIZE_IMPORTS_BEFORE_PROJECT_COMMIT" value="true" />
<option name="REFORMAT_BEFORE_PROJECT_COMMIT" value="true" /> <option name="REFORMAT_BEFORE_PROJECT_COMMIT" value="true" />
</component> </component>

View File

@ -7,7 +7,6 @@
@Version : Python3.10 @Version : Python3.10
@comment : 主窗口 @comment : 主窗口
""" """
from PyQt5.QtCore import * from PyQt5.QtCore import *
from PyQt5.QtGui import * from PyQt5.QtGui import *
from PyQt5.QtWidgets import * from PyQt5.QtWidgets import *
@ -69,6 +68,7 @@ class MainWinController(QMainWindow, mainwindow.Ui_MainWindow):
# 创建右键菜单函数 # 创建右键菜单函数
def init_ui(self): def init_ui(self):
# self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
self.menubar.setStyleSheet("background-color: rgb(240, 240, 240);") self.menubar.setStyleSheet("background-color: rgb(240, 240, 240);")
def create_rightmenu(self): def create_rightmenu(self):

View File

@ -42,54 +42,55 @@ class Ui_Dialog(object):
self.label_ready = QtWidgets.QLabel(Dialog) self.label_ready = QtWidgets.QLabel(Dialog)
self.label_ready.setGeometry(QtCore.QRect(40, 260, 41, 21)) self.label_ready.setGeometry(QtCore.QRect(40, 260, 41, 21))
self.label_ready.setObjectName("label_ready") self.label_ready.setObjectName("label_ready")
self.widget = QtWidgets.QWidget(Dialog) self.layoutWidget = QtWidgets.QWidget(Dialog)
self.widget.setGeometry(QtCore.QRect(20, 50, 221, 151)) self.layoutWidget.setGeometry(QtCore.QRect(20, 50, 221, 151))
self.widget.setObjectName("widget") self.layoutWidget.setObjectName("layoutWidget")
self.gridLayout = QtWidgets.QGridLayout(self.widget) self.gridLayout = QtWidgets.QGridLayout(self.layoutWidget)
self.gridLayout.setContentsMargins(0, 0, 0, 0) self.gridLayout.setContentsMargins(0, 0, 0, 0)
self.gridLayout.setObjectName("gridLayout") self.gridLayout.setObjectName("gridLayout")
self.label_wxid = QtWidgets.QLabel(self.widget) self.label = QtWidgets.QLabel(self.layoutWidget)
self.label_wxid.setText("")
self.label_wxid.setObjectName("label_wxid")
self.gridLayout.addWidget(self.label_wxid, 4, 1, 1, 1)
self.label = QtWidgets.QLabel(self.widget)
self.label.setObjectName("label") self.label.setObjectName("label")
self.gridLayout.addWidget(self.label, 0, 0, 1, 1) self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
self.label_2 = QtWidgets.QLabel(self.widget) self.label_2 = QtWidgets.QLabel(self.layoutWidget)
self.label_2.setObjectName("label_2") self.label_2.setObjectName("label_2")
self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1) self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1)
self.label_5 = QtWidgets.QLabel(self.widget) self.label_5 = QtWidgets.QLabel(self.layoutWidget)
self.label_5.setObjectName("label_5") self.label_5.setObjectName("label_5")
self.gridLayout.addWidget(self.label_5, 3, 0, 1, 1) self.gridLayout.addWidget(self.label_5, 3, 0, 1, 1)
self.label_4 = QtWidgets.QLabel(self.widget) self.label_4 = QtWidgets.QLabel(self.layoutWidget)
self.label_4.setObjectName("label_4") self.label_4.setObjectName("label_4")
self.gridLayout.addWidget(self.label_4, 4, 0, 1, 1) self.gridLayout.addWidget(self.label_4, 4, 0, 1, 1)
self.label_key = QtWidgets.QLabel(self.widget) self.label_key = QtWidgets.QLabel(self.layoutWidget)
self.label_key.setText("") self.label_key.setText("")
self.label_key.setObjectName("label_key") self.label_key.setObjectName("label_key")
self.gridLayout.addWidget(self.label_key, 5, 1, 1, 1) self.gridLayout.addWidget(self.label_key, 5, 1, 1, 1)
self.label_phone = QtWidgets.QLabel(self.widget) self.label_phone = QtWidgets.QLabel(self.layoutWidget)
self.label_phone.setText("") self.label_phone.setText("")
self.label_phone.setObjectName("label_phone") self.label_phone.setObjectName("label_phone")
self.gridLayout.addWidget(self.label_phone, 2, 1, 1, 1) self.gridLayout.addWidget(self.label_phone, 2, 1, 1, 1)
self.label_6 = QtWidgets.QLabel(self.widget) self.label_6 = QtWidgets.QLabel(self.layoutWidget)
self.label_6.setObjectName("label_6") self.label_6.setObjectName("label_6")
self.gridLayout.addWidget(self.label_6, 5, 0, 1, 1) self.gridLayout.addWidget(self.label_6, 5, 0, 1, 1)
self.label_pid = QtWidgets.QLabel(self.widget) self.label_pid = QtWidgets.QLabel(self.layoutWidget)
self.label_pid.setText("") self.label_pid.setText("")
self.label_pid.setObjectName("label_pid") self.label_pid.setObjectName("label_pid")
self.gridLayout.addWidget(self.label_pid, 0, 1, 1, 1) self.gridLayout.addWidget(self.label_pid, 0, 1, 1, 1)
self.label_name = QtWidgets.QLabel(self.widget) self.label_name = QtWidgets.QLabel(self.layoutWidget)
self.label_name.setText("") self.label_name.setText("")
self.label_name.setObjectName("label_name") self.label_name.setObjectName("label_name")
self.gridLayout.addWidget(self.label_name, 3, 1, 1, 1) self.gridLayout.addWidget(self.label_name, 3, 1, 1, 1)
self.label_7 = QtWidgets.QLabel(self.widget) self.label_7 = QtWidgets.QLabel(self.layoutWidget)
self.label_7.setObjectName("label_7") self.label_7.setObjectName("label_7")
self.gridLayout.addWidget(self.label_7, 1, 0, 1, 1) self.gridLayout.addWidget(self.label_7, 1, 0, 1, 1)
self.label_version = QtWidgets.QLabel(self.widget) self.label_version = QtWidgets.QLabel(self.layoutWidget)
self.label_version.setText("") self.label_version.setText("")
self.label_version.setObjectName("label_version") self.label_version.setObjectName("label_version")
self.gridLayout.addWidget(self.label_version, 1, 1, 1, 1) self.gridLayout.addWidget(self.label_version, 1, 1, 1, 1)
self.lineEdit = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEdit.setStyleSheet("background:transparent;border-width:0;border-style:outset")
self.lineEdit.setFrame(False)
self.lineEdit.setObjectName("lineEdit")
self.gridLayout.addWidget(self.lineEdit, 4, 1, 1, 1)
self.gridLayout.setColumnMinimumWidth(0, 1) self.gridLayout.setColumnMinimumWidth(0, 1)
self.gridLayout.setColumnMinimumWidth(1, 2) self.gridLayout.setColumnMinimumWidth(1, 2)
self.gridLayout.setRowMinimumHeight(5, 10) self.gridLayout.setRowMinimumHeight(5, 10)

View File

@ -102,7 +102,7 @@
<string>未就绪</string> <string>未就绪</string>
</property> </property>
</widget> </widget>
<widget class="QWidget" name=""> <widget class="QWidget" name="layoutWidget">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>20</x> <x>20</x>
@ -113,13 +113,6 @@
</property> </property>
<layout class="QGridLayout" name="gridLayout" rowstretch="0,0,0,0,0,10" columnstretch="1,3" <layout class="QGridLayout" name="gridLayout" rowstretch="0,0,0,0,0,10" columnstretch="1,3"
rowminimumheight="0,0,0,0,0,10" columnminimumwidth="1,2"> rowminimumheight="0,0,0,0,0,10" columnminimumwidth="1,2">
<item row="4" column="1">
<widget class="QLabel" name="label_wxid">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="text"> <property name="text">
@ -197,6 +190,16 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="4" column="1">
<widget class="QLineEdit" name="lineEdit">
<property name="styleSheet">
<string notr="true">background:transparent;border-width:0;border-style:outset</string>
</property>
<property name="frame">
<bool>false</bool>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
<widget class="QPushButton" name="pushButton_3"> <widget class="QPushButton" name="pushButton_3">

View File

@ -23,22 +23,29 @@ class DecryptControl(QWidget, decryptUi.Ui_Dialog):
self.btn_getinfo.clicked.connect(self.get_info) self.btn_getinfo.clicked.connect(self.get_info)
self.btn_db_dir.clicked.connect(self.select_db_dir) self.btn_db_dir.clicked.connect(self.select_db_dir)
self.info = {} self.info = {}
self.lineEdit.setFocus()
self.ready = False self.ready = False
self.wx_dir = None self.wx_dir = None
# @log
def get_info(self): def get_info(self):
try: try:
result = get_wx_info.get_info() result = get_wx_info.get_info()
if result == -1:
QMessageBox.critical(self, "错误", "请登录微信")
elif result == -2:
QMessageBox.critical(self, "错误", "微信版本不匹配\n请更新微信版本为:3.9.8.15")
# print(result) # print(result)
if result: else:
self.ready = True self.ready = True
self.info = result[0] self.info = result[0]
self.label_key.setText(self.info['key']) self.label_key.setText(self.info['key'])
self.label_wxid.setText(self.info['wxid']) self.lineEdit.setText(self.info['wxid'])
self.label_name.setText(self.info['name']) self.label_name.setText(self.info['name'])
self.label_phone.setText(self.info['mobile']) self.label_phone.setText(self.info['mobile'])
self.label_pid.setText(str(self.info['pid'])) self.label_pid.setText(str(self.info['pid']))
self.label_version.setText(self.info['version']) self.label_version.setText(self.info['version'])
self.lineEdit.setFocus()
if self.wx_dir and os.path.exists(os.path.join(self.wx_dir, self.info['wxid'])): if self.wx_dir and os.path.exists(os.path.join(self.wx_dir, self.info['wxid'])):
self.label_ready.setText('已就绪') self.label_ready.setText('已就绪')
except Exception as e: except Exception as e:
@ -59,14 +66,16 @@ class DecryptControl(QWidget, decryptUi.Ui_Dialog):
if not self.ready: if not self.ready:
QMessageBox.critical(self, "错误", "请先获取密钥") QMessageBox.critical(self, "错误", "请先获取密钥")
return return
if not self.wx_dir:
QMessageBox.critical(self, "错误", "请先选择微信安装路径")
return
if self.lineEdit.text() == 'None':
QMessageBox.critical(self, "错误", "请填入wxid")
return
if self.ready: if self.ready:
if not os.path.exists(os.path.join(self.wx_dir, self.info['wxid'])): if not os.path.exists(os.path.join(self.wx_dir, self.info['wxid'])):
QMessageBox.critical(self, "错误", "文件夹选择错误\n一般以WeChat Files结尾") QMessageBox.critical(self, "错误", "文件夹选择错误\n一般以WeChat Files结尾")
return return
# self.thread1 = MyThread()
# self.thread1.signal.connect(self.progressBar_view)
# self.thread1.start()
db_dir = os.path.join(self.wx_dir, self.info['wxid'], 'Msg') db_dir = os.path.join(self.wx_dir, self.info['wxid'], 'Msg')
self.thread2 = DecryptThread(db_dir, self.info['key']) self.thread2 = DecryptThread(db_dir, self.info['key'])
self.thread2.maxNumSignal.connect(self.setProgressBarMaxNum) self.thread2.maxNumSignal.connect(self.setProgressBarMaxNum)

View File

@ -12,6 +12,8 @@ import json
import psutil import psutil
from win32com.client import Dispatch from win32com.client import Dispatch
from app.log import log
ReadProcessMemory = ctypes.windll.kernel32.ReadProcessMemory ReadProcessMemory = ctypes.windll.kernel32.ReadProcessMemory
void_p = ctypes.c_void_p void_p = ctypes.c_void_p
@ -30,7 +32,7 @@ def get_info_wxid(h_process, address, n_size=32, address_len=8):
if ReadProcessMemory(h_process, void_p(address), array, address_len, 0) == 0: return "None" if ReadProcessMemory(h_process, void_p(address), array, address_len, 0) == 0: return "None"
address = int.from_bytes(array, byteorder='little') # 逆序转换为int地址key地址 address = int.from_bytes(array, byteorder='little') # 逆序转换为int地址key地址
wxid = get_info_without_key(h_process, address, n_size) wxid = get_info_without_key(h_process, address, n_size)
if not wxid.startswith("wxid_"): wxid = "None" # if not wxid.startswith("wxid_"): wxid = "None"
return wxid return wxid
@ -46,6 +48,7 @@ def get_key(h_process, address, address_len=8):
# 读取微信信息(account,mobile,name,mail,wxid,key) # 读取微信信息(account,mobile,name,mail,wxid,key)
@log
def read_info(version_list): def read_info(version_list):
wechat_process = [] wechat_process = []
result = [] result = []
@ -55,7 +58,7 @@ def read_info(version_list):
wechat_process.append(process) wechat_process.append(process)
if len(wechat_process) == 0: if len(wechat_process) == 0:
return "[-] WeChat No Run" return -1
for process in wechat_process: for process in wechat_process:
tmp_rd = {} tmp_rd = {}
@ -65,7 +68,7 @@ def read_info(version_list):
bias_list = version_list.get(tmp_rd['version'], None) bias_list = version_list.get(tmp_rd['version'], None)
if not isinstance(bias_list, list): if not isinstance(bias_list, list):
return f"[-] WeChat Current Version {tmp_rd['version']} Is Not Supported" return -2
wechat_base_address = 0 wechat_base_address = 0
for module in process.memory_maps(grouped=False): for module in process.memory_maps(grouped=False):
@ -97,6 +100,7 @@ def read_info(version_list):
return result return result
@log
def get_info(): def get_info():
VERSION_LIST_PATH = "app/decrypt/version_list.json" VERSION_LIST_PATH = "app/decrypt/version_list.json"