本篇來自周小魚同學的投稿,跟著猿人學王平大佬學了一段時間安卓APP逆向,剛剛入門。由於我使用Mac和iOS更頻繁,所以我以某汽車 iOS 版為例,記錄一下逆向過程和一些知識點。
此次逆向教程使用到的工具如下:
一部越獄iPhone或iPad
抓包工具:Charles
反編譯分析工具:IDA64_v7.0
Hook 框架:objection v1.9.1
https://github.com/sensepost/objection
除錯工具:LLDB,Debugserver
抓包分析
抓包發現含有32位數的“_r”引數(可能為MD5加密)以及34位數的sign引數,且每次請求都會變化。經過反覆抓包對比測試,發現無論修改任何引數再提交伺服器都會返回url簽名錯誤,並且發現sign引數最後2位數不變,猜測是32位數MD5密文加字串“01”組成。接下來的重點就是分析“sign”和“_r”是怎麼生成的。
兩次抓包引數文字對比效果圖:
逆向分析“sign”和“_r”引數
使用 frida-iOS-dump 一鍵砸殼後,將砸殼後的二進位制檔案拖入到IDA中進行分析。由於“sign”關鍵字可能存在太多干擾不利於分析,所以我們從一個可能干擾比較少的關鍵字“ttDna” 開始分析。
在IDA strings 視窗搜尋ttDna,有且只有一個結果完全吻合,如下圖:
透過這個關鍵字,我們進入到了函式:-[CBDBaseApi extraParams],果斷使用 objection(如何使用請自行查閱資料) 對此函式進行hook,檢視其引數、返回值和呼叫堆疊,截圖如下:
返回值確實包含了我們抓包中看到的資訊,但是不完整,需要繼續追蹤呼叫函式。
透過第一個堆疊地址 0xc4ed40 + IDA64頭部偏移量 0x100000000 = 0x100c4ed40 找到IDA64中相應地址呼叫的地方,發現在函式:-[MCCBaseApi buildFullUrl:] 內部。我們繼續使用 objection 對此函式進行 hook,發現返回值與我們抓包看到的完全吻合:
從上面返回值的截圖可以看出完整的url是由此函式拼裝而成,接下來我們在IDA64中按F5鍵檢視該函式的虛擬碼,逆向由下往上分析:
return=v21=v20=v14=v13,
發現返回值是
+[MCCURLManager buildUrlString:withParams:sign:]
生成的:
繼續追蹤
-[MCCURLManager buildUrlString:withParams:sign:] ,
發現來自於
-[MCCURLManager buildUrlString:withParams:sign:useBasicParam:usePublicParam:]。
在此函式中,我們發現了“_r”引數。
經過分析“_r”引數是隨機生成的UUID經過MD5加密得到。
繼續一路追蹤sign引數,發現到了一個跟sign有關的函式:+[MCCSignURLManager signUrl1:withKey:],果斷使用 objection hook該函式,引數和返回值僅僅只多了一串sign引數,由此可以判斷sign在此函式內生成,並且發現key值是:
SW+SaqSibZdCmqNyh4WYlW+l,
截圖如下:
繼續分析該函式的虛擬碼,我們看到一個自定義的函式 SignUrl1,如下圖:
雙擊進入SignUrl1,我們又看到另一個自義定函式 SignUrl0,如下圖:
雙擊進入SignUrl0,我們看到熟悉的MD5加密演算法,如下圖:
逆向分析到此,我們可以大膽猜測,SignUrl1是在組裝加密引數,之後將引數傳遞給 SignUrl0 進行MD5加密之後再將密文返回給SignUrl1。
現在我們只需要檢視SignUrl0函式的具體引數就可以知道如何加密了。接下來我們使用LLDB+debugserver(具體如何使用請自行查閱資料)在圖下位置下斷點並檢視傳入的具體引數:
引數1為不包含sign引數部分的請求內容,部分截圖如下:
引數2為key值經過base64decode等步驟轉換而來的固定字串:
5oBjPRiG2ZSbwqDAoQ,
也就是MD5加密的鹽。這裡我們無需深究key是如何轉換的,只需拿到key的固定字串即可:
所以sign引數演算法就是由函式SignUrl0的入參1+入參2經MD5加密後與“01”拼接得到。接下來我們驗證一下我們猜測的演算法與抓包是否一致:
由上面2張圖可以看出sign引數演算法完全正確,至此sign引數和“_r”引數全部告破。接下來就可以使用Python實現演算法然後自由爬取文章了。
3 總結
本篇文章的案例用到了Charles抓包,frida-iOS-dump砸殼,IDA64反編譯,objection HOOK框架,以及LLDB+debugserver除錯等工具。每一個工具的使用都需要花大量時間研究,本文並未對以上工具的使用進行詳細說明,感興趣的同學可以自行查閱相關資料。
案例中的APP也算是大廠開發的,而我們對其二進位制檔案的加密函式分析並不是太難,沒有對關鍵字加密,沒有複雜的演算法,也沒有對函式名進行混淆,直接使用IDA64進行靜態分析,以及使用objection hook檢視引數和返回值就追蹤到了加密的函式。
所以做爬蟲工作碰到APP逆向這個事情,首先不要害怕,其實市場上大多數APP的加密引數都可以透過我們這種方式搞定。當然很難的也有很多,比如關鍵字加密,函式名混淆,反除錯檢測,多執行緒迴圈發包,網路發包封裝第三方庫等等,面對這些只要有信心有耐心,多學習實操總結,慢慢積累經驗,會有所成的,大家共勉!
PS:廣而告之:
把猿人學·爬蟲高階課又更新了,加入了安卓群控,詳情點選https://www.yuanrenxue.com/crawler/advance-course.html
我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。
***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***