1. 程式人生 > >Android逆向之旅---Android手機端破解神器MT的內購VIP功能破解教程

Android逆向之旅---Android手機端破解神器MT的內購VIP功能破解教程

一、前言

在破解app的時候,我們現在幾乎都是在PC端進行操作,但是之前bin神的MT管理器,可以在手機端直接破解,不過也有很大的侷限性,但是對於一些簡單的app破解沒問題的。這個工具其實原理也很簡單,就是解析apk中的dex,arsc等檔案,然後支援修改其中的類方法資訊和資源資訊,然後在二次打包簽名即可。其實把這部分功能移到了移動端做了,不過值得佩服的是這個app從整體效果來說,非常的贊,非常佩服這個工具的作者。

二、逆向分析

但是今天我們的主題是破解這個工具內部的收費功能,而用這個工具進行破解教程後續再給出文章,今天我們就來爆破這個app的收費功能。不多說了,直接上圖:


我們在檢視arsc檔案的一部分功能的時候,就出現這個提示了,好的,直接用這個提示資訊作為突破口,使用apktool工具反編譯apk,然後檢視他的string.xml檔案:


看到這裡,就很懵逼了,而且你會發現apk內部的所有資源都是這種格式定義,到這裡可以猜想apk做了資源混淆,我們用Jadx開啟apk之後,全域性搜尋這個name值,是找不到的,會發現全是R.xxx.MT_Bin這樣的定義,所以這個作者是為了防護apk做的一種策略。不過不要緊更噁心的防護還在後面。看我分析再說。不過在怎麼資源混淆,最終在smali程式碼中都必須用int值0x7FXXXX來進行操作,所以我們可以在smali程式碼目錄下全域性搜尋包含0x7f08009e值的檔案,這裡需要藉助Window中的命令findstr了:


命令很簡單,在當前目錄下查詢所有檔案中包含指定字串內容的:findstr /s /i "需要查詢的內容" *.*

我們可以看到總共就這麼幾個檔案,這裡我不會對每個檔案進行查詢,然後在確定是否是這個檔案了,大家自己操作,可以依次順序進行檢視定位即可。最終我定位到了0oO00OO.8.smali這個檔案。我們開啟這個檔案檢視:


記住在程式碼的157行呼叫這個字串資訊了,然後我們在Jadx中進行類查詢即可:


查詢之後又開始懵逼了,這是他的第二次防護程式碼混淆,你看這些類名被高度混淆了,不過有個規律,就是都是C開頭,然後是4位的數字,後面就是正確的類名。所以後面查詢類都要記住這個規則即可。因為Jadx在查詢類名不區分字元大小寫,這裡通過觀察,可以確定是第一個,我們點選進入即可:


這裡看到,正好是我們想要找的地方,看之前收費的功能截圖:


就是資源查詢功能需要收費。所以到這裡,我們的入口就定位正確了,接下來就開始跟蹤分析程式碼即可。不過這裡有同學會問,上面那幾個找到的檔案,怎麼就能定位到這個入口檔案呢?還是那句話。可以依次對每個smali程式碼進行分析,還有一個辦法就是在每個類中用到的提示資訊地方進行hook,然後操作一下,看看哪個類中列印了,就表示哪個類是正確的。這個是逆向的一點經驗。

接著上面的入口繼續跟蹤程式碼分析:


先不管這個判斷,後面再分析,看看這個提示資訊邏輯:


繼續檢視:


看到了,這裡就是用了toast進行提示的,符合我們看到的效果了。下面就來看看這個判斷了:


通過這裡大致分析到,這個類管理了一個使用者的付費功能的有效期。後面還需要用到這個類,先不管,我們直接用Xposed把這個方法強制返回true即可:


這裡hook的時候,一定要注意類名正確,這個規則之前已經說過了,除去Jadx中顯示類名的Cxxxx後面就是正確的類名了:C2789oOo0oo0o==》oOo0oo0o;就是這樣的規則。記住後面hook都是這麼幹的。

