wechat sqlite decryption

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了wechat sqlite decryption相关的知识,希望对你有一定的参考价值。

本文转自:zz_zigzag

 

获取数据库文件

借助谷歌,已经有人逆向微信APP,拿到本地数据库。

详情参照知乎的回答

https://www.zhihu.com/question/19924224

这里简述一下,需要root的手机,拿到/data/data/com.tencent.mm/MicroMsg/一个长串/EnMicroMsg.db,文件为加密的,密钥为md5(IMEI+UIN)的前7位,手机序列号IMEI通常可在设置->关于中获得,或拨号键盘*#06#。我这里为IMEI1,UIN为用户信息号,可在/data/data/com.tencent.mm/shared_prefs/system_config_prefs.xml中获得,文件中default_uid的value即是。

解密sqlite database

微信使用了sqlcipher做得加密,看来sqlcipher常用于安卓端sqlite数据库加密。

最初原本想在PC端引入sqlcipher的包连接db文件,后来发现sqlcipher主要是用于安卓应用,没找到普通java项目可用的库,于是作罢。

又了解到sqlcipher用了AES256做得加密,刚要手写AES解密,发现JDK自带AES为128位的,如若想用,还得下载额外的包,期间还去看过sqlcipher的加密部分的源码,后来想到AES还分不同类型,这样成功的几率不高呀,于是也作罢。

解铃还须系铃人,还是用sqlchipher来解密吧,安装和命令参照了这篇这篇,多谢分享。

安装sqlcipher

1
apt-get install sqlcipher

或者

1
2
3
4
5
6
unzip -q sqlcipher-master.zip
cd sqlcipher-master
sudo apt install openssl libssl-dev tcl tk sqlite3
./configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC" LDFLAGS="-lcrypto"
make
./sqlcipher

解密

使用上一步得到的密钥,如key = ‘1234567’。

1
2
3
4
5
6
7
./sqlcipher EnMicroMsg.db
sqlite> PRAGMA key = ‘1234567‘;
sqlite> PRAGMA cipher_use_hmac = off;
sqlite> PRAGMA kdf_iter = 4000;
sqlite> ATTACH DATABASE ‘wechat.db‘ AS wechat KEY ‘‘;
sqlite> SELECT sqlcipher_export(‘wechat‘);
sqlite> DETACH DATABASE wechat;

或者一句话直接执行

1
sqlcipher EnMicroMsg.db ‘PRAGMA key = "1234567"; PRAGMA cipher_use_hmac = off; PRAGMA kdf_iter = 4000; ATTACH DATABASE "wechat.db" AS wechat KEY "";SELECT sqlcipher_export("wechat");DETACH DATABASE wechat;‘

即可得到普通未加密的wechat.db。
其中PRAGMA cipher_use_hmac = off; PRAGMA kdf_iter = 4000;可用PRAGMA cipher_migrate;代替。使用后者,会改变原文件,如sqlcipher EnMicroMsg.db ‘PRAGMA key = "1234567"; PRAGMA cipher_migrate; ‘,执行完后可使用DB Browser for SQLite输入密钥打开,然后菜单栏->文件->设置加密,密码为空即可清除密码。

了解数据库结构

使用Browser打开数据库文件,大致浏览了一下表结构和数据,这里主要使用三个表:

  1. rcontact,通讯录表
  2. chatroom,群聊表
  3. message,聊天记录表

message中每条记录即为一条聊天消息,包含着聊天对象talker,如果为群聊,message.talker=chatroom.chatroomname,message.content中存储形式为:”群成员wxid:\n内容”。

编码

编码过程比较容易,统计聊天记录会按照正则表达式匹配,这里要求群成员,饭费消息为单独一个数值。

具体代码见

https://github.com/zz-zigzag/wechat-db-parser

由于程序较小,为实现方便舍弃了一些编码规则,比如函数的可重入性等,这里仅供参考。

---恢复内容结束---

以上是关于wechat sqlite decryption的主要内容,如果未能解决你的问题,请参考以下文章

QT5中如何使用SQLite

decode 和 decrypt 区别?

使用 System.Data.SQLite (C#) 的 SQLite 查询比在 SQLiteStudio 中要慢得多

SQLite在使用参数和事务时不插入多于一行

AES_DECRYPT() 返回空字段

mcrypt_decrypt() 错误更改密钥大小