小米 6 提取微信聊天记录笔记
通过 MI6 本地备份提取聊天记录
要导出微信安卓客户端的聊天记录,首先得找到聊天记录的数据库。
安卓客户端的聊天记录储存在私有目录 /data/data/com.tencent.mm/MicroMsg 下,这个目录需要 root 权限才能进去,但是,那样太太太麻烦了,好在我们 MI6 有本地备份的功能,利用这个功能。我们轻而易举就可以获得数据库。
需要的工具
abe.jar IMEI.java IMEI.class MapTest.java MapTest.class
环境
需要安装 Java 环境,未安装可以搜索 Java 安装
提取数据库
首先到手机:设置->更多设置->备份和重置->本地备份 里面点击新建备份,选择软件程序中的微信进行备份
然后到文件管理
/内部储存设备/MIUI/backup/ALLBackup/下将备份的文件夹复制到电脑接下来是从备份的文件中提取微信聊天记录,通过
WinHex软件查看备份包信息,发现 miui 备份包是在原生安卓的备份基础上多加了一个文件头。选中多余的文件头,按delete键删除,点击保存。修改后的文件就是标准的原生安卓备份文件。

- 接下来,将修改后的
com.tencent.mm.bak处理成原文件,首先将abe.jar复制到和com.tencent.mm.bak同一个文件夹下 终端执行:
java -jar abe.jar unpack com.tencent.mm.bak mm.tar
会生成一个 mm.tar 文件,用解压软件将这个包解压,会得到一个apps文件夹,apps文件夹下面有com.tencent.mm文件夹,聊天记录数据库就存在apps/com.tencent.mm/r/MicroMsg/ 下,打开文件夹会发现里面有 32 位字符 (MD5 值) 的文件夹 (登录过多个用户的有多个),打开此文件夹其中EnMicroMsg.db就是要找的数据库文件。
生成数据库密码
找到聊天数据库了,但是目前还不能得到聊天记录,因为这个数据库是sqlcipher加密数据库,需要密码才能打开。
数据库密码有很多种生成方式:
手机
IMEI+uin(微信用户 iduserinformation) 将拼接的字符串MD5 加密取前 7 位如
IMEI为123456,uin为abc,则拼接后的字符串为123456abc将此字符串用MD5 加密(32 位) 后为
df10ef8509dc176d733d59549e7dbfaf那么前 7 位df10ef8就是数据库的密码,由于有的手机是双卡,有多个IMEI,或者当手机获取不到IMEI时会用默认字符串1234567890ABCDEF来代替,由于种种原因,并不是所有人都能得出正确的密码,此时我们可以换一种方法。反序列化
CompatibleInfo.cfg和systemInfo.cfg不管是否有多个
IMEI,或者是微信客户端没有获取到IMEI,而使用默认字符串代替,微信客户端都会将使用的信息保存在MicroMsg文件夹下面的CompatibleInfo.cfg和systemInfo.cfg文件中,可以通过这两个文件来得到正确的密码,但是这两个文件需要处理才能看到信息。使用 hook 方式得到数据库的密码,这个方法最有效参考
暴力破解
…
使用反序列化的方式获得密码
由于我的手机有多个IMEI码,试了半天出来的密码都不对,故使用此方法来得到密码。
首先将CompatibleInfo.cfg和systemInfo.cfg以及EnMicroMsg.db复制出来,将下面这段代码保存到IMEI.java文件
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.security.MessageDigest;
import java.util.HashMap;
public class IMEI {
public static void main(String[] args) {
try {
ObjectInputStream in = new ObjectInputStream(new FileInputStream(
args[0]));
Object DL = in.readObject();
HashMap hashWithOutFormat = (HashMap) DL;
ObjectInputStream in1 = new ObjectInputStream(new FileInputStream(
args[1]));
Object DJ = in1.readObject();
HashMap hashWithOutFormat1 = (HashMap) DJ;
String s = String.valueOf(hashWithOutFormat1.get(Integer
.valueOf(258))); // 取手机的 IMEI
System.out.println("The IMEI is : " + s);
String uin = String.valueOf(hashWithOutFormat.get(Integer.valueOf(1)));
System.out.println("The uin is : " + uin);
s = s + uin; //合并到一个字符串
s = encode(s); // hash
System.out.println("The Key is : " + s.substring(0, 7));
in.close();
in1.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static String encode(String content)
{
try {
MessageDigest digest = MessageDigest.getInstance("MD5");
digest.update(content.getBytes());
return getEncode32(digest);
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
private static String getEncode32(MessageDigest digest)
{
StringBuilder builder = new StringBuilder();
for (byte b : digest.digest())
{
builder.append(Integer.toHexString((b >> 4) & 0xf));
builder.append(Integer.toHexString(b & 0xf));
}
return builder.toString();
}
}
将这段代码保存到IMEI.java文件,将三个文件放在相同目录下
终端运行
javac IMEI.java
java IMEI systemInfo.cfg CompatibleInfo.cfg
运行完成后就会得到密码 参考链接
解密数据库
Windows 用户可以使用sqlcipher.exe软件来查看数据库
打开数据库,输入密码,就可以查看数据库中的表
文字聊天记录储存在message表中,可以选中表,点击软件的右上角 file-export 导出表到csv文件,可以通过 Excell 查看表中的信息
执行这段命令可以查看制定对象的聊天记录
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 = '对方微信昵称'
Linux 用户可以使用sqlcipher来解密
sudo apt-get update
sudo apt-get install sqlcipher
sqlcipher EnMicroMsg.db 'PRAGMA key = "yourkey"; PRAGMA cipher_use_hmac = off; PRAGMA kdf_iter = 4000; ATTACH DATABASE "decrypted_database.db" AS decrypted_database KEY "";SELECT sqlcipher_export("decrypted_database");DETACH DATABASE decrypted_database;'
执行上面的命令之后会得到一个解密后的数据库decrypted_database.db,可以使用数据库软件查看
得到数据库之后可以分析一下你的聊天记录,顺便制作一个词云来给你的心上人看一下你们都聊了啥👀
看了一下我和女票日消息数走势,最多一天竟然发了 809 条😂
