Android逆向之旅---靜態方式破解微信獲取聊天記錄和通訊錄資訊

yangxi_001發表於2016-12-02

一、猜想資料存放路徑

微信現在是老少皆宜,大街小巷都在使用,已經替代了傳統的簡訊聊天方式了,只要涉及到聊天就肯定有隱私訊息,那麼本文就來講解如何獲取微信的聊天記錄以及通訊錄資訊。

首先我們在沒有網路的時候,開啟微信同樣可以檢視聊天記錄,說明微信會把聊天記錄儲存到本地,那麼這麼多資訊肯定會儲存在資料庫中,所以我們可以去檢視微信的databases目錄看看內容:


可惜的是,我們在這個裡面並沒有發現一些有用的資料,所以這時候就瞭解到了微信因為把重要資訊的資料庫存在其他目錄下面,我們可以直接把微信的整個沙盒資料全部匯出來,然後查詢db檔案:


在這個目錄中找到了一些db檔案:


看到這個目錄下有很多db檔案,我們可以一個一個進行檢視,這裡可以直接使用SQLite Expert視覺化工具進行檢視:


可惜的是,這裡開啟失敗了,看到提示訊息應該瞭解了,這個資料庫檔案被加密了。這也更讓我們相信這個資料庫存放的是非常重要的資訊,而且從安全形度來說,加密操作也是很正常的。


二、靜態方式破解微信分析

好了到這裡,看來得去看程式碼了,因為資料庫加密了,既然是加密肯定有解密的過程,我們去分析程式碼獲取其密碼即可。

首先我們可以使用apktool工具進行反編譯,這裡不演示了,微信本身沒有加固操作,所以反編譯沒有報錯的:


注意:

這裡的命令中加上了-d的引數了,是為了反編譯之後生成的是java檔案,而不是smali檔案。便於後面能夠匯入Eclipse中

反編譯之後,接下來咋們就開始把檔案匯入Eclipse中,關於如何匯入的話,這裡不介紹了,不瞭解的同學可以轉戰這裡:Eclipse中動態除錯smali原始碼 我們成功匯入之後:


這裡看到有些報錯,但是這個不用太關心,我們分析原始碼就可以了,其實到這裡有的同學可能想到的是速度除錯:

藉助之前說到的mprop工具來修改系統的除錯屬性ro.debuggable屬性值,不瞭解這個工具的同學可以看這篇文章:如何脫掉360加固的殼 ,如果不想用這個工具就有點費事了,修改反編譯之後的AndroidManifest.xml中開啟除錯屬性,然後在回編譯,不過可惜的是,在這個過程中我嘗試過失敗了幾次,所以我最後採用了mprop工具來進行操作的。修改系統除錯屬性之後可以看到:


微信出於debug模式了,我們這時候只要按照之前說到的Eclipse中動態除錯samli原始碼的步驟來即可。但是這裡有一個問題,就是在除錯的過程中會被卡死的,我嘗試了很多次結果都失敗了,所以這裡就放棄了動態方式破解微信了,而是採用靜態方式去破解微信獲取密碼。


三、破解步驟

之前在說到使用靜態方式破解的時候第一點,一定要找到關鍵點,我們現在的問題是知道了資料庫,但是這個是加密的,我們需要密碼,那麼在Android中如果使用資料庫的話,肯定會涉及到一個類:SQLiteDatabase,我們可以在Eclipse中先去全域性搜一下這個類:


因為微信工程程式碼非常大,所以在搜尋的過程中需要等一段時間:


在samli中找到了com.tencent.kingkong.database.SQLiteDatabase類的定義了,因為smali語法看起來還是比較費勁的,所以我們使用Jadx工具進行視覺化操作,之前一篇文章中介紹了:Android中反編譯利器分析 這裡講解了apktool和jadx工具的原理,為什麼說jadx好用呢?主要是他是開源的,而且用Java編寫的,同時還支援方法的跟蹤,這個對於混淆程式碼的跟蹤非常有用。

