微信数据库EnMicroMsg.db被SQLCipher加密,需密码解密:一、旧版用IMEI+UIN拼接MD5取前7位;二、新版用Frida Hook动态捕获32位AES密钥;三、PC端用x64dbg内存提取32字节密钥。

如果您已获取到 com.tencent.mm 的数据库文件(如 EnMicroMsg.db),但无法直接打开查看聊天记录,则可能是由于该 SQLite 数据库被 SQLCipher 加密,需提供正确密码才能访问。以下是针对不同环境的多种解密方法:
本文运行环境:Samsung Galaxy S24,Android 15。
一、基于 IMEI+UIN 拼接 MD5 取前7位密码法
该方法利用微信旧版加密逻辑,通过设备唯一标识与账号标识拼接后生成固定长度密钥,适用于未升级加密策略的微信版本。
1、在手机拨号界面输入 *#06#,记录显示的全部 IMEI 值(双卡机需记录两个)。
2、使用具备 root 权限的文件管理器(如 Solid Explorer 或 FX File Explorer),导航至 /data/data/com.tencent.mm/shared_prefs/auth_info_key_prefs.xml,查找 UIN 字段值;若未找到,可尝试检查 com.tencent.mm_preferences.xml 或 DENGTA_META.xml。
3、将任一 IMEI(如 861639049707055)与 UIN(如 445004976)拼接为纯字符串,不含空格或符号,例如:861639049707055445004976。
4、使用在线 MD5 工具或本地命令行执行 echo -n "861639049707055445004976" | md5sum,确保输出为 32 位小写字符,取前 7 位作为密码(如 4d09017)。
5、用 sqlcipher 命令行工具或支持 SQLCipher 的 GUI 软件(如 DB Browser for SQLite 配合插件)打开 EnMicroMsg.db,输入该 7 位密码。
二、Frida Hook 动态获取密钥法
当静态 MD5 密码失效时,该方法绕过密码推算过程,直接从微信运行时内存中捕获数据库打开时传入的真实密钥,适用于高版本微信(如 8.0.2 及以上)。
1、在已 root 的 Android 设备上安装 Frida Server,并确保 adb shell 中可执行 frida-ps -U 列出微信进程。
2、编写 Frida 脚本,hook com.tencent.wcdb.database.SQLiteDatabase.openInner 方法,监听其参数中类型为 byte[] 的密码字段。
3、启动微信并触发登录,使数据库初始化流程执行;Frida 脚本将在 openInner 调用时打印出原始 AES 密钥字节数组。
4、将打印出的字节数组转换为十六进制字符串(如 b0c9d7c04707f8cd3a59476ae80795c4),截取前 32 位作为 SQLCipher 解密密钥。
5、使用该 32 位密钥配合 sqlcipher 命令行工具执行 sqlcipher EnMicroMsg.db,再输入 .key "b0c9d7c04707f8cd3a59476ae80795c4" 后即可查询数据。
三、PC 微信客户端内存提取密钥法
PC 端微信采用统一 AES 密钥加密所有 Msg 目录下的 .db 文件,密钥在登录后驻留于内存,可通过调试器实时定位,无需逆向 APK。
1、启动 x64dbg 或 Cheat Engine,附加正在运行的 WeChat.exe 进程。
2、在微信登录完成、主界面加载完毕后,在内存中搜索字符串 .db,定位到数据库文件路径(如 C:\Users\XXX\Documents\WeChat Files\wxid_xxx\Msg\MSG0.db)。
3、对该路径字符串下“访问断点”,待程序暂停后,向上回溯调用栈,寻找调用 CryptDecrypt 或 EVP_DecryptInit_ex 的位置。
4、在相关函数入口处设置断点,观察其第二个参数(通常为密钥指针),使用内存转储功能导出该地址指向的 32 字节数据。
5、将导出的 32 字节数据保存为十六进制文本,用 sqlcipher 打开对应 .db 文件并执行 .key 命令注入密钥。










