zoukankan      html  css  js  c++  java
  • 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: 内容”。

    编码

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

    具体代码见

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

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

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

  • 相关阅读:
    第一周C语言作业
    C语言I博客园作业08
    C语言I博客作业07
    C语言I博客作业06
    C语言I博客作业05
    C语言I博客作业04
    C语言II博客作业04
    C语言II博客作业03
    C语言II博客作业02
    C语言II博客作业01
  • 原文地址:https://www.cnblogs.com/0day5/p/7658904.html
Copyright © 2011-2022 走看看