微信加密数据库踩坑

2020-02-19 晴 焦作

出场人物

  • 饭咸 - 程序员
  • 沉瓶 - 产品经理

工作环境

  • 硬件:MacBook Pro (Retina, 13-inch, Early 2015)
  • 硬件相应系统:macOS Catalina,10.15.3
  • 微信版本7.0.4

需求

  • 打开加密的数据库文件EnMicroMsg.db

故事

沉瓶:今天我发现PC上的微信好友头像保存到了电脑的某个目录上,是不是其他信息也是保存在电脑上的,比如好友列表,聊天记录等等。
饭咸:是的,为了更好的体验,微信会将很多数据保存到本地,下次再启动软件的时候就不用再请求服务器了。
沉瓶:那我能不能把数据直接读出来用呢?
饭咸:这得看微信怎么实现的了,一般情况下,关键数据都是加密的。不过微信被人们分析的太多了,这个在网上应该能找到破解方法。
沉瓶:嗯嗯,网上是不少文章,都说微信开源了它的数据库,叫WCDB(WeChat Database)(https://github.com/Tencent/wcdb),是基于SQLite的,加密使用的是开源的SQLCipher,那你试试看能打开它的加密后的数据库不?
饭咸:好的,盘它。

需求分析

  • 1 使用现成的SQLite软件

    • 1-1 MySQLWorkbench
    • 1-2 SQLiteClient
    • 1-3 DB Browser for SQLite
    • 1-4 Navicat for SQLite
    • 1-5 Datum - Lite
    • 1-6 SQLiteManager
    • 1-7 SQLiteStudio
  • 2 自己编译sqlcipher

实现步骤

1 使用现成的SQLite软件

先看下我的电脑上关于SQL的软件,截图如下:

1-1 MySQLWorkbench

这是个MySql软件,很久以前安装的,直接忽略掉吧。

1-2 SQLiteClient

这个没能打开数据库文件,难道我用错了,也忽略掉。

1-3 DB Browser for SQLite

DBBrowser是个开源的项目,支持Windows、Mac,github直接搜索即可下载,我使用的是最新的版本3.11.2。

直接打开加密文件EnMicroMsg.db,如下图所示:

DBBrowser提供了复杂的加密选项,供用户选择,看着似乎离答案不远了,可是结果出乎意料。我对两个账号进行测试,其中一个选择"SQLCipher3
default"选项能正常解密,而另一个账号的EnMicroMsg.db无论怎么更改选项都未能正常的打开。为此,我还专门调试了下程序,将其选项复制出来一项一项的对比,如下所示:

p2 = {SQLiteCipherSpec@9102} 
 hmacAlgorithm = 0
 hmacEnabled = false
 kdfAlgorithm = 0
 kdfIteration = 4000
 pageSize = 1024
 shadow$_klass_ = {Class@8246} "class com.tencent.wcdb.database.SQLiteCipherSpec"
 shadow$_monitor_ = -2105857932

一番折腾,也放弃了。

1-4 Navicat for SQLite

Navicat是一个很有名气的软件,但是它的加密选项并不多,最终也未能打开EnMicroMsg.db文件。如下图所示:

1-5 Datum - Lite

Datum的加密选项只有密码和页大小,也未能打开EnMicroMsg.db文件。如下图所示:

1-6 SQLiteManager

SQLiteManager是个收费软件,打开数据库,只用输入密码,就可以直接进入查看数据库内容了,不过DEMO版本只能查看20行数据,只能另寻它路了!!!

1-7 SQLiteStudio

SQLiteStudio是开源项目,在github上下载最新的软件即可,该软件跨平台(Mac、Windows已经测试通过)、支持多种加密方式(这里选择SQLCipher选项),使用方法如下图所示:

2 自己编译sqlcipher

在找到SQLiteStudio之前,曾经发现一种源码的方式,也做了尝试,不过不知道为什么,一直提示"out of
memory",搜到的答案大多说是是版本的问题(以前做过Sqlite相关的项目,的确会出现类似的情况),暂时记录下操作过程。

2-1 SQLCipher安装

找到很多复杂的安装方法,太复杂,直接放弃了,知道找到下面的代码才开始编译自己的SQLCipher。

直接执行下面的两行代码就行了:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null

brew install sqlcipher

2-1 解密数据库

进入sqlite后可以设置各种加密参数:cipher_page_size、kdf_iter、cipher_hmac_algorithm、cipher_kdf_algorithm等等。

$ sqlcipher encrypted.db
SQLCipher version 3.8.4.3 2014-04-03 16:53:12
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> PRAGMA key = 'thisiskey';
sqlite> PRAGMA cipher_page_size = 1024;
sqlite> PRAGMA kdf_iter = 4000;
sqlite> PRAGMA cipher_hmac_algorithm = HMAC_SHA1;
sqlite> PRAGMA cipher_kdf_algorithm = PBKDF2_HMAC_SHA1;
sqlite> PRAGMA cipher_use_hmac = OFF;
sqlite> ATTACH DATABASE 'plaintext.db' AS plaintext KEY '';
sqlite> SELECT sqlcipher_export('plaintext');
sqlite> DETACH DATABASE plaintext;

参考资料

本文由博客一文多发平台 OpenWrite 发布!

你可能感兴趣的:(android)