【逆向】【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羣

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章