繼續往下看。我們既然hook了這個方法返回true了,那麼程式碼就不走提示資訊了,就往下面走:


這裡會發現又有很多判斷分析,主要是判斷系統版本,然後就還是上面提到的那個類,判斷使用者是否為會員,可以進入檢視程式碼:


這兩個方法看到和時間有關,說明這裡應該和使用者是否為會員到期功能有關,先不管,直接把這兩個方法進行hook,修改返回值為true即可:


不過,既然設計到了會員到期問題,繼續檢視這個到期時間在哪裡設定的:


我們攔截這個類的方法,把時間改成永久會員:


然後我們檢視個人中心資訊:


修改成功了,我們繼續檢視改成永久會員之後的後面判斷:


這裡通過系統版本來判斷高版本中執行時的一些許可權是否開啟,如果沒有開啟,那麼功能也是用不了的,這裡我用的4.4系統,所以這一層判斷對我沒什麼影響。直接往下看:


繼續點選進入程式碼檢視:


通過跟蹤程式碼發現,o是個介面型別,看他賦值的地方是在構造方法中,那麼全域性查詢C05320oO00OO這個類用到的地方:


通過分析,可以確定是最後一條資訊,點選進入即可:


再次確認是這裡,我們正好是處理arsc檔案的。然後全域性搜尋看看這個類方法在哪裡呼叫的:


分析之後,在這個類中呼叫了:


檢視這個類的方法:


最終會呼叫傳入進來的這個類的o方法,我們回到最開始處:


進入繼續檢視程式碼:


這裡就有點問題了,使用工具還是出現錯誤提示:


而這個o方法分析非常麻煩,非常深入,也同時hook了下面的類的run方法:


也並沒有執行,所以問題就出在這個o方法了,而我們可以看到這裡有一個try.catch,並且會列印異常資訊,所以我們可以通過日誌分析,直接過濾System.err即可:


果然不出所料,這裡有崩潰棧資訊就好辦了,直接跟蹤檢視:


這裡看到,有一個判斷,如果是0就正確走邏輯了,那麼簡單,繼續hook這個方法,讓其返回0即可:


不過可惜的是,執行還是有問題:


依然檢視System.err日誌資訊:


直接根據堆疊資訊跟蹤程式碼:


在往上看呼叫程式碼:


發現崩潰日誌就從這裡開始的,上面我們hook了o方法,讓其返回0,走到內部邏輯了,但是沒想到內部卻又有崩潰資訊,我們為了更好的檢視崩潰原因,我們hook這個o方法,把引數位元組陣列和返回值位元組陣列打印出來看結果:


執行Xposed模組,檢視日誌:


看到了,這裡的值返回為null值,所以上面報了異常資訊了。繼續往上看程式碼,看看這個位元組陣列怎麼傳入的:


看到這裡發現,工具做了第三層防護,就是app內部所有的網路請求都採用Socket,防止被輕易抓包破解。可以看到這個工具作者安全防護意識非常強,後面還要介紹第四層防護。因為採用Socket請求,一般抓包工具很難抓到資料了,我們先hook這o方法,列印Socket請求的ip地址和埠號資訊:


然後,我們在去使用那個收費功能,列印日誌:


發現了這個ip地址,對應的域名是binmt.cc了,為了能夠抓到資料包,我們用Wireshark工具進行操作,關於如何使用這個工具抓取手機資料包,不瞭解的同學可以看這篇文章:Wireshark和Fiddler抓取裝置資料包分析;我們過濾一下ip地址看看結果:


結果也是看到,他用了SSL加密資料了,而從上面日誌列印看,也是沒有資料的,因為返回的位元組陣列都是null了。而且返回的資料,我們在跟蹤原生代碼發現,會先進行解壓操作:


然後開始進行資料校驗:


