Android 逆向實戰篇(加密數據包破解)

1. 實戰背景
因爲工做須要,要爬取某款App的數據,App的具體名稱此處不便透露,避免他們發現並修改加密邏輯我就得從新破解了。android

爬取這款App時發現,抓包抓到的數據是加密過的,如圖1所示(原數據較長,圖中有省略),能夠看到這個超長的data1字段,並且是加密過的。顯然,對方不想讓咱們直接拿到它的信息,選擇傳過來一個加密的字段,而咱們要作的,就是解密這個字段。json

                                                

                                                                          圖1  數據包截圖服務器

2. 問題分析
既然服務器返回了一段沒法閱讀的加密數據,那麼必然,這段數據是在客戶端進行解密的。所以,咱們要作的就是找出解密代碼,重現它,從而來破解這段加密數據。函數

因此,咱們要作的,就是逆向App→找到解密函數→重現。就這麼簡單。工具

3. 實戰記錄
1) 脫殼
拿到APK後,要作的第一件是就是查殼。若是你第一件事就是用jadx、AndroidKiller、APKTool等各類工具懟的話,那你必定是個愣頭青,鐵頭娃,石樂志。如圖2所示,能夠看到這個App是通過騰訊加固的,須要費一番功夫才能拿到源碼。網站

                                                                 

                                                                                            圖2  查殼加密

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

2) 找到解密函數
找源碼是有技巧的,一行一行閱讀的話頭都禿了源碼還沒讀完,所以須要巧用搜索功能。code

對於搜索功能,我的十分推薦jadx,它的搜索功能十分強大,但隨之而來的是它對內存的巨大需求。能夠看到圖3中,它佔了1600多MB內存。blog

                                               

                                                                                     圖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文件執行起來仍是得費一番功夫的。

相關文章
相關標籤/搜索