0 背景
1 PC 记录导出
1.1 数据库位置
1.2 获取密钥
1.3 解密
2 手机记录导出
2.1 备份记录到电脑
2.2 恢复记录到模拟器
2.3 获取数据库
2.4 获取密钥
2.5 解密
后话
0 背景
万门童某跑路了,把之前的交流群也解散了。一帮热心的伙伴试图根据之前的聊天记录,把群友们找回来。一开始大家是通过翻手机的方式,逐个寻找,找回了 150 多号人。但越到后来,翻记录就越是难找了。于是大家找到我,问能否把聊天记录导出,来协助快速核对。
1 PC 记录导出
注意:这一节操作在 Windows 平台进行。
1.1 数据库位置
数据库位置
聊天记录存储在multi目录下的MSG0.db:C:\Users\xxxxxx\Documents\WeChat Files\wxid_xxxxxxxxxx\Msg\Multi
聊天记录位置1.2 获取密钥
获取密钥1.3 解密
通过以下代码(crack_wechat_msg_pc.py)对数据库进行解密,需要修改对应的密钥:
#!/usr/bin/envpython3#-*-coding:utf-8-*-importhmacimportctypesimporthashlibfromCrypto.CipherimportAESdefdecrypt_msg(path,password):KEY_SIZE=32DEFAULT_ITER=64000DEFAULT_PAGESIZE=4096#4048数据 16IV 20HMAC 12SQLITE_FILE_HEADER=bytes(“SQLiteformat3″,encoding=”ASCII”) bytes(1)#SQLite文件头withopen(path,”rb”)asf:#TODO:优化,考虑超大文件blist=f.read()salt=blist[:16]#前16字节为盐key=hashlib.pbkdf2_hmac(“sha1”,password,salt,DEFAULT_ITER,KEY_SIZE)#获得Keypage1=blist[16:DEFAULT_PAGESIZE]#丢掉saltmac_salt=bytes([x^0x3aforxinsalt])mac_key=hashlib.pbkdf2_hmac(“sha1″,key,mac_salt,2,KEY_SIZE)hash_mac=hmac.new(mac_key,digestmod=”sha1”)hash_mac.update(page1[:-32])hash_mac.update(bytes(ctypes.c_int(1)))ifhash_mac.digest()!=page1[-32:-12]:raiseRuntimeError(“WrongPassword”)pages=[blist[i:i DEFAULT_PAGESIZE]foriinrange(DEFAULT_PAGESIZE,len(blist),DEFAULT_PAGESIZE)]pages.insert(0,page1)#把第一页补上withopen(f”{path}.dec.db”,”wb”)asf:f.write(SQLITE_FILE_HEADER)#写入文件头foriinpages:t=AES.new(key,AES.MODE_CBC,i[-48:-32])f.write(t.decrypt(i[:-48]))f.write(i[-48:])if__name__==”__main__”:path=”MSG0.db”key=bytes.fromhex(“刚才获取到的密钥”)decrypt_msg(path,key)
至此,我们已经获取了明文数据库,后续根据需求进一步处理,可以使用DB Browser for SQLite、DBeaver等工具查看。
2 手机记录导出
2.1 备份记录到电脑
聊天记录备份与恢复2.2 恢复记录到模拟器
一方面,大部分手机root后会失去保修;另一方面,root后可能会让手机处于城门大开状态,所以不会轻易root,于是就通过模拟器曲线救国。
2.2.1 安装模拟器
这里选择的是网易的MuMu模拟器[1],根据系统,下载安装即可。
2.2.2 基本设置
安装完成后,需要做一些基本设置。
??Mac 版
模拟器设置-Mac
??Windows 版
操作类似,打开 MuMu 模拟器右上角设置中心——基本设置——root权限,选择开启(如果没有该选项,则说明模拟器已默认开启root权限)。可参考《打开“共享文件夹”提示没有ROOT权限》[2]。
模拟器设置-Windows
共享文件可通过主界面下方的文件共享打开:
文件共享2.2.3 配置文件管理器
打开超级用户访问模式1
2.2.5 同步聊天记录
一切准备妥当,接下来可以把聊天记录恢复到模拟器(假手机)里了。
3. 等待恢复完成。….
2.3 获取数据库
经过步骤 2.2,加密的聊天记录已经同步到模拟器(假手机)里了。我们需要把加密记录拿出来:
2.选中加密的聊天记录数据库EnMicroMsg.db(打上前面的对勾)
4.再选择共享文件夹(Mac 下默认是$mumu共享文件夹)
获取加密数据库2.4 获取密钥
2.4.1 获取IMEI号
虽然说手机的IMEI号是唯一的,但模拟器的却不是。经验证,无论是 Mac 平台还是 Windows 平台,MuMu 模拟器的 IMEI 均为:1234567890ABCDEF。
2.4.2 获取uin
1.从根(/)目录一路往下走data,data,com.tencent.mm,shared_prefs
4.获取uin,双引号里面的即为uin(包括负号,如果有的话)
获取 uin2.4.3 生成密钥
把前面获取到的IMEI号和uin码(假设为:-123456789)放到下面的代码,即可获得密钥:9eeab65。
#!/usr/bin/envpython3#-*-coding:utf-8-*-importhashlibdefget_key(imei,uin):returnhashlib.md5(f”{imei}{uin}”.encode(“utf-8″)).digest().lower().hex()[:7]if__name__==”__main__”:imei=”1234567890ABCDEF”uin=”-123456789″key=get_key(imei,uin)print(key)
不想写代码,也可以通过在线工具[3]来解决:把IMEI号和uin码拼在一起,得到:1234567890ABCDEF-123456789,输入在线工具,即可获得密钥:9eeab65(取前 7 位)。
2.5 解密
有了密钥,就可以进行解密了。
2.5.1 代码解密
写不动了,参考 1.3 自己改吧。
2.5.2 SQLCIPHER 解密
??Windows
下载SQLCIPHER[4]并解压,打开SQLCIPHER:
2.输入密码
4.切换到浏览数据功能
5.选择消息表,然后就可以看到聊天记录了
6.选择File,Export,可以把聊天记录导出
解密数据库
??Mac
Mac 版下,用命令行会更方便些,打开终端(Terminal),输入命令安装sqlcipher:
brewinstallsqlcipher
什么?没有Homebrew?强烈建议使用,请参考:https://brew.sh/
安装好sqlcipher之后,就可以借助它来解密数据库了,把{数据库}替换成实际的数据库名(本例中为EnMicroMsg.db),{密码}替换成刚才获得的密钥:
sqlcipher{数据库}’PRAGMAkey=”{密码}”;PRAGMAcipher_page_size=1024;PRAGMAcipher_compatibility=1;ATTACHDATABASE”decrypted_database.db”ASdecrypted_databaseKEY””;SELECTsqlcipher_export(“decrypted_database”);DETACHDATABASEdecrypted_database;’#注意替换{数据库}和{密码},如:sqlcipherEnMicroMsg.db’PRAGMAkey=”9eeab65″;PRAGMAcipher_page_size=1024;PRAGMAcipher_compatibility=1;ATTACHDATABASE”decrypted_database.db”ASdecrypted_databaseKEY””;SELECTsqlcipher_export(“decrypted_database”);DETACHDATABASEdecrypted_database;’
解密完之后就得到了明文数据库decrypted_database.db,然后可以使用各种工具打开进行下一步操作。当然,也可以用代码直接把聊天记录导出:
conn=sqlite3.connect(“decrypted_database.db”)cur=conn.cursor()sql=”select*frommessage”cur.execute(sql)res=cur.fetchall()#所有的聊天记录都在res里了(如果记录超多,可能会OOM)
后话
虽然用了好多图,但感觉还是有地方表达不清楚,后续考虑录个视频。
引用链接
[1]MuMu模拟器:https://mumu.163.com/[2]《打开“共享文件夹”提示没有ROOT权限》:https://mumu.163.com/help/20210513/35047_947573.html[3]在线工具:http://emn178.github.io/online-tools/md5.html[4]SQLCIPHER:https://pan.baidu.com/s/1IhAipYUKNeu41N00jAIgzg?pwd=ya8z