看到整個過程全部用DataInputStream類進行操作,也就是純的位元組操作。對應破解看資料增加了非常大的難度。到這裡也是沒轍了,原因很簡單,首先我們因為沒有購買會員,所以服務端返回的資料肯定是不正確的。那麼首先我們應該獲取爭取的服務端資料,然後替換上面的返回位元組資料的方法返回值即可。

三、破解方案

到這裡,有些同學就困惑了之前說過,任何工具類的app只要收費那麼理論上都是可以破解的,因為工具的功能是在本地,服務端和本地再怎麼驗證都是一個開關而已。但是通過這個app發現,這個開關太多了,他把本地端這個收費功能用服務端的一些位元組資料控制,又加上程式碼資源高度混淆。幾乎很難在往下走了。所以這裡想到另外一個方法,我們可以先去用一個賬戶買個會員,然後使用收費功能,通過hook那個返回位元組陣列的方法,列印資訊,把返回的位元組陣列儲存:


然後我們hook之前的那個o方法,返回這個固定的位元組陣列:


就這樣,我們在執行就可以免費使用了,不過有的同學就覺得很奇怪了,這不是付費了嗎?當然能用了,的確,我們付費買了一個會員,但是有了這個正確的位元組陣列之後,我們只要hook操作,所有的賬戶或者無登入狀態都可以使用,這樣就等於買了一次,每個人都可以使用了。的確是花了一份錢,但是給大家所有人都帶來福利了。為什麼這麼說,因為我們回過頭來看,我們hook了哪些地方?

第一個地方:攔截修改了使用者是否已經登入

第二個地方:攔截了使用者是否為會員記錄

第三個地方:攔截了服務端返回的付費功能位元組陣列

有了這三個地方我們就可以在無登入狀態,利用那一份付費的位元組陣列讓每個人都用上了付費功能。下面來看一下,我沒有登入也能是用這個收費功能效果:


看到了,左上角的登入狀態是無登入狀態,但是依然用到了收費的資源id查詢功能。不管怎麼樣,目的是做到了,但是到現在還有兩個問題:

第一個問題:大家看到了,這個工具的作者是多麼的牛逼,把程式碼資源混淆成這屎樣,還防止抓包用socket通訊,返回全是位元組陣列,每個位元組控制付費功能的邏輯。後續邏輯沒法分析。導致需要花一份冤枉錢,心裡還是很不爽的。

第二個問題:大家看到我本文全程都在用Xposed進行hook修改的,而實際一點應該是改smali程式碼,二次打包這樣才能真正的造福大家,給大家一個真正的免費版MT工具,這就要引出作者的第四層防護了,就是防止二次打包簽名,當然是用了kstools工具了,二次打包執行的確沒有崩潰了,但是出現了ANR了,簽名驗證邏輯在so的start函式中。這個後面會單獨講他的驗證邏輯,因為篇幅太長了。

四、技術知識

因為上面混淆的太多導致追蹤程式碼太多,可能大家看的頭都暈了,其實分析起來更是頭暈,大家可以用樣本自己分析一下就知道了。不過這裡還是總結一下本文破解之後,我們掌握了什麼知識點:

