安全圈 | 专注于最新网络信息安全讯息新闻

首页

安卓app測試之hook大法

作者 landy 时间 2020-03-03
all

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。這裡就不說明了,有興趣的可以去試一試。