磨刀霍霍
環(huán)境預(yù)備
測(cè)試手機(jī)
nexus x5 android 6.0
(android7.0以上版本抓包工具默認(rèn)抓不到https請(qǐng)求,因?yàn)?.0以上只信任系統(tǒng)級(jí)別證書,而charles證書是安裝到用戶級(jí)目錄的。
解決方式:可將charles證書升級(jí)為系統(tǒng)證書,即安裝證書到系統(tǒng)證書目錄下。
具體操作可參考連接:https://www.pianshen.com/article/97291182754/ )
PC
macbookpro
13-inch 4-core 16G-RAM macOS 10.15.5
所需工具
charles -網(wǎng)絡(luò)抓包

下載地址:https://www.charlesproxy.com/
(前提:手機(jī)和電腦均安裝好charles證書)
證書安裝及支持抓包https設(shè)置指引請(qǐng)參考: https://blog.csdn.net/victory0943/article/details/106332095/
postman -接口調(diào)試工具

支持導(dǎo)入cURL,便捷高效,導(dǎo)入操作如下圖

RE文件管理器 -android文件導(dǎo)出工具(需要root權(quán)限)

下載地址:https://m-k73-com.sm-tc.cn/c/m.k73.com/mipw/574951.html
Apk Messenger -查殼工具
加殼(加固)后的 apk 直接反編譯是看不到真實(shí)源代碼的,需要脫殼后再反編譯。
使用APK Messenger可以很方便地判斷是否加了殼
AndroidCrackTool For Mac -反編譯apk
https://github.com/Jermic/Android-Crack-Tool
mac下Android逆向神器,實(shí)用工具集
AndroidCrackTool集成了Android開發(fā)中常見的一些編譯/反編譯工具,方便用戶對(duì)Apk進(jìn)行逆向分析,提供Apk信息查看功能.目前主要功能包括(詳細(xì)使用方法見使用說(shuō)明):
- 反編譯APK
- 重建APK
- 簽名APK
- 優(yōu)化APK
- DEX2JAR(APK2JAR)
- JDGUI
- 提取DEX
- 提取XML
- Class to smail
- Apk信息查看
- Unicode轉(zhuǎn)換
初窺門徑
抓包分析
獲取門店接口分析
首先手機(jī)配置好代理,打開APP,用Charles抓一下包。

一葉障目
多次請(qǐng)求獲取門店的接口后,復(fù)制cURL進(jìn)行對(duì)比分析:
這里介紹一個(gè)文本比對(duì)的在線工具,方便觀察異同 https://qqe2.com/word/diff

對(duì)比分析得出:
變化值:
longitude和latitude: 經(jīng)緯度傳參,多次定位后肯定取值有所不同
timestamp:時(shí)間戳毋庸置疑
signature:顧名思義加密簽名
相同值:
token:多次調(diào)用發(fā)現(xiàn)token取值是固定的
火眼金睛
加密參數(shù)確定
postman中導(dǎo)入該請(qǐng)求,signature參數(shù)勾選去掉后進(jìn)行請(qǐng)求,發(fā)現(xiàn)返回認(rèn)證過(guò)期無(wú)法正常獲取數(shù)據(jù),說(shuō)明signature為加密參數(shù)

同時(shí)發(fā)現(xiàn)header中有個(gè)timestamp時(shí)間戳字段,根據(jù)逆向經(jīng)驗(yàn),請(qǐng)求中同時(shí)出現(xiàn)加密和時(shí)間戳,一般時(shí)間戳都會(huì)參與加密運(yùn)算的,這樣后端才會(huì)用時(shí)間戳結(jié)合加密邏輯進(jìn)行加密認(rèn)證。
因此我們?cè)僮鰝€(gè)試驗(yàn),只傳 signature 不傳 timestamp進(jìn)行請(qǐng)求,發(fā)現(xiàn)依然無(wú)法正確響應(yīng),證明我們的猜想的正確的。

破解目標(biāo)確定
signature的加密邏輯
且signature是有32位的數(shù)字加小寫字母組成的,猜測(cè)應(yīng)該是MD5加密
螳臂當(dāng)車
apk查殼
查殼工具很多,這里我使用的是 APK Messenger,打開后,直接將 apk 包拖入界面,幸運(yùn)地發(fā)現(xiàn)該apk沒(méi)有加殼
長(zhǎng)槍直入
apk反編譯
本次使用了Android Crack Tool這個(gè)工具,其實(shí)用jadx、jd-gui等都可以,平時(shí)多換著用用,就知道各個(gè)工具的優(yōu)缺點(diǎn)了~
- 利用Android Crack Tool 提取classes.dex文件

- 將得到classes.dex文件轉(zhuǎn)為jar

- 通過(guò)jd-gui打開生成的jar文件,得到了反編譯的源碼


真假猴王
加密邏輯靜態(tài)分析
由于加密參數(shù)為signature,在jd-gui中全局搜索“signature”

經(jīng)過(guò)簡(jiǎn)單的瀏覽排除后,發(fā)現(xiàn)GlobalHttpHandlerImpl這個(gè)類中的相關(guān)代碼最為相似,定位到關(guān)鍵代碼處:

其實(shí)這段邏輯很容易看懂:
最后一行代碼localObject2轉(zhuǎn)為String后賦值給了signature,說(shuō)明localObject2是md5的加密結(jié)果,即倒數(shù)第二行y.a()方法是MD5加密方法,傳入localObject2經(jīng)過(guò)加密后又賦值給了localObject2;
localObject2往上追溯,它是一個(gè)字符串的拼接,先拼接了一串固定鹽值"CE0BFD14562B68D6964536097A3D3E0C",
其次拼接了str和localObject1,那么這兩個(gè)是什么呢?其實(shí)不用向前追溯,我們換個(gè)思路往下看,你會(huì)發(fā)現(xiàn)
str賦值給了timestamp,localObject1賦值給了token,一切都有了答案~
一段偽代碼進(jìn)行加密邏輯總結(jié):
signature = MD5("CE0BFD14562B68D6964536097A3D3E0C" + timestamp + token)
取接口中的token和時(shí)間戳進(jìn)行加密驗(yàn)證下,結(jié)果是一致的,手工~

浮沙之上
心得:
- 逆向需要耐心也需要大膽的猜想去不斷嘗試,同時(shí)需要尋求巧妙的驗(yàn)證方式。本例的分析向上和向下的追溯均有,靈活應(yīng)對(duì)
- 逆向工作會(huì)用到的很多好用的工具,平時(shí)注意多收集一些好用的工具或博文以事半功倍,本文所用到的工具和相關(guān)擴(kuò)展知識(shí)點(diǎn)均貼出了鏈接,方便讀者收藏~
- 本文旨在分享一些逆向技巧和思路,本文所舉case相關(guān)敏感已打碼略去,讀者不可利用本文所述內(nèi)容進(jìn)行非法商業(yè)獲取利益,若執(zhí)意帶來(lái)的法律責(zé)任由讀者自行承擔(dān)。