天天看點

摩托x的逆向分析

完整内容及源碼關注公衆号:ReverseCode,發送 沖

apk放入jadx-1.2.0中很明顯被奇虎360加強了

摩托x的逆向分析

使用PKiD再次确認

摩托x的逆向分析

安卓8.1+fs128arm64+pyenv local 3.8.2

adb install 摩托邦4.8.0.2021070601.apk

對于完整的 dex,采用暴力搜尋 DEX.035 即可找到。而對于抹頭的 dex,通過比對一些特征來找到。FRIDA-DEXDump純粹的利用特征從記憶體中檢索已經加載的 <code>DEX</code> 檔案,而不需要攔截任何的函數得到一些結構體,并從中擷取 <code>DEX</code> 的記憶體位址或其他相關資訊。

摩托x的逆向分析

在設定中找到需要脫殼的應用配置sdcard存儲空間權限,否則隻能存到<code>var savepath = "/data/data/com.motoband";</code>首先拷貝fart.so和fart64.so到/data/app目錄下(權限不足就先放到/data/local/tmp再轉移目錄),并使用chmod 777 設定好權限

frida_fart_reflection.js

用反射的方式實作的函數粒度的脫殼,與使用hook方式實作的方法不同,可以使用spawn和attach兩種方式使用 調用dump(classname),傳入要處理的類名,隻完成對某一個類下的所有函數的CodeItem完成dump,效率更高,dump下來的類函數的所有CodeItem在含有類名的bin檔案中

frida_fart_hook.js

使用hook的方式實作的函數粒度的脫殼,僅僅是對類中的所有函數進行了加載,但依然可以解決絕大多數的抽取保護,需要以spawn方式啟動app,等待app進入Activity界面後,執行fart()函數即可 如果發現某個類中的函數的CodeItem沒有dump下來,可以調用dump(classname),傳入要處理的類名,完成對該類下的所有函數體的dump,dump下來的函數體會追加到bin檔案當中
摩托x的逆向分析

僅限機型pixel 1代,效果最好,脫的褲衩都沒了

安裝apk後在Settings-Apps-摩托邦-Permissions啟動存儲權限

适用場景

整體加強

抽取:

nop占坑型(類似某加密)

naitve化, 在&lt;clinit&gt;中解密(類似早期阿裡)

goto解密型(類似新版某加密?najia)

摩托x的逆向分析
SSL handshake with client failed: An unknown issue occurred processing the certificate (certificate_unknown)看起來做了證書綁定,使用r0capture開啟dump證書也未dump下來,無法正常抓包

./fs1280arm64 啟動frida,<code>netstat -tnlp|grep 27042</code> 檢視占用端口

核心原理就是對<code>SSL_read</code>和<code>SSL_write</code>進行<code>hook</code>,得到其收發包的明文資料

摩托x的逆向分析

由于所有使用的okhttp架構的App發出的請求都是通過RealCall.java發出的,那麼我們可以hook此類拿到request和response,也可以緩存下來每一個請求的call對象,進行再次請求,是以選擇了此處進行hook

判斷是否混淆,如果混淆需要修改okhttp_poker.js中的混淆後的變量

摩托x的逆向分析

開啟抓包

摩托x的逆向分析

./fs14216arm64

pyenv local 3.9.0

ctrl+shift+o擷取請求與請求頭

摩托x的逆向分析

ctrl+shift+o擷取請求參數

摩托x的逆向分析

拼裝到postman中

摩托x的逆向分析
摩托x的逆向分析

通過Youpk脫下的dex一起放到jdax-1.2.0中,搜尋<code>seriesinfo</code>

查找用例位于<code>com.motoband.core.manager.ChooseCarManager</code>

顯然<code>getRequestBody</code>就是生成衆多加密參數的方法,位于<code>com.motoband.core.http.RetrofitHelper</code>

由于摩托邦存在多程序保護,基于信号的發送和接收,實作互相的保護防止被動态攻擊。簡單的雙程序保護就是從原程序再fork一個空程序出來,讓逆向分析的時候附加到空程序中導緻hook不上。

雙程序程序保護主要功能: 1、保護父程序,ptrace所有線程,防止被附加、調試、暫停; 2、保護子程序,防止被暫停、異常退出;

objection附加雙程序保護的app的時候報錯,一般雙程序保護,先把app關掉直接用spwan模式就能附加上。

檢視frida源碼和objection源碼:

frida附加的順序:spawn-&gt;resume-&gt;attach

objection附加的順序:spawn-&gt;attach-&gt;resume

摩托x的逆向分析
摩托x的逆向分析

實際就是把resume放到步驟的中間,如果不行的話适當加個sleep就能附加上了

摩托x的逆向分析
摩托x的逆向分析
摩托x的逆向分析
摩托x的逆向分析

以上hook說明在requestMotorInfo中傳入品牌型号<code>3334</code>後進入getRequestBody函數

摩托x的逆向分析

根據以上Jadx中的分析,App在請求<code>car/seriesinfo</code>時調用了<code>RetrofitHelper.getRequestBody(hashMap))</code>,在函數<code>getRequestBody</code>中對不同參數包括token,sign等進行了加密,并<code>RequestBody.create(MediaType.parse(HttpConstants.MediaType_Json), JSON.toJSONString(map));</code>最終将請求參數的HashMap轉成JSONString作為create傳遞參數。

那麼即可通過主動調用<code>getRequestBody</code>的同時hook函數<code>RequestBody.create</code>拿到第二個參數作為請求參數,由于headers中資料一緻,加上請求url即可完成資料抓取。

摩托x的逆向分析

以上完成繞過so層通過主動調用和hook的方式擷取請求參數,接下來就是完成爬蟲的具體邏輯。

通過<code>python r0capture.py -U com.motoband -v -p moto.pcap</code>抓包分析各個頁面請求并使用python實作,headers可以通過<code>請求頭加引号.py</code>自動生成

由于<code>RequestBody.create(MediaType.parse(HttpConstants.MediaType_Json), JSON.toJSONString(map));</code>,hook create即可拿到入參=請求頭加密參數。

檢視選車清單時,搜尋<code>brandinfo</code>

查找用例<code>com.motoband.core.manager.MotoBrandManager</code>

摩托x的逆向分析

檢視品牌清單時,搜尋<code>searchv2</code>

摩托x的逆向分析

查找用例時有多個方法中調用,不過隻有兩個類,接下來通過objection hook上這兩個類中的所有方法,點選指定品牌,觸發<code>car/searchv2</code>

摩托x的逆向分析

以上分析得知觸發了<code>com.motoband.core.manager.ChooseCarManager.brandSeries</code>方法,傳遞第一個參數為brandid,結合jadx分析

拼接<code>searchcar</code>到map中,通過<code>getRequestBody</code>擷取加密請求參數。接下來嘗試hook <code>SearchMotoFilterModel.toBrandSeriesJson</code> 拿到入參,利用frida實作主動調用。

檢視品牌詳情時,搜尋<code>seriesinfo</code>

查找用例

hook實作

frida主動調用各個方法時,同時間hook RequestBody.create方法,拿到關鍵加密參數,rpc發送給python,完成爬蟲資料拼裝,實作資料抓取。

js

python

摩托x的逆向分析
本文由部落格一文多發平台 OpenWrite 釋出!