安全防護策略方面:通過本文的幾層安全防護可以學習借鑑一下工具的策略,這個工具可以作為一個安全防護研究的非常好的案例樣本,很多安全防護技術值得研究學習的。

  • 1、程式碼資源的高度混淆還是值得做的,關於本文中的程式碼混淆,可以看出有一定規律,就是混淆後的類字首都是C開頭然後是4位整數然後就是正確的類名了,其實這個可以用我之前介紹混淆工具改一下就可以做到。將類名變數名方法名混淆成自己定義的格式即可,網上也有這個技術,可以自行搜尋。程式碼混淆可以看到,在Jadx中的程式碼跟蹤技術就喪失了,只能完全靠搜尋功能了定位程式碼了。
  • 2、資源混淆的高度混淆還是值得做的,關於本文的資源混淆,之前很多app都做了,主要是騰訊的資源混淆工具叫做AndResGuard,其實當初這個工具的初衷是為了減少應用包apk的大小的。沒想到也能做到混淆防護功能。這麼做之後會發現我們用以往的字串找突破口技術就失效了,不過我們依然可以用全域性搜尋功能來進行查詢突破口,只是花費的時間長了而已。
  • 3、依然是簽名校驗,防止二次打包,本文篇幅原因,二次打包技術問題就等後面再分析,但是可以看出他也用到了比對簽名信息的功能,只不過還有其他比對技術了。所以簽名比對有很多技術來實現了,導致我的kstools工具失效,這時候就需要具體問題具體分析了。
  • 4、為了防止被惡意抓包,應用中所有網路請求使用socket進行加密通訊,這個對於分析來說就加大難度了,因為socket通訊,涉及到的一般都是純位元組陣列,這個對於分析來說非常難受的。

破解爆破策略方面:不管這個工具的安全防護做的如此堅固,但是我們最終還是找到了核心點,原因在於堅持不懈,相信一點,工具app他不像一些視訊VIP功能,收費功能都在服務端控制,比如視訊VIP功能,只有你付費了,服務端才會吐給你視訊連結,這都是服務端做的事,而工具一般功能都是在本地寫死了,只是服務端有一個開關而已。所以堅信這一點,工具類app收費功能是肯定可以破解的。只是看這個開關的破解難度了,比如本文,為了防止抓包,盡然全程用了加密socket進行通訊,通訊中的位元組很多都用於開關控制,導致分析難度非常大。所以本文最後就花了一份會員的錢,來搞定每個人的永久免費功能。而對於此工具其實算是防護的一個漏洞,就是雖然作者把功能開關弄到服務端,用socket加密位元組陣列操作,但是並沒有攜帶使用者相關資訊,看上面的效果可以知道,我沒有登入都可以使用該功能了。工具應該把使用者登入狀態資訊也做一次服務端驗證。

嚴重宣告:本文的目的只有一個,利用樣本案例分析講解更多的逆向技術和知識,如果有人以非法目的利用本文技術謀取利益,帶來一切法律責任都將由操作者承擔,與本文作者無關。由衷的希望讀者以學習逆向知識閱讀此文。介於安全問題,本文涉及到的樣本和程式碼都放在編碼美麗技術圈中,需要進圈獲取即可。

MT管理器作者已經進入編碼美麗技術圈了,分享了很多實用的技術,趕緊進來一睹大神風采


五、總結

本文分析了這個工具的之前幾個版本,發現作者對於安全防護做的非常用心,而且這個作者本身真的很牛逼,開發出這麼一個厲害的工具,可以在裝置端直接破解簡單的應用。這個不得不佩服。後續會繼續介紹用這個工具如何在裝置端直接破解app的功能。有的同學會好奇?既然做了這麼多層安全,為何不在最外一層進行加固,其實說到加固,大家應該都知道了,加固廠商都不能保證加固之後的崩潰率是0,而且工具類app崩潰率或許更高,我猜作者是想這個工具的使用者基數算比較大了,而且更新也很快,一旦發現有安全問題就立即更新,不想因為安全問題帶來崩潰反饋就得不償失了,而一般現在加固廠商企業版都是收費的,費用也不便宜,作者也不想花這個錢,免費版加固其實就是一個魔術,大家都是這個魔術的原理,那就不是魔術了。加固技術一旦被解決了。一樣不安全了。

《Android應用安全防護和逆向分析》

點選立即購買:京東  天貓

更多內容:點選這裡

關注微信公眾號,最新技術乾貨實時推送

編碼美麗技術圈微信掃一掃進入我的"技術圈"世界
掃一掃加小編微信
新增時請註明:“編碼美麗”非常感謝!