前言

本文主要对安卓微信备份后的sqlite数据库文件进行解密,这样就可以在不恢复备份的情况下查看聊天记录和通讯录等信息。主要讨论root后备份和未root使用小米备份这两种情况。本文主要基于linux环境进行操作,因为安卓使用termux即是小型linux环境。如不会使用,可在本博客搜索相关文章学习。

root情况下

root情况下,可参考之前的文章备份。

termux授予root权限后我们直接可以在安卓数据目录找到EnMicroMsg.db文件,将其复制一份到家目录:

cd && sudo cp $(sudo find /data/data/com.tencent.mm -name "EnMicroMsg.db") ~/

随后下载使用热心网友编写的java版本文件找到数据库的加密密码,使用md5(IMEI+uin)取前七位(小写),其中IMEI没找到时使用默认的1234567890ABCDEF,然后使用sqlcipher进行数据库解密。

先输入su进入root用户

找到密码:

wget https://file.sfnote.com/d/linux/IMEI.java -O IMEI.java && javac IMEI.java
key=$(sudo java IMEI /data/data/com.tencent.mm/MicroMsg/systemInfo.cfg /data/data/com.tencent.mm/MicroMsg/CompatibleInfo.cfg | tail -n 1 | cut -d":" -f2) && echo $key

解密数据库并导出:

sqlcipher EnMicroMsg.db "PRAGMA key = '$key'; PRAGMA cipher_migrate;"  '.output temp.sql' '.dump' '.open msg.db' '.read "temp.sql"' '.q'

这样我们就获取到了解密后的msg.db文件。

使用小米备份

所有操作无须root权限,小米备份后会得到一个.bak文件,github上的网友使用Winhex编辑删除头部MIUI备份信息,三丰不喜欢这种还要动鼠标的操作,于是找了一个更便捷的命令行编辑方式:只需使用cat命令查看,然后用sed删除掉前5行即可,无须安装其他软件。最后,使用abe.jar即可提取出备份的数据。

复制文件:

cd && cp $(find /sdcard/MIUI/backup/ALLBackup -name "*.bak") ~/wx.bak 

下载abe.jar工具:

wget https://github.com/nelenkov/android-backup-extractor/releases/download/master-20221109063121-8fdfc5e/abe.jar -O ~/abe.jar

提取数据:

cat wx.bak | sed '1,5d' | java -jar ~/abe.jar unpack - - | tar -xv

找到密码:

msgdir=$(find apps -name "MicroMsg")
wget https://file.sfnote.com/d/linux/IMEI.java -O IMEI.java && javac IMEI.java
key=$(java IMEI $msgdir/systemInfo.cfg $msgdir/CompatibleInfo.cfg | tail -n 1 | cut -d":" -f2) && echo $key

解密数据库并导出:

dbfile=$(find apps -name "EnMicroMsg.db")
sqlcipher $dbfile "PRAGMA key = '$key'; PRAGMA cipher_migrate;"  '.output temp.sql' '.dump' '.open msg.db' '.read "temp.sql"' '.q'

这样我们就获取到了解密后的msg.db文件。

提示命令未找到请自行使用包管理器进行安装sqlite3和sqlcipher

查找聊天记录

通过联合表来查询:

cat > msg.sh << EOF
#!/bin/bash
nickname=\$1
sqlite3 "msg.db" "
select datetime(subStr(cast(m.createTime as text),1,10),'unixepoch', 'localtime') as theTime,
case m.isSend 
    when 0 then r.nickname 
    when 1 then '我'
end as person, m.content 
from message m inner join rcontact r 
on m.talker = r.username 
where m.type = 1 and r.nickname = '\$nickname'
order by theTime;
"
EOF

通过 bash msg.sh 昵称 即可查询聊天记录

参考链接

最后修改:2023 年 10 月 17 日
如果觉得我的文章对你有用,请随意赞赏