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