前言
本文主要对安卓微信备份后的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 昵称 即可查询聊天记录