【逆向】【Android微信】加密数据库踩坑

逐梦中原

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的软件,截图如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wUrar2Tr-1582999544614)(https://ninecents.github.io/ProgrammerDairy/2020-02-19__微信加密数据库采坑/Mac上的Sqlite数据库软件__2020-02-2015.23.17.png)]

1-1 MySQLWorkbench

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

1-2 SQLiteClient

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

1-3 DB Browser for SQLite

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

直接打开加密文件EnMicroMsg.db,如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-35DGtbBP-1582999544616)(https://ninecents.github.io/ProgrammerDairy/2020-02-19__微信加密数据库采坑/DBBrowser__截屏2020-02-2016.13.30.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DtiYrqUn-1582999544619)(https://ninecents.github.io/ProgrammerDairy/2020-02-19__微信加密数据库采坑/DBBrowser__截屏2020-02-2016.14.06.png)]

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文件。如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XmGQNfsl-1582999544621)(https://ninecents.github.io/ProgrammerDairy/2020-02-19__微信加密数据库采坑/Navicat__截屏2020-02-2016.30.46.png)]

1-5 Datum - Lite

Datum的加密选项只有密码和页大小,也未能打开EnMicroMsg.db文件。如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j4cvwwx0-1582999544624)(https://ninecents.github.io/ProgrammerDairy/2020-02-19__微信加密数据库采坑/Datum__截屏2020-02-2016.37.07.png)]

1-6 SQLiteManager

SQLiteManager是个收费软件,打开数据库,只用输入密码,就可以直接进入查看数据库内容了,不过DEMO版本只能查看20行数据,只能另寻它路了!!!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-81xOnqBE-1582999544625)(https://ninecents.github.io/ProgrammerDairy/2020-02-19__微信加密数据库采坑/SQLiteManager__截屏2020-02-2016.41.35.png)]

1-7 SQLiteStudio

SQLiteStudio是开源项目,在github上下载最新的软件即可,该软件跨平台(Mac、Windows已经测试通过)、支持多种加密方式(这里选择SQLCipher选项),使用方法如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n8AnYzuj-1582999544629)(https://ninecents.github.io/ProgrammerDairy/2020-02-19__微信加密数据库采坑/SQLiteStudio设置页面__截屏2020-02-2016.50.09.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sa3Ef3es-1582999544632)(https://ninecents.github.io/ProgrammerDairy/2020-02-19__微信加密数据库采坑/SQLiteStudio主页面__截屏2020-02-2016.59.30.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JWicFfg8-1582999544634)(https://ninecents.github.io/ProgrammerDairy/2020-02-19__微信加密数据库采坑/SQLiteStudio关于__截屏2020-02-2016.48.56.png)]

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;

参考资料

声明

本文章仅供用于技术研究用途,请勿利用文章内容操作用于违反法律的事情。

广而告之

欢迎各位关注公众号和QQ群进行技术交流,关注有福利喔。

微信公众号:

微信公众号

qq群:IT技术控/953949723

逐梦中原技术交流QQ群

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜猫逐梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值