這裡需要注意個問題,因為微信的apk太大了,所以得分開檢視,因為微信有多個dex檔案,而剛剛看到SQLiteDatabase類是在第一個dex中的,我們使用jadx檢視第一個dex檔案即可:


這樣看起來就方便很多了,我們找到這個類,首先肯定看看他的openDatabase方法,不過這裡會發現有很多過載方法,不過最終都要呼叫的是這個openDatabase方法:


內部接著呼叫了open方法,繼續跟進:


內部又呼叫了openInner方法,接著跟進:


呼叫了SQLiteConnectionPool的open方法,再跟進去:


哈哈,終於找到核心的地方了,這裡看到果然有一個密碼的欄位,那麼這個值就是SQLiteDatabase中的openDatabase方法的第二個引數,那麼現在我們就去分析哪裡呼叫了SQLiteDatabase的openDatabase方法,因為SQLiteDatabase的openDatabase的過載方法太多了,所以一個一個找很費勁,所以可以直接搜SQLiteDatabase被呼叫的地方,可以直接使用Jadx的查詢跟蹤功能:


查詢結果:


這裡會發現,很多地方都呼叫了,看起來非常麻煩,所以這裡得想個辦法縮減查詢範圍,我們剛剛看到SQLiteDatabase類中的open方法都是static的,所以在呼叫的時候肯定是這麼使用的:Lcom/tencent/kingkong/database/SQLiteDatabase; 這個是標準的smali語法呼叫形式,所以這時候我們在去Eclipse中全域性搜尋這個字串內容:


最終看到在com.tencent.mm.bb.e這個類中,有多個地方都呼叫了,咋們再去看看這個類:


果然在d方法中呼叫了資料庫的open方法,而且傳入的str2就是密碼,在跟蹤d方法在哪裡被呼叫了:


點選進入檢視:


這裡的this.Ee就是密碼,看他的賦值,是先呼叫j方法構造一個字串出來,然後取前7個字元即可,再看看j方法:


這個方法看起來就眼熟了,計算字串的MD5值的,這裡需要注意的是,MD5的值是小寫的,好了,到這裡我們就瞭解了:密碼其實是一個字串的MD5值的前7位字串,那麼接下來的問題在繼續跟蹤是哪個字串來計算MD5的:


在繼續跟蹤a方法在哪裡被呼叫了:


找到之後點選進入:


繼續查詢這個a方法又在哪裡被呼叫了,這裡呼叫的比較深,所以需要多次進行查詢跟蹤,耐心點即可:


最終到了這個類的方法中,我們看到,mY值是通過mY方法獲取的,j2值是上面的i值轉化過來的:


檢視mY方法的實現,很簡單,獲取裝置的IMEI值,而i值在前面進行賦值了:


看到了,是一個uin值,再看看這個uin值在哪裡進行賦值操作的:


看到這裡就放心了,原來這個uin值存放在SharedPreferences中的,那麼就簡單了,我們在開始的時候把沙盒資料全部匯出來了,可以全域性搜一下uin字串的值:


哈哈,在這裡找到了這個值。


總結:

到這裡我們就分析完了微信中資料庫加密的密碼獲取流程了,下面來總結一下:

1、首先我們全域性查詢SQLiteDatabase類,因為這個類是運算元據庫的核心類,他是突破口。

2、找到這個類的定義之後,再次檢視他的open系列方法,因為要運算元據庫肯定有open之類的方法。

3、再去全域性查詢SQLiteDatabase的open方法的呼叫地方,這裡呼叫的地方比較多,所以大家需要耐心的查詢,而且為了縮小查詢範圍,我們可以根據smali語法呼叫格式的字串內容來進行查詢。

4、找到了這個方法的被盜用的地方,下面就開始一步一步的往下跟蹤,到了一個核心的方法中瞭解到了,密碼是一個字串計算MD5之後取前7個字串的值。

5、繼續跟蹤,找到這個被計算MD5的字串內容,最後跟蹤到這個字串其實是裝置的IMEI加上使用者的uin值,而這個uin值是儲存在SharedPreferences中的。


