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
- 1-1
- 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 发布!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。