1. 程式人生 > >Android逆向實戰篇(加密資料包破解)

Android逆向實戰篇(加密資料包破解)

閱讀本文之前,建議閱讀Android逆向實戰篇(Https抓包)。

1. 實戰背景

由於工作需要,要爬取某款App的資料,App的具體名稱此處不便透露,避免他們發現並修改加密邏輯我就得重新破解了。

爬取這款App時發現,抓包抓到的資料是加密過的,如圖1所示(原資料較長,圖中有省略),可以看到這個超長的data1欄位,而且是加密過的。顯然,對方不想讓我們直接拿到它的資訊,選擇傳過來一個加密的欄位,而我們要做的,就是解密這個欄位。

圖1  資料包截圖

2. 問題分析

既然伺服器返回了一段無法閱讀的加密資料,那麼必然,這段資料是在客戶端進行解密的。因此,我們要做的就是找出解密程式碼,重現它,從而來破解這段加密資料。

所以,我們要做的,就是逆向App→找到解密函式→重現。就這麼簡單。

3. 實戰記錄

1) 脫殼

拿到APK後,要做的第一件是就是查殼。如果你第一件事就是用jadx、AndroidKiller、APKTool等各種工具懟的話,那你一定是個愣頭青,鐵頭娃,石樂志。如圖2所示,可以看到這個App是經過騰訊加固的,需要費一番功夫才能拿到原始碼。

圖2  查殼

脫殼是一項比較麻煩的工作,脫殼大神可以直接進入下一步,像我一樣的小菜雞建議轉去閱讀《Android逆向基礎篇(脫殼機)》,擁有一部脫殼機可以助你輕鬆無腦的脫去市面上大多數的殼。

2) 找到解密函式

找原始碼是有技巧的,一行一行閱讀的話頭都禿了原始碼還沒讀完,因此需要巧用搜索功能。

對於搜尋功能,個人十分推薦jadx,它的搜尋功能十分強大,但隨之而來的是它對記憶體的巨大需求。可以看到圖3中,它佔了1600多MB記憶體。

圖3  jadx佔用記憶體

這裡分享一下我對於程式碼搜尋的一些拙見。想破解請求中的加密欄位,首先肯定是搜尋加密的欄位名,但有時候這些欄位叫做“token”、“key”等隨便搜搜幾千個的名字,那就很難從幾千個中找出來了。這種情況,可以搜尋請求的URL,然後一步步findusage,找出用這個URL的程式碼,慢慢抽絲剝繭總能找到的,個人感覺效率直接搜欄位名要高。使用URL搜尋時不建議輸入整個URL,大多數情況下都會拼接的,找幾個有特徵的詞去搜就行了。

對於返回的加密資料,上面這種搜URL的方法就不好使了。圖1中可以看到加密欄位叫data1,幸好它不叫data,如果它叫data,那就得從5000多個data中把它挖出來。而原始碼中的data1,只有52個,瞬間篩掉了99%的無關程式碼。

搜尋結果如圖4所示。截全圖的話看不清,因此這裡只擷取部分。相信有視力5.3英語16級的小夥伴已經發現了,幾個閃亮的、引人注目的“Decode”,decode data1,那還有疑問嗎?肯定是它乾的好事呀。

圖4  “data1”搜尋結果

在上面隨便找個decode雙擊,然後按住ctrl點選函式名,就能看到這個decode函式的原始碼了,如圖5所示,這個名為eee3DecodeECB的函式,八成就是我們想要找到的解密函數了。

圖5  decode函式原始碼

3) 重現

直接把這段程式碼複製進Intellij中,效果如圖6所示。

圖6  Intellij截圖(1)

圖6紅的彷彿夢中的A股,股市越紅越好,而程式碼則是越紅越不好。我們需要處理這些cannot resolve的東西。

缺啥補啥,先看變數,需要ENCODING,f224IV,SECRET_KEY,不出所料,這幾個都是類中定義的靜態變數,順便把開頭的import也一起復制過來,現在的效果就好多了。

圖7  Intellij截圖(2)

這裡的Base64這個包原本是android.util.Base64,在開發安卓時,在Android Studio中直接import就可以了,但在Intellij中直接import是不行的,需要自己把這個包下載一下。

不報錯了,那就寫個main函式解密試試。把抓包抓到的巨長無比的data1複製到main中的data1,然後呼叫一下剛才重現的解密函式。因為data1實在是長,這裡就不復制進去的,請自行腦補。還有,記得一定要寫try。

圖8  main函式

從頭到尾再看一遍我們重現的解密程式碼,一切都很perfect,執行走起。看一下執行結果,是一段Json格式的資料,找一個json線上格式化的網站把執行結果複製進行,結果如圖9所示,顯然,完成了對加密資料包的解密

圖9  執行結果

可以看到,經過上述操作,完成了對加密資料包的解密。

4. 總結

上述過程並不複雜,也幾乎沒有任何難點,因此這種加密方式可以說並不合格,甚至可以說有些自欺欺人。加密的本意顯然是為了增加一點破解難度,但我這樣的菜雞也只花了不到半小時就完成了破解,何況專業的逆向大神呢。講真,哪怕把data1這個名字改成data也能增加一些破解的時間成本。

單純的Java程式碼加密太容易破解了,建議此類場景還是用So加密更好,畢竟想要把so檔案執行起來還是得費一番功夫的。