上面雖然找到了密碼,但是我們知道是如何進行資料加密的呢?這裡就要藉助經驗了,因為現在主流的Sqlite資料加密技術就是sqlitecipher,不瞭解的同學可以去看看,這個資料庫加密需要用到so檔案,我們去微信的libs下面檢視:


這裡沒有找到那個sqlitecipher.so檔案,但是我們看到了這個libkkdb.so檔案,他貌似就是運算元據庫的,使用IDA開啟進行檢視內容:


看到了,這裡的的sqlite操作都是在native層進行的,所以我們如果要檢視資料庫的話,需要用sqlcipher軟體來進行檢視,這個軟體網上的下載地址很多,專門用來檢視sqlitecipher加密的資料庫資訊的。


四、資料庫密碼構造

首先獲取裝置的IMEI,可以直接撥打:*#06#即可檢視;然後檢視他的uin值,直接讀取SharedPreferences中的值即可,然後拼接到一起,用txt檔案檔儲存一下,在使用HashTab工具進行檢視屬性即可得到MD5的值,關於HashTab工具:


這個工具還是很有用的,可以很方便的右鍵檔案屬性,即可檢視檔案的MD5值了:


這裡看到前七位就是:748B34D,注意字元小寫=》748b34d:


輸入密碼之後,就可以檢視資料庫中的各個表格資訊了:


可以發現這個資料庫中存了很多表格內容,但是這裡我們最關心的就是通訊錄資訊表和聊天記錄表:


看到了,聊天記錄表格是message,通訊錄表格是recontact:


而且這裡有一個好玩的東東,就是你以前刪除的好友,都會存在的,這個是微信會把你的通訊錄儲存到服務端,及時你本地刪除了聯絡人,但是服務端並不會刪除,所以如果你想找到你以前刪除的好友,可以在次查詢重新加上好友。


概要總結:

到這裡我們就用靜態方式去破解微信,知道了資料庫加密的密碼,然後看到他是使用的主流的資料庫加密框架:sqlitecipher,而且現在很多app都用這個框架,比如一些小說類的app,這裡就不指定說是誰了,我之前反編譯過幾個小說類的app,有兩個都是用的這個框架進行加密的。


五、破解流程總結

1、猜想資訊是儲存在本地資料庫

想得到聊天記錄和通訊錄資訊,我們的想法是這些資訊在裝置沒有連線網路的時候也是可以檢視的,所以我們猜想這些資訊是儲存在本地的資料庫中的。

2、使用sqlite工具檢視資訊報錯

我們把微信的沙盒資料全部匯出到本地,然後查詢db檔案,找到了EnMicroMsg.db檔案,使用sqlite expert工具進行檢視報錯,提示資料庫被加密了。

3、根據資料庫的常規使用流程找到入口

我們在Android中使用資料庫的時候都會用到SQLiteDatabase類,所以可以全域性搜尋這個類,找到這個類的定義,然後再找到他的一些open方法,看看這些方法的呼叫地方。

4、通過資料庫的入口方法進行程式碼跟蹤

知道了open系列方法的呼叫地方,就開始使用Jadx工具進行程式碼跟蹤,最後跟蹤到了有利資訊,就是密碼是使用者裝置的IMEI+uin值計算MD5值,注意是小寫字元,然後在取MD5的前7位字元構成的密碼。

5、獲取密碼流程

這裡知道了密碼的構成,獲取就比較簡單了,使用*#06#撥號直接獲取IMEI值,然後在去檢視SharedPreferences中的auth_info_key_prefs.xml檔案中的_auth_uin值就是使用者的uin值,然後進行拼接,使用HashTab計算出MD5值,獲取前7位字串。

6、使用sqlcipher工具檢視資料庫

得到密碼之後,使用sqlcipher工具進行資料庫的檢視,可以找到通訊錄表格recontact和聊天記錄表格message。


概要:微信的核心資料庫是EnMicroMsg.db,但是是加密操作的,而加密的密碼是裝置的IMEI+使用者的UIN值(在SP中儲存了),計算MD5(字元是小寫),取出前7位字元即可。


