Android破解微信獲取聊天記錄和通訊錄信息(靜態(tài)方式)
一、猜想數(shù)據(jù)存放路徑
微信現(xiàn)在是老少皆宜,大街小巷都在使用,已經(jīng)替代了傳統(tǒng)的短信聊天方式了,只要涉及到聊天就肯定有隱私消息,那么本文就來講解如何獲取微信的聊天記錄以及通訊錄信息。
首先我們在沒有網(wǎng)絡(luò)的時候,打開微信同樣可以查看聊天記錄,說明微信會把聊天記錄保存到本地,那么這么多信息肯定會保存在數(shù)據(jù)庫中,所以我們可以去查看微信的databases目錄看看內(nèi)容:
可惜的是,我們在這個里面并沒有發(fā)現(xiàn)一些有用的數(shù)據(jù),所以這時候就了解到了微信因為把重要信息的數(shù)據(jù)庫存在其他目錄下面,我們可以直接把微信的整個沙盒數(shù)據(jù)全部導(dǎo)出來,然后查找db文件:
在這個目錄中找到了一些db文件:
看到這個目錄下有很多db文件,我們可以一個一個進行查看,這里可以直接使用SQLite Expert可視化工具進行查看:
可惜的是,這里打開失敗了,看到提示消息應(yīng)該了解了,這個數(shù)據(jù)庫文件被加密了。這也更讓我們相信這個數(shù)據(jù)庫存放的是非常重要的信息,而且從安全角度來說,加密操作也是很正常的。
二、靜態(tài)方式破解微信分析
好了到這里,看來得去看代碼了,因為數(shù)據(jù)庫加密了,既然是加密肯定有解密的過程,我們?nèi)シ治龃a獲取其密碼即可。
首先我們可以使用apktool工具進行反編譯,這里不演示了,微信本身沒有加固操作,所以反編譯沒有報錯的:
注意:
這里的命令中加上了-d的參數(shù)了,是為了反編譯之后生成的是java文件,而不是smali文件。便于后面能夠?qū)隕clipse中
反編譯之后,接下來咋們就開始把文件導(dǎo)入Eclipse中,關(guān)于如何導(dǎo)入的話,這里不介紹了,不了解的同學(xué)可以轉(zhuǎn)戰(zhàn)這里:Eclipse中動態(tài)調(diào)試smali源碼 我們成功導(dǎo)入之后:
這里看到有些報錯,但是這個不用太關(guān)心,我們分析源碼就可以了,其實到這里有的同學(xué)可能想到的是速度調(diào)試:
借助之前說到的mprop工具來修改系統(tǒng)的調(diào)試屬性ro.debuggable屬性值,不了解這個工具的同學(xué)可以看這篇文章:如何脫掉360加固的殼 ,如果不想用這個工具就有點費事了,修改反編譯之后的AndroidManifest.xml中打開調(diào)試屬性,然后在回編譯,不過可惜的是,在這個過程中我嘗試過失敗了幾次,所以我最后采用了mprop工具來進行操作的。修改系統(tǒng)調(diào)試屬性之后可以看到:
微信出于debug模式了,我們這時候只要按照之前說到的Eclipse中動態(tài)調(diào)試samli源碼的步驟來即可。但是這里有一個問題,就是在調(diào)試的過程中會被卡死的,我嘗試了很多次結(jié)果都失敗了,所以這里就放棄了動態(tài)方式破解微信了,而是采用靜態(tài)方式去破解微信獲取密碼。
三、破解步驟
之前在說到使用靜態(tài)方式破解的時候第一點,一定要找到關(guān)鍵點,我們現(xiàn)在的問題是知道了數(shù)據(jù)庫,但是這個是加密的,我們需要密碼,那么在Android中如果使用數(shù)據(jù)庫的話,肯定會涉及到一個類:SQLiteDatabase,我們可以在Eclipse中先去全局搜一下這個類:
因為微信工程代碼非常大,所以在搜索的過程中需要等一段時間:
在samli中找到了com.tencent.kingkong.database.SQLiteDatabase類的定義了,因為smali語法看起來還是比較費勁的,所以我們使用Jadx工具進行可視化操作,之前一篇文章中介紹了:Android中反編譯利器分析 這里講解了apktool和jadx工具的原理,為什么說jadx好用呢?主要是他是開源的,而且用Java編寫的,同時還支持方法的跟蹤,這個對于混淆代碼的跟蹤非常有用。
這里需要注意個問題,因為微信的apk太大了,所以得分開查看,因為微信有多個dex文件,而剛剛看到SQLiteDatabase類是在第一個dex中的,我們使用jadx查看第一個dex文件即可:
這樣看起來就方便很多了,我們找到這個類,首先肯定看看他的openDatabase方法,不過這里會發(fā)現(xiàn)有很多重載方法,不過最終都要調(diào)用的是這個openDatabase方法:
內(nèi)部接著調(diào)用了open方法,繼續(xù)跟進:
內(nèi)部又調(diào)用了openInner方法,接著跟進:
調(diào)用了SQLiteConnectionPool的open方法,再跟進去:
哈哈,終于找到核心的地方了,這里看到果然有一個密碼的字段,那么這個值就是SQLiteDatabase中的openDatabase方法的第二個參數(shù),那么現(xiàn)在我們就去分析哪里調(diào)用了SQLiteDatabase的openDatabase方法,因為SQLiteDatabase的openDatabase的重載方法太多了,所以一個一個找很費勁,所以可以直接搜SQLiteDatabase被調(diào)用的地方,可以直接使用Jadx的查找跟蹤功能:
查找結(jié)果:
這里會發(fā)現(xiàn),很多地方都調(diào)用了,看起來非常麻煩,所以這里得想個辦法縮減查找范圍,我們剛剛看到SQLiteDatabase類中的open方法都是static的,所以在調(diào)用的時候肯定是這么使用的:Lcom/tencent/kingkong/database/SQLiteDatabase; 這個是標準的smali語法調(diào)用形式,所以這時候我們在去Eclipse中全局搜索這個字符串內(nèi)容:
最終看到在com.tencent.mm.bb.e這個類中,有多個地方都調(diào)用了,咋們再去看看這個類:
果然在d方法中調(diào)用了數(shù)據(jù)庫的open方法,而且傳入的str2就是密碼,在跟蹤d方法在哪里被調(diào)用了:
點擊進入查看:
這里的this.Ee就是密碼,看他的賦值,是先調(diào)用j方法構(gòu)造一個字符串出來,然后取前7個字符即可,再看看j方法:
這個方法看起來就眼熟了,計算字符串的MD5值的,這里需要注意的是,MD5的值是小寫的,好了,到這里我們就了解了:密碼其實是一個字符串的MD5值的前7位字符串,那么接下來的問題在繼續(xù)跟蹤是哪個字符串來計算MD5的:
在繼續(xù)跟蹤a方法在哪里被調(diào)用了:
找到之后點擊進入:
繼續(xù)查找這個a方法又在哪里被調(diào)用了,這里調(diào)用的比較深,所以需要多次進行查找跟蹤,耐心點即可:
最終到了這個類的方法中,我們看到,mY值是通過mY方法獲取的,j2值是上面的i值轉(zhuǎn)化過來的:
查看mY方法的實現(xiàn),很簡單,獲取設(shè)備的IMEI值,而i值在前面進行賦值了:
看到了,是一個uin值,再看看這個uin值在哪里進行賦值操作的:
看到這里就放心了,原來這個uin值存放在SharedPreferences中的,那么就簡單了,我們在開始的時候把沙盒數(shù)據(jù)全部導(dǎo)出來了,可以全局搜一下uin字符串的值:
哈哈,在這里找到了這個值。
總結(jié):
到這里我們就分析完了微信中數(shù)據(jù)庫加密的密碼獲取流程了,下面來總結(jié)一下:
1、首先我們?nèi)植檎襍QLiteDatabase類,因為這個類是操作數(shù)據(jù)庫的核心類,他是突破口。
2、找到這個類的定義之后,再次查看他的open系列方法,因為要操作數(shù)據(jù)庫肯定有open之類的方法。
3、再去全局查找SQLiteDatabase的open方法的調(diào)用地方,這里調(diào)用的地方比較多,所以大家需要耐心的查找,而且為了縮小查找范圍,我們可以根據(jù)smali語法調(diào)用格式的字符串內(nèi)容來進行查找。
4、找到了這個方法的被盜用的地方,下面就開始一步一步的往下跟蹤,到了一個核心的方法中了解到了,密碼是一個字符串計算MD5之后取前7個字符串的值。
5、繼續(xù)跟蹤,找到這個被計算MD5的字符串內(nèi)容,最后跟蹤到這個字符串其實是設(shè)備的IMEI加上用戶的uin值,而這個uin值是保存在SharedPreferences中的。
上面雖然找到了密碼,但是我們知道是如何進行數(shù)據(jù)加密的呢?這里就要借助經(jīng)驗了,因為現(xiàn)在主流的Sqlite數(shù)據(jù)加密技術(shù)就是sqlitecipher,不了解的同學(xué)可以去看看,這個數(shù)據(jù)庫加密需要用到so文件,我們?nèi)ノ⑿诺膌ibs下面查看:
這里沒有找到那個sqlitecipher.so文件,但是我們看到了這個libkkdb.so文件,他貌似就是操作數(shù)據(jù)庫的,使用IDA打開進行查看內(nèi)容:
看到了,這里的的sqlite操作都是在native層進行的,所以我們?nèi)绻榭磾?shù)據(jù)庫的話,需要用sqlcipher軟件來進行查看,這個軟件網(wǎng)上的下載地址很多,專門用來查看sqlitecipher加密的數(shù)據(jù)庫信息的。
四、數(shù)據(jù)庫密碼構(gòu)造
首先獲取設(shè)備的IMEI,可以直接撥打:*#06#即可查看;然后查看他的uin值,直接讀取SharedPreferences中的值即可,然后拼接到一起,用txt文件檔保存一下,在使用HashTab工具進行查看屬性即可得到MD5的值,關(guān)于HashTab工具:
這個工具還是很有用的,可以很方便的右鍵文件屬性,即可查看文件的MD5值了:
這里看到前七位就是:748B34D,注意字符小寫=》748b34d:
輸入密碼之后,就可以查看數(shù)據(jù)庫中的各個表格信息了:
可以發(fā)現(xiàn)這個數(shù)據(jù)庫中存了很多表格內(nèi)容,但是這里我們最關(guān)心的就是通訊錄信息表和聊天記錄表:
看到了,聊天記錄表格是message,通訊錄表格是recontact:
而且這里有一個好玩的東東,就是你以前刪除的好友,都會存在的,這個是微信會把你的通訊錄保存到服務(wù)端,及時你本地刪除了聯(lián)系人,但是服務(wù)端并不會刪除,所以如果你想找到你以前刪除的好友,可以在次查找重新加上好友。
概要總結(jié):
到這里我們就用靜態(tài)方式去破解微信,知道了數(shù)據(jù)庫加密的密碼,然后看到他是使用的主流的數(shù)據(jù)庫加密框架:sqlitecipher,而且現(xiàn)在很多app都用這個框架,比如一些小說類的app,這里就不指定說是誰了,我之前反編譯過幾個小說類的app,有兩個都是用的這個框架進行加密的。
五、破解流程總結(jié)
1、猜想信息是保存在本地數(shù)據(jù)庫
想得到聊天記錄和通訊錄信息,我們的想法是這些信息在設(shè)備沒有連接網(wǎng)絡(luò)的時候也是可以查看的,所以我們猜想這些信息是保存在本地的數(shù)據(jù)庫中的。
2、使用sqlite工具查看信息報錯
我們把微信的沙盒數(shù)據(jù)全部導(dǎo)出到本地,然后查找db文件,找到了EnMicroMsg.db文件,使用sqlite expert工具進行查看報錯,提示數(shù)據(jù)庫被加密了。
3、根據(jù)數(shù)據(jù)庫的常規(guī)使用流程找到入口
我們在Android中使用數(shù)據(jù)庫的時候都會用到SQLiteDatabase類,所以可以全局搜索這個類,找到這個類的定義,然后再找到他的一些open方法,看看這些方法的調(diào)用地方。
4、通過數(shù)據(jù)庫的入口方法進行代碼跟蹤
知道了open系列方法的調(diào)用地方,就開始使用Jadx工具進行代碼跟蹤,最后跟蹤到了有利信息,就是密碼是用戶設(shè)備的IMEI+uin值計算MD5值,注意是小寫字符,然后在取MD5的前7位字符構(gòu)成的密碼。
5、獲取密碼流程
這里知道了密碼的構(gòu)成,獲取就比較簡單了,使用*#06#撥號直接獲取IMEI值,然后在去查看SharedPreferences中的auth_info_key_prefs.xml文件中的_auth_uin值就是用戶的uin值,然后進行拼接,使用HashTab計算出MD5值,獲取前7位字符串。
6、使用sqlcipher工具查看數(shù)據(jù)庫
得到密碼之后,使用sqlcipher工具進行數(shù)據(jù)庫的查看,可以找到通訊錄表格recontact和聊天記錄表格message。
概要:微信的核心數(shù)據(jù)庫是EnMicroMsg.db,但是是加密操作的,而加密的密碼是設(shè)備的IMEI+用戶的UIN值(在SP中保存了),計算MD5(字符是小寫),取出前7位字符即可。
六、延展
1、微信的通訊錄信息和聊天記錄信息對于一個用戶來說是非常重要的隱私,所以這也是微信對數(shù)據(jù)庫進行加密的原因,但是不管最后怎么加密,都會需要解密的,所以這就是我們破解的關(guān)鍵,只要解密操作在本地進行,密碼肯定能夠獲取到。
2、關(guān)于微信的這個密碼獲取的規(guī)則不會發(fā)生改變的,有的同學(xué)會想微信會改掉數(shù)據(jù)庫加密的密碼獲取算法嗎?答案是不會的,原因很簡單,如果密碼算法改了,就會影響到老用戶,比如新版本中密碼改了,老用戶更新之后,在讀取數(shù)據(jù)庫的時候進行解密,那么加密的數(shù)據(jù)庫是老的,新的加密算法是解密失敗的,這個用戶體驗會瘋的,那有的同學(xué)又說了,對數(shù)據(jù)庫進行升級處理,但是這里的升級一定要保證老的數(shù)據(jù)不能丟失,那么這里就存在一個老數(shù)據(jù)遷移的工作,這個工作是巨大的,因為現(xiàn)在很多微信使用的過程中如果不去主動的清除數(shù)據(jù),聊天信息非常多,那個數(shù)據(jù)庫也會非常的大,幾十M很正常的,那么在數(shù)據(jù)遷移的時候風(fēng)險是非常巨大的,所以這樣一來,微信短期內(nèi)是不會改變密碼算法規(guī)則的,其實我已經(jīng)嘗試了很多老版本的反編譯,發(fā)現(xiàn)的確這個算法一直都是這樣的。所以一定要記住微信的數(shù)據(jù)庫加密算法是:MD5(IMEI+UNI)=>前7個字符。
3、這里為什么使用靜態(tài)方式去分析呢?原因是微信的包太大了,如果動態(tài)調(diào)試的話總是出現(xiàn)死機情況,沒辦法后續(xù)操作了,所以使用了靜態(tài)方式去破解。
七、安全性
通過本文之后,大家應(yīng)該都知道如何破解微信的聊天記錄信息和通訊錄信息了,只要獲取到加密的數(shù)據(jù)庫,得到密碼即可,但是這兩步卻不是那么容易獲取的,首先如何獲取加密的數(shù)據(jù)庫,這些信息都是保存在微信的沙盒數(shù)據(jù)中的,所以得設(shè)備root之后獲取,設(shè)備的imei信息就簡單了,那么問題就來了,如果一個用戶的設(shè)備root了,那么惡意程序就可以開始盜取信息了。而且在之前的一篇文章中:Android中allowBackup屬性引發(fā)的安全問題 介紹了微信在5.1之前的版本allowBackup屬性默認值是true,也就是說沒有root的情況下,可以獲取到微信的沙盒數(shù)據(jù),那么這個安全性就太暴露了?,F(xiàn)在也有很多微信通訊錄備份的工具,其實就是把這個數(shù)據(jù)庫信息同步一下。以后只要有了微信的這個數(shù)據(jù)庫,那么破解也是很簡單的,因為密碼是規(guī)定的。
八、用途
1、如果你想看周邊的人微信信息,那么這里就是給你提供了最好的方案,特別是你最愛的人,比如媳婦總是不讓你看她微信,但是自己又很想看,那么機會來了。
2、對于root之后的設(shè)備可以在后臺竊取用戶的微信信息把imei一起上傳到服務(wù)端,然后在人工分析獲取聊天記錄中重要信息。
3、當(dāng)我們的設(shè)備中誤刪除了聊天記錄,這時候可以通過導(dǎo)出本地數(shù)據(jù)庫,然后使用sqlcipher工具進行查看既可以找到之前數(shù)據(jù)
本文的重點和意圖是:如何使用靜態(tài)方式破解apk的思路,而對于微信來說,這個不算是漏洞也不算是問題,因為我們上面介紹中涉及到的數(shù)據(jù)都是微信的沙盒中的,所以一般情況下是無法獲取到的,所以對于攻擊者來說沒有太多的意義。所以本文的意圖很簡單就是講解靜態(tài)方式破解apk的一種思路。
九、總結(jié)
上面分析了微信數(shù)據(jù)庫的加密操作的原因,以及數(shù)據(jù)庫的密碼構(gòu)造算法,同時也分析了,這個算法短期內(nèi)是不可能更改的,從安全性來說,對于新版本的微信,如果設(shè)備root了,那么對惡意程序來說就有了盜取的入口,而微信中的聊天記錄信息相當(dāng)于用戶的隱私,同時會涉及到一些利益相關(guān)的,所以微信今后對這個數(shù)據(jù)庫操作希望能夠盡快的進行改善操作。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
ANDROID BottomNavigationBar底部導(dǎo)航欄的實現(xiàn)示例
本篇文章主要介紹了ANDROID BottomNavigationBar底部導(dǎo)航欄的實現(xiàn)示例,非常具有實用價值,需要的朋友可以參考下2017-10-10Android Camera2 實現(xiàn)預(yù)覽功能
最近在做一些關(guān)于人臉識別的項目,需要用到 Android 相機的預(yù)覽功能。今天小編通過本文給大家分享Android Camera2 實現(xiàn)預(yù)覽功能,感興趣的朋友跟隨小編一起看看吧2018-11-11Flutter手機權(quán)限檢查與申請實現(xiàn)方法詳解
使用flutter進行app開發(fā),一定會用到手機的部分權(quán)限,包括通知推送、定位、相冊、存儲、相機、麥克風(fēng)等。而權(quán)限的檢查和獲取,最受歡迎的就是通過permission_handler這個插件來實現(xiàn)2022-11-11android studio library 模塊中正確引用aar的實例講解
下面小編就為大家分享一篇android studio library 模塊中正確引用aar的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01android中設(shè)置TextView/Button 走馬燈(Marquee)效果示例
定義走馬燈(Marquee),主要在Project/res/layout/main.xml即可,下面與大家分享下具體的實現(xiàn),感興趣的朋友可以參考下哈2013-06-06Studio 編譯報錯:compileSdkVersion ''android-24'' requires JDK 1.
今天小編就為大家分享一篇關(guān)于Studio編譯報錯:compileSdkVersion 'android-24' requires JDK 1.8 or later to compile.的解決辦法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10Windows下搭建Android開發(fā)環(huán)境
這篇文章主要介紹了Windows下搭建Android開發(fā)環(huán)境,需要的朋友可以參考下2015-09-09