移動安全逆向分析流程
抓包
第一大問題就是抓包,如果包都抓不到,那基本就沒法進一步入手了。
而現在的app,稍微有點安全意識的,都會防抓包,并且安卓7.0版本開始也自帶了安全等級,不再信任用戶安裝的證書,只信任系統證書,以及種種類似的情況,這種我們怎么處理呢?就得具體問題具體分析了。
目標點定位的思路
抓到包以后,拿到了接口,以及加密參數,怎么定位這個加密參數生成呢?
1.看請求參數,搜索想要查看的特殊字段(并不推薦,但是確實能解決50-60%的app)。
2.objection 列出所有的類,hook全部,然后看關鍵點的時候哪些類被調用了。
3.利用dumpsys window 或者activity看當前的activity(mt管理器也可以記錄activity),進到里面找邏輯,如果邏輯代碼太多則不適用。
4.觀察各個接口的請求參數,是否都有一樣的請求體結構(換句話說就是看這些請求參數的鍵名)是不是一樣的,如果一樣,按照開發邏輯理念,一定有一個通用的模板加密類,搜一個加密字段,找到這個加密類,查找用例,或者用objection跟蹤,打印調用棧。
5.hook 通用的加密算法,打印調用棧。
6.hook 網絡庫okhttp,request等的(以OkHttpLogger-Frida庫為首的)。
7.hook hashmap的put方法,大部分的請求參數基本都用的hashmap封裝請求體,hook put方法,打印調用棧,則可以找到(并不100%通用)
8.hook string類的getBytes等的常用方法或者轉Json的方法。
9.hook Byte類的toString等的常用方法或者轉Json的方法。
10.hook Toast類,主流開發習慣,提示彈窗都用的這個類,hook它,看調用棧。
11.關閉網絡,再發起需要操作的目標接口,看報錯提示,利用報錯提示找調用棧,實際操作時,大部分情況跟思路10重合。
12.用frida hook 類android.view.View,點擊哪里hook哪里的方法,打印調用棧。
13.hook Log類,按照開發邏輯,開發人員會在開發的時候會在一個階段里用log打印輸出日志看邏輯,hook log打印調用棧,有時候有奇效。
14.有的app會檢測返回值的格式,并解析輸出顯示,看是否有通用解析類,hook它,如果hook不上(或者找不到這種類),則用抓包工具修改返回值,然后看解析邏輯(不常用)。
以上方法也無法保證通用,比如也有反調試調用棧,使其打印不到核心調用流程或者直接返回空調用棧,這種就得針對處理了。
GDA 、jeb、jadx,混著用,別只用jadx,有時候jadx解析并不好,看不到邏輯。
比如某wtoken,用jeb可以直接看到一些邏輯,jadx的那個部分解析失敗。
調試
當定位到加密參數生成邏輯的時候,準備調試。
一般用objection跟蹤類,看調用棧,結合源碼,寫frida腳本調試,如果在frida邏輯里能hook或者主動調用實現,此步結束。
目前來看,到這一步,基本都會遇到frida反調試,frida直接用不了,有時候換用lsposed,會有奇效,如果還不行,這就需要去對抗檢測了,三兩句就說不清楚了,感興趣可以聯系我。
加密協議實現
調試完感覺能行得通之后,開始實現加密邏輯。
1.確定是什么加密算法(并不通用,需要結合實際)。
這里的加密算法,推薦看Q佬的文章。
2.判斷是否是標準的加密算法,給一個固定的入參,與標準的算法對照加密結果。
3.實現協議。
這個就需要需要花精力分析,嘗試,實在無法實現,可以用unidbg,不要糾結于手段。
風控對抗
當以上步驟你都走完后,請求幾次,發現確實能拿數據,于是你非常開心的部署并跑起來,結果批量跑沒多久,就各種異常返回,滑塊,403啥的也跟著來了,這時候你可能就遇到風控了。
什么是風控,以下是簡單版的,這個不一定齊全也不一定對,后面有空再單獨搞個專題文章介紹風控的。
結合以上信息,傳到服務器,服務端收集到用AI推演出用戶畫像,行為習慣,判定風險等級,然后給定設備/賬號限制。
如果等級低,則出滑塊,不返回數據或者返回異常,提示實名認證,比如某國外社交app,需要人臉認證、身份證、手機號碼驗證?。
風控這種東西怎么對抗呢,這個就真的難說了,只能花時間測試并針對調整了。