0x01前言
一般測試APP都是先設定代理,然後抓包進行測試。但是大多數情况下,抓取的數据包都含有參數校驗,一旦修改其中一個參數之後,就會返回簽名錯誤。
例如:
還有的有時間校驗,當過去某一時間段後,該數据包就失效了。
囙此如果想要去重放或者修改數据包進行FUZZ的話,就要弄清楚其中的加密sign值的算灋。
本文以某app老版本為例(僅為科技研究),主要目的是利用Frida進行HOOK進而去獲取其api-sign的加密演算法。
0x02環境準備
這裡手機採用魅族X4,刷了CM13.0,開啟ROOT許可權。
APP版本為v3.0.10,下載地址:
https://www.wandoujia.com/apps/cn.soulapp.android/history_v18080100
然後就是Frida環境的準備了。
Frida是一款基於Python + JavaScript的Hook與調試框架,在AndroidLinuxWindows等平臺均能使用。這裡我們以Windows來對Android應用程序進行Hook。Frida的官網地址是:https://www.frida.re。
安裝方法也很簡單:
pip install frida-tools
手機開啟開發者模式,並開啟USB調試。
下載frida-server,下載地址為:
http://build.frida.re/frida-snapshot/android/arm/bin/frida-server。
上傳到手機
adb push frida-server /data/local/tmp/
添加許可權
[email protected]:/ #chmod 777 frida-server
手機上運行frida-server,命令如下:
[email protected]:/ #./data/local/tmp/frida-server
埠轉發,電腦上運行如下命令:
adb forward tcp:27042 tcp:27042
環境準備好了,就開始對APP進行測試。
0x03利用Frida進行HOOK
安裝後打開APP。
發現APP閃退,並提示SoulApp暫不支持模擬器,請稍後再試~。
用jadx打開apk檔案,蒐索關鍵字模擬器。
只有一處,我們點進去。
其中有個判斷,如果cn.soulapp.android.utils.j.e()為true,則提示不支持模擬器,並退出程式。點進這個方法查看。
其中有多個判斷,如果一個為true,則返回true,最簡單有效的方法就是hook,直接令返回為false。使用Frida進行hook,代碼如下:
運行後,發現再次打開app,可以順利進入了。
輸入手機號,點擊確定。
提示網絡錯誤,這是因為使用了代理,所以報錯,但是有數据包的。可以暫時先不管這裡。我們目的是獲取sign值的加密演算法。這裡是獲取api-sign的加密演算法。
數据包內容
數据包中有api-sign,所以直接利用jadx蒐索api-sign。
發現在cn.soulapp.android.api.b.b.b()中有調用,進入查看。
api-sign值的獲取調用了cn.soulapp.android.api.b.c.a方法。
這裡是創建了一個stringBuilder,經過拼接後,調用com.gongjiao.rr.tools.f.b進行sha1加密,並轉換為大寫。我們需要知道cn.soulapp.android.api.b.c.a三個參數的值是什麼。
aVar.b(“api-sign”,c.a(aaVar,replaceAll,currentTimeMillis));
根據程式碼可以推測,第一個參數aaVar是類okhttp3.Request的實例化;
第二個參數replaceAll是獲取的UUID去除中間的“-”;
第三個參數是當前時間戳减去cn.soulapp.android.api.a.a()。這個值是從soul_share.xml中讀取ApiConstants_timeDiff的值,查看soul_share.xml發現內容為空。
所以第三個參數為當前的時間戳記。
查看cn.soulapp.android.api.b.c.a方法,前半部分是對aaVar進行操作,大概是獲取請求的路徑,然後對參數進行拼接。
看後半部分的程式碼:
這裡第71行中的UTDevice.getUtdid(SoulApp.b())為設備號,即數据包裡面的device-id;
第72行的a.j為固定值,這裡為10000003;
第73行這個值需要獲取,可以用hook獲取;
第74行a(j)是將傳入的時間戳記(第三個參數)進行轉換;
第75行是拼接了傳入的第二個參數;
第78行拼接了固定值3010;
然後第80行調用com.gongjiao.rr.tools.f.b對stringBuilder進行加密,並轉換為大寫。
可以通過hook的方法直接獲取cn.soulapp.android.api.b.c.a和com.gongjiao.rr. tools.f.b的參數。
主要程式碼:
由於cn.soulapp.android.api.b.c中有多個a方法,所以這裡用了重載,指明參數類型來確定是哪個方法。
運行效果
知道了加密演算法以及參數,就可以自己實現加密獲取api-sign了,如下所示:
api-sign值可以獲取了,我們試一下能否利用。由上面知道代理抓包時數据包返回400,經過查看程式碼是可以解决這個問題的。這裡不詳細說明。
發現該方法獲取api-sign是可行的。
0x04其他問題
1.不進行hook獲取參數的內容或者查看調用堆棧的方法
可以通過動態調試的方法進行查看。
首先將apk反編譯為smali檔案,然後IDEA安裝smalidea挿件。下載地址:https://bitbucket.org/JesusFreke/smali/downloads/
反編譯的命令如下:
java -jar baksmali-2.2.2.jar d 106_3ce8a91b116f3ca28175affa3d12083f.apk -o SoulApp3010/src
然後導入到idea中
然後在需要查看的地方下中斷點。
例如在cn.soulapp.android.api.b.c.a下中斷點
打開Run/Debug Configurations,添加一個遠程調試,埠8700
運行app,然後在Android Device Monitor中選中
打開調試按鈕,點擊手機上的確定,進入調試。
2.加密的算灋在so檔案中
簡單的方法就是獲取調用so中方法的參數,然後自己寫一個app,調用其so檔案。
如果有判斷的話,可以修改so檔案達到可以調用的目的。
如上所示,該so檔案有判斷,如果isInMyAPP為false,則會退出,返回null。
我們可以修改CMP R0,#0為CMP R0,#1來繞過該限制。
修改後
更深入的就是對so檔案進行分析,找到其中的加密演算法。
0x05總結
Frida不僅可以用於hook java層,也可以進行native層的hook。利用Frida進行hook時,要求需要使用已ROOT的手機,對於手機無法ROOT的,安裝VirtualXposed後使用Xposed框架也可以進行HOOK。這裡就不說明了,有興趣的可以去試一試。