1. 程式人生 > >android黑科技系列——手機端破解神器MT的內購VIP功能破解教程

android黑科技系列——手機端破解神器MT的內購VIP功能破解教程

android 數組操作 支持 fontsize 科技 學習 xxx cxx tools

一、前言

在破解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加密字節數組操作,但是並沒有攜帶用戶相關信息,看上面的效果可以知道,我沒有登錄都可以使用該功能了。工具應該把用戶登錄狀態信息也做一次服務端驗證。

android黑科技系列——手機端破解神器MT的內購VIP功能破解教程