六、延展

1、微信的通訊錄資訊和聊天記錄資訊對於一個使用者來說是非常重要的隱私,所以這也是微信對資料庫進行加密的原因,但是不管最後怎麼加密,都會需要解密的,所以這就是我們破解的關鍵,只要解密操作在本地進行,密碼肯定能夠獲取到。

2、關於微信的這個密碼獲取的規則不會發生改變的,有的同學會想微信會改掉資料庫加密的密碼獲取演算法嗎?答案是不會的,原因很簡單,如果密碼演算法改了,就會影響到老使用者,比如新版本中密碼改了,老使用者更新之後,在讀取資料庫的時候進行解密,那麼加密的資料庫是老的,新的加密演算法是解密失敗的,這個使用者體驗會瘋的,那有的同學又說了,對資料庫進行升級處理,但是這裡的升級一定要保證老的資料不能丟失,那麼這裡就存在一個老資料遷移的工作,這個工作是巨大的,因為現在很多微信使用的過程中如果不去主動的清除資料,聊天資訊非常多,那個資料庫也會非常的大,幾十M很正常的,那麼在資料遷移的時候風險是非常巨大的,所以這樣一來,微信短期內是不會改變密碼演算法規則的,其實我已經嘗試了很多老版本的反編譯,發現的確這個演算法一直都是這樣的。所以一定要記住微信的資料庫加密演算法是:MD5(IMEI+UNI)=>前7個字元。

3、這裡為什麼使用靜態方式去分析呢?原因是微信的包太大了,如果動態除錯的話總是出現當機情況,沒辦法後續操作了,所以使用了靜態方式去破解。


七、安全性

通過本文之後,大家應該都知道如何破解微信的聊天記錄資訊和通訊錄資訊了,只要獲取到加密的資料庫,得到密碼即可,但是這兩步卻不是那麼容易獲取的,首先如何獲取加密的資料庫,這些資訊都是儲存在微信的沙盒資料中的,所以得裝置root之後獲取,裝置的imei資訊就簡單了,那麼問題就來了,如果一個使用者的裝置root了,那麼惡意程式就可以開始盜取資訊了。而且在之前的一篇文章中:Android中allowBackup屬性引發的安全問題 介紹了微信在5.1之前的版本allowBackup屬性預設值是true,也就是說沒有root的情況下,可以獲取到微信的沙盒資料,那麼這個安全性就太暴露了。現在也有很多微信通訊錄備份的工具,其實就是把這個資料庫資訊同步一下。以後只要有了微信的這個資料庫,那麼破解也是很簡單的,因為密碼是規定的。


八、用途

1、如果你想看周邊的人微信資訊,那麼這裡就是給你提供了最好的方案,特別是你最愛的人,比如媳婦總是不讓你看她微信,但是自己又很想看,那麼機會來了。

2、對於root之後的裝置可以在後臺竊取使用者的微信資訊把imei一起上傳到服務端,然後在人工分析獲取聊天記錄中重要資訊。

3、當我們的裝置中誤刪除了聊天記錄,這時候可以通過匯出本地資料庫,然後使用sqlcipher工具進行檢視既可以找到之前資料


本文的重點和意圖是:如何使用靜態方式破解apk的思路,而對於微信來說,這個不算是漏洞也不算是問題,因為我們上面介紹中涉及到的資料都是微信的沙盒中的,所以一般情況下是無法獲取到的,所以對於攻擊者來說沒有太多的意義。所以本文的意圖很簡單就是講解靜態方式破解apk的一種思路。


九、總結

上面分析了微信資料庫的加密操作的原因,以及資料庫的密碼構造演算法,同時也分析了,這個演算法短期內是不可能更改的,從安全性來說,對於新版本的微信,如果裝置root了,那麼對惡意程式來說就有了盜取的入口,而微信中的聊天記錄資訊相當於使用者的隱私,同時會涉及到一些利益相關的,所以微信今後對這個資料庫操作希望能夠儘快的進行改善操作。

相關文章