下载链接:https://slproweb.com/download/Win64OpenSSL-3_1_4.exe
安装过程参考:https://blog.csdn.net/m0_65939803/article/details/128932476
说明:验证openssl时需要重启电脑,不然openssl version会报错,当然不验证也没关系,其实没什么影响
下载链接:https://www.alipan.com/s/CYerTE4uqGG
这都2023年了,相信大家都很奇怪,为什么还要用python-3.6。
原因很简单,解密聊天记录需要的一个python库 pysqlcipher3已经好久没更新了,最高支持到python-3.6,其他版本无法编译通过,因此必须安装python3.6
注意:pysqlcipher3-1.2.0-cp36-cp36m-win_amd64.whl 私信作者获取
pip install re
pip install hashlib
pip install pandas
pip install pymysql
pip install .\pysqlcipher3-1.2.0-cp36-cp36m-win_amd64.whl
在设置中找到我的设备------>备份与恢复------>选择备份微信
小米备份的存储位置为 MIUI/backup/AllBackup/备份的日期/微信(com.tencent.mm).bak
第一步:将微信(com.tencent.mm).bak 重命名为 微信(com.tencent.mm).zip
第二步:使用7-ZIP(其他的解压缩软件解压不出来)解压微信(com.tencent.mm).zip
代码内容如下
import re
import os
import hashlib
import pandas as pd
from pysqlcipher3 import dbapi2 as sqlite
from pymysql.converters import escape_string
sqlkeys=[]
databasepath=[]
# 解密数据库
def DecodeDataBase(path,i):
# 加密文件路径
encrypted_file = path
# 解密文件路径
decrypted_file = str(i+1)+"_Decode.db"
print(decrypted_file)
# 提供加密密钥
for key in sqlkeys:
try:
# 连接到加密数据库文件
conn = sqlite.connect(encrypted_file)
# 设置加密密钥
conn.execute(f"PRAGMA key='{key}'")
# 添加这一行,将数据库文件转换为 SQLCipher 4 格式
conn.execute("PRAGMA cipher_migrate")
# 备份到新的解密数据库文件
conn.execute(f"ATTACH DATABASE '{decrypted_file}' AS decrypted KEY '';")
conn.execute("SELECT sqlcipher_export('decrypted');")
conn.execute("DETACH DATABASE decrypted;")
# 关闭连接
conn.close()
except Exception as e:
print(e)
# 获取当前目录下的文件和文件夹名称
def GetFileName(path):
dirs = os.listdir(path)
return dirs
# 计算数据库密码
def calculate_md5(string):
md5_hash = hashlib.md5()
md5_hash.update(string.encode('utf-8'))
return md5_hash.hexdigest()
# uin 是生成数据库密码的两个参数之一,存储在auth_info_key_prefs.xml中
def GetUin(path):
print(path)
uin=""
with open(path, 'r', encoding='UTF-8') as file_obj:
lines = file_obj.readlines()
for line in lines:
if "auth_uin" in line:
uin=re.compile('(?<=value=").*?(?=")').findall(str(line))[0]
print(uin)
return uin
# 获取数据库的密码
def GetKey(path):
# 生成IME列表,IME是生成数据库密码的两个参数中的另一个参数
if not os.path.exists("IMELists.txt"):
IMELists=["1234567890ABCDEF"]
order=1
while order==1:
order=int(input("请输入要执行的指令:\n1.手动输入IME\t2.使用默认IME并停止输入\n:"))
if order==1:
IME=str(input("请输入IME号:\n"))
IMELists.append(IME)
with open("IMELists.txt", 'a', encoding='UTF-8') as file_obj:
for IME in IMELists:
file_obj.write(IME+"\n")
lines=[]
result=[]
# 计算数据库的密码,数据库密码的计算方式为 IME+UIN 取MD5前七位
with open("IMELists.txt", 'r', encoding='UTF-8') as file_obj:
lines = file_obj.readlines()
for line in lines:
uin=GetUin(path)
IME=str(line).strip()
key=calculate_md5(IME+uin)
result.append(key[0:7])
return result
# 递归遍历当前目录,寻找数据库文件以及auth_info_key_prefs.xml
def Visit(path):
global sqlkeys
if os.path.isdir(path):
path=path+'/'
try:
dirs=GetFileName(path)
for dir in dirs:
new_path=path+dir
Visit(new_path)
except Exception as e:
print(e)
else:
if "auth_info_key_prefs.xml" in path:
sqlkeys=GetKey(path)
for key in sqlkeys:
print("微信数据库密码可能为:", key)
if "EnMicroMsg.db"==path[-13:]:
databasepath.append(str(path).replace("./",""))
path=str(path).replace("./","")
print("微信聊天记录存储位置为:",path)
if __name__ == '__main__':
Visit(".")
for i in range(0,len(databasepath)):
path=databasepath[i]
DecodeDataBase(path,i)
input("键入任意内容回车后结束运行!")
运行 解密.py
运行后会生成 数字_Decode.db,这就是我们微信聊天记录解密后的sqlite文件了
Navicat、DataGrip或者其他数据库查询工具都是可以打开的
推荐使用DataGrip,查看起来比较友好
执行如下SQL 就可以查询聊天记录了
SELECT iif(iif(
iif(talker like "%chatroom%", "群聊", "其他") = "其他" and talker not like "gh_%", "朋友",
iif(talker like "%chatroom%", "群聊", "其他"))="其他"
and talker like "gh_%","公众号",iif(
iif(talker like "%chatroom%", "群聊", "其他") = "其他" and talker not like "gh_%", "朋友",
iif(talker like "%chatroom%", "群聊", "其他"))) as 聊天类型,
iif(conRemark !="",conRemark,nickname) as 用户名称,
content as 聊天内容,
DATETIME(createTime / 1000, 'unixepoch') as 时间
from rcontact,
message
WHERE message.talker = rcontact.username
order by 聊天类型,用户名称,时间;