Android逆向之旅---爆破一款资讯类应用「最右」防抓包策略原理分析
一、逆向分析
首先感謝王同學提供的樣本,因為王同學那天找到我咨詢我說有一個應用Fiddler抓包失敗,其實對于這類問題,我一般都會這么回答:第一你是否安裝Fiddler證書了,他說他安裝了。第二你是否用了我之前說的那個Xposed框架JustTrustMe,不了解這個框架的同學可以查看這里:Python爬取應用「英語流利說」的配音視頻數據;他說了也用了。到這里我就沒理由不幫他看了,自己下載了應用安裝之后,的確有這個問題:
看到了,這里就是這樣的提示,也沒看到具體的請求參數啥的,所以這個就引發了我的興趣,那么不多說了直接爆破吧,突破口很簡單,直接全局搜這個接口api.izuiyou.com即可:
搜索結果很多,主要看純接口那個,通過兩三次的點擊瀏覽最后定位到這一處:
到這里就看到了,其實他內部用的是okhttp進行網絡請求的,使用AsyncTask類進行操作,但是在構建okhttp的時候他做了很多設置操作,首先是參數設置:
看到這個c類其實是設置okhttp的攔截器,這里簡單看一下應該是post方式請求會把參數進行加密處理,我們看看那個加密代碼:
這個不多說了,依然采用底層加密操作,到這里我們就直接hook它:
然后安裝模塊運行即可,然后我們手機不掛代理訪問,這樣就能正常拉取數據了,看看加密的都是啥信息,我們在首頁進行下拉刷新操作:
看到了下拉數據接口是recommend的,然后參數就是請求參數信息,看到最后加密之后的只有一個sign字段了,應該是把參數放到so層進行加密處理了,那么這個加密邏輯不是本文的介紹重點,后續會繼續單獨介紹如何動態調試so來弄出加密算法。繼續回到剛才設置了okhttp的攔截器之后,就設置okhttp的SSLSocketFactory和X509TrustManager值就是和證書相關的:
然后這里他自定義了一個SSLSocketFactory類,這個類中可以自定義的Socket信息:
一般都是在回調方法createSocket中處理通信的Socket信息:
然后就是okhttp的設置證書的方法調用了,后面的解決方案就是hook這個方法來
當然還有設置域名檢查的方法HostnameVerifier,這里不多介紹了。那么現在可以看到抓包失敗可能就是這三個值引起的,這個大家一定要熟悉okhttp框架的大致用法和原理,而且現在幾乎很多應用都在用這個okhttp框架了,并且google官方已經把這個框架集成到系統中替換原來的apache的http框架了。所以后續如果抓包失敗都可以直接分析應用中的這個框架即可。
?
到這里我們大致找到關鍵點了,不過這里需要說明一個現象就是抓包失敗,在應用界面會看到有一個loading一直在轉圈圈也就是這里有一個超時時間,詭異的是如果超時了,數據可以正常加載。但是這個超時太長了幾乎幾分鐘。雖然最終可以看到數據也可以抓到包(文章開始說抓不到包是因為太慢了沒心等待)。但是得解決這個問題不然等幾分鐘沒法進行后面操作了。所以還得繼續看這個問題吧。上面已經定位到問題大致就是okhttp設置了證書那些值導致的問題,那么是哪些值呢?我們先看看SSLSocketFactory這個類:
這個類的createSocket方法中處理了很多邏輯,那么我們在hook這個方法打印參數信息:
我們在方法調用前打印參數信息,方法調用結束之后打印結束信息,然后運行模塊看日志信息:
我們掛了Fiddler代理之后看到打印的參數值信息了,不過可惜的是結束日志沒有打印出來,那么問題就出在這個方法了,但是上面有好幾處代碼怎么定位到是哪個代碼等待呢?這個我們可以選擇對每個方法調用進行hook然后查看日志,但是這樣太費勁了,這時候就需要一個技巧就是如果想定位到哪個方法等待,那么可以進行插入日志代碼,看打印信息,但是我們加入很多日志,所以要區分是哪行日志打印了,所以這里有一個技巧就是通過獲取當前方法被調用的行數來作為打印的信息,代碼大致如下:
這樣我們只需要調用log這個方法即可,因為這個方法是無參數的,在插入smali代碼的時候有一條基本原則就是盡量把功能模塊弄到一個static無參函數中,這樣對于插入非常高效便捷也不會出錯。有了這個java代碼,然后用我之前寫的java2smali工具直接運行即可,不了解這個工具的同學可以查看這里:Android中一鍵轉化java2smali工具原理解析;然后就得到了對應的smali代碼,然后我們對于這個app呢?不要去直接apktools反編譯,因為反編譯失敗的,我們可以直接操作dex轉化成smali即可,這個要用到baksmali和smali這兩個工具,我們直接解壓apk獲取到classes.dex文件,然后執行命令:java -jar baksmali.jar -o classes classes.dex 其中classes是反編譯dex之后的smali文件夾目錄。然后把我們上面的MyLog.smali放到指定目錄下,記住一定要有全路徑,比如這里是cn.wjdiankong.log.MyLog,那么就要放到cn/wjdiankong/log/MyLog.smali,沒有目錄就自己手動新建即可。然后在上面想要插入代碼的地方直接插入代碼:invoke-static {}, Lcn/wjdiankong/log/MyLog;->log()V 這里我放了好幾個:
記住放的地方別瞎亂放入,一般都在move-result...www.huarenyl.cn/ 語句之后也就是方法調用結束之后插入,不然回編譯dex會報錯的。插入之后就在用smali進行回編譯:java -jar smali.jar classes -o classes.dex 其中classes是反編譯的smali目錄,classes.dex是回編譯之后的dex。成功回編譯得到新的dex之后,為了驗證插入成功,可以用Jadx打開進行查看:
我們看到好幾處都插入日志了,并且日志是攜帶行號的,這樣就能區分是哪里的日志打印結果了,好了把這個插入代碼的dex在塞到原來的apk中,然后二次簽名即可,因為這個應用沒有簽名校驗,所以直接看打印日志:
然后在回過頭看看代碼:
但是這個createSocket方法是系統的了?得去看源碼查看為何等待那么久?對到這里我沒去深入看了,因為不是本文研究的重點了,不過可以告訴大家如果感興趣可以自己寫個demo然后用okhttp訪問一下接口也是這個createSocket方法等待很久。
?
二、解決方案
我們問題找到了,解決辦法就簡單了,為了能夠正常抓包,直接把這個okhttp的證書hook修改成系統默認的即可:
然后攔截之前分析的那個設置okhttp的證書代碼方法:
然后運行模塊之后就可以愉快的抓包啦:
看到了這里就可以愉快的抓到數據包了,其實這里雖然我們知道了解決辦法,但是其實內部的原因還是沒弄清楚,就是知道原因是okhttp內部的問題,其實這個搜索可以發現內部實現機制的原因,不過這個對于我們不是重點,www.baohuayule.com?那么通過這個樣本我們又可以總結一個www.wanmeiyuele.cn?遇到抓不到包的問題解決方案了,那就是全局搜SSLSocketFactory,然后看看應用是否設置了證書信息。如果有就攔截替換成系統默認的證書即可。
?
三、抓包失敗解決方案
通過以往知道的知識以及本文的案例,那么我們就可以總結一下app中抓包失敗的解決方案大致如下:
?
- 第一、確認Fiddler證書安裝正確
- 第二、是否安裝Xposed模塊www.leyou1178.cn ?JustTrustMe信任所有證書
- 第三、查看應用中使用的okhttp中是否設置了SSLSocketFactory
其實除了這三個還有其他方式,還有其他方式,不過不在本文介紹了,后面會詳細介紹如何防止自己的應用被被人惡意抓包,因為如果應用被人抓包其實很多破解操作就變的很簡單了。把這個入口做的安全會對后面的防護有一定效果。
總結
以上是生活随笔為你收集整理的Android逆向之旅---爆破一款资讯类应用「最右」防抓包策略原理分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FastDFS笔记
- 下一篇: CIA困局:天下再无007,AI识别下无