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工具直接執行就可以得到對應的smali檔案,不瞭解這個工具的同學可以檢視這裡: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...語句之後也就是方法呼叫結束之後插入,不然回編譯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內部的問題,其實這個搜尋可以發現內部實現機制的原因,不過這個對於我們不是重點,那麼通過這個樣本我們又可以總結一個遇到抓不到包的問題解決方案了,那就是全域性搜SSLSocketFactory,然後看看應用是否設定了證照資訊。如果有就攔截替換成系統預設的證照即可。
通過以往知道的知識以及本文的案例,那麼我們就可以總結一下app中抓包失敗的解決方案大致如下:
第一、確認Fiddler證照安裝正確
第二、是否安裝Xposed模組JustTrustMe來信任所有證照
第三、檢視應用中使用的okhttp中是否設定了SSLSocketFactory
其實除了這三個還有其他方式,還有其他方式,不過不在本文介紹了,後面會詳細介紹如何防止自己的應用被被人惡意抓包,因為如果應用被人抓包其實很多破解操作就變的很簡單了。把這個入口做的安全會對後面的防護有一定效果。
嚴重說明
本文涉及到的程式碼工具可以去小密圈自取,為了安全考慮程式碼不進行公開,希望大家利用本文技術作為研發目的,絕不可以用於非法目的,否則後果自負與本文作者無任何關係!點選立即進入小密圈
關於Android中的防止抓包現在很多應用都開始做了對應的策略,最常見的是採用https協議,然後Fiddler證照是不被Android系統根證照認可所以Fiddler代理證照抓包失敗的,但是可以Hook系統的證照認證功能即可解決這個問題,而本文可以看到如果想很快的爆破這個問題,如果你前期非常瞭解okhttp框架的話,會很快解決,因為之前做過很多應用都用到這個框架,或者說這個框架已經被普遍用於絕大部分應用,Google官方也把這個框架整合到系統中了。那麼關於okhttp框架設定證照那塊要是熟悉本文爆破非常快。而且通過本文之後以後遇到抓不到包的情況可以再次參考這個解決方案即可。後續會單獨介紹這個應用的加密演算法解析!
這是一個非常魔性的小程式,有你熟悉的那些IT大佬的直播,有刷屏,有社群,有原始碼,有資料包,有志同道合好友。不多說了,比抖音上癮!
(點選立即玩耍)
手機檢視文章不方便,可以網頁看
http://www.520monkey.com
《Android應用安全防護和逆向分析》
360創始人周鴻禕、CSDN創始人蔣濤、看雪創始人段鋼聯袂推薦! 點選檢視圖書詳情
相關文章
- Android逆向之旅---Android應用的安全的攻防之戰Android
- android開發透過wireshark實現flutter應用抓包AndroidFlutter
- 談談HTTPS安全認證,抓包與反抓包策略HTTP
- 移動端防抓包實踐
- 登入抓包逆向分析學習筆記筆記
- 基於OkHttp的一種防抓包方案HTTP
- [Tools] 使用 Charles 對 Android 應用進行 HTTPS 資料抓包AndroidHTTP
- Android中獲取應用程式(包)的資訊-----PackageManager的使用(一)AndroidPackage
- Android逆向之旅---靜態方式分析破解視訊編輯應用「Vue」水印問題AndroidVue
- Android https 抓包指南AndroidHTTP
- Android App 如何防止抓包AndroidAPP
- Android逆向之旅---破解某支付軟體防Xposed等框架Hook功能檢測機制Android框架Hook
- 手機抓包+注入黑科技HttpCanary——最強大的Android抓包注入工具HTTPPCAAndroid
- Android逆向之旅---Android中如何獲取在非Root裝置中獲取應用隱私資料Android
- Android逆向之旅---Android中的sharedUserId屬性詳解Android
- 詳細Fildder抓包Android教程Android
- 記一次Android逆向之旅(入門向)Android
- Android逆向之旅---SO(ELF)檔案格式詳解Android
- Android逆向之旅---靜態方式破解微信獲取聊天記錄和通訊錄資訊Android
- 矩陣爆破逆向之條件斷點的妙用矩陣斷點
- 扯一扯HTTPS單向認證、雙向認證、抓包原理、反抓包策略HTTP
- Android 使用Fiddler4抓包Android
- android開發--防止介面被抓包Android
- Android抓包 Charles http介面除錯AndroidHTTP除錯
- android 模擬器 記憶體修改, 用winshark 抓包,修改資料包Android記憶體
- Android逆向之旅---解析編譯之後的Dex檔案格式Android編譯
- Android逆向之旅---Hook神器家族的Frida工具使用詳解AndroidHook
- Android逆向之旅---靜態分析技術來破解ApkAndroidAPK
- iOS逆向之旅 — 總綱iOS
- 逆向分析:利用標誌位進行爆破破解
- Android 多包名打包應用Android
- Linux基礎:用tcpdump抓包LinuxTCP
- linux/unix下用tcpdump抓包LinuxTCP
- 逆向 Mac 應用 BartenderMac
- 在 Android 上利用 tcpdump 進行抓包AndroidTCP
- Android系統手機端抓包方法Android
- Android獲取應用基本資訊Android
- Android逆向之旅--瘋狂兔子無敵跑跑 內購破解教程Android