【Android逆向】小白也能學會的一個小時破解某貓社區VIP會員

本文來源於github,文末附有項目地址

前言

不記得是哪一天,忽忽悠悠地就進入了某貓社區(你懂的),從此,每天早上一瓶營養快線。慶幸的是,該社區爲了盈利,開啓了VIP通道和播放次數限制,不然可以直接喝蛋白質了。不過正值青春、精力旺盛的我們,怎麼能讓理智控制慾望?那就成爲高大上的會員,開啓VIP加速通道,無限觀看!充錢?充錢是不可能充錢的,這輩子都不可能充錢。作爲Android開發者,應該用特殊的手段來搞定特殊的事情,帶着我們目標,那就來一次Android的逆向之旅吧!

發佈此文的目的,除了分享整個破解過程外,還希望可以幫助你打開Android逆向的大門,體驗不一樣的Android世界。

此文章僅供技術交流
此文章僅供技術交流
此文章僅供技術交流

...沒時間解釋了,趕緊上車吧...

準備工作

玩逆向的基本工具,這裏需要準備Android逆向三件套 apktooldex2jarjd-gui

apktool:反編譯apk、重新打包新apk。你可以得到 smali、res、AndroidManifest.xml 等文件;

dex2jar:把Android執行的 dex 文件轉成 jar 文件;

jd-gui:一款可以方便閱讀 jar 文件的代碼工具。

他們之間的關係,可以參考下圖:

工具我已經傳到GitHub,但不保證以後是最新版本

下載好上面三個工具,就可以開啓你的逆向之旅了!

逆向開始

提到逆向,可能很多朋友會想到Xposed,用Xposed去Hook參數,繞過if判斷。沒錯,用Xposed確實很容易就能達到目的,但是它的限制比較大,手機需要root,並且安裝Xposed模塊,或者需要跑在VirtualXposed虛擬環境下,增加了使用者的上手成本。

我們這裏的破解方式,會直接輸出一個破解版Apk,使用者不需要進行任何多餘的操作,安裝即可使用。

第一步:將原應用 apk 後綴改成 zip,解壓出 classes.dex 文件

其實這一步是最難的,逆向最難的在於脫殼,脫殼分兩種,手動脫殼(手脫)和機器脫殼(機脫)。什麼是脫殼呢?就是很多App在發佈到應用市場之前,會進行加固,即加殼,它會把真正的dex文件給"藏"起來,我們就需要通過脫殼的方式去找到應用裏真正的dex,才能拿到裏面的源碼。只有拿到源碼並讀懂源碼(混淆後連蒙帶猜),才能找到爆破點,才能修改代碼重新編譯。

我們這裏破解的某貓App,因爲它的特殊性質,它上不了市場,也沒有加固,最可氣的是,它居然不混淆,這讓我們破解的難度直線下降。

第二步:使用 dex2jar 將 classes.dex 轉成 jar 文件

cmd到dex2jar文件夾目錄,執行

    d2j-dex2jar D://xxx/xxx/classes.dex

得到 jar 文件

靜態分析

拿到源碼後,首先我們需要找到應用的限制點,繞過App裏面的判斷。

然後分析源碼,該從哪裏開始入手呢?

我們都知道,一個完整Android應用,可能會存在各種第三方,各種依賴庫,這些依賴都會被編譯到dex裏面,所以這個Jar包裏面會存在很多不同包名的類文件,爲了方便找到破解應用的包名,我們可以藉助adb打印棧頂activity的類全路徑:

    adb shell dumpsys activity | findstr "mFocusedActivity"

activity的包路徑已經打印出來了,接下來在 jar 文件裏面找到 PlayLineActivity.java 的相關代碼。

根據頁面Toast提示,很輕鬆就能定位到爆破點。

    UserUtils.getUserInfo().getIs_vip().equals("1")

可以看出,當會員字段爲 1 時,說明是會員用戶,就會切換至線路2。

    Hawk.put("line", "2");

那接下來只需要修改用戶實體類 UserModelgetIs_vip() 方法,讓它永遠返回 1 就行了。

破解

dex2jar、jd-gui 都只是分析工具,下面纔是真正破解的開始。

Smali簡介

Dalvik虛擬機和Jvm一樣,也有自己的一套指令集,類似彙編語言,但是比彙編簡單許多。我們編寫的Java類,最後都會通過虛擬機轉化成Android系統可以解讀的smali指令,生成後綴爲 .smali 的文件,與Java文件一一對應 (也可能會比Java文件多,典型的比如實現某個接口的匿名內部類),這些smali文件就是Dalvik的寄存器語言。 只要你會java,瞭解android的相關知識,就能輕鬆的閱讀它,

所以,我們真正需要修改的東西,是 java 代碼對應的 smali 指令。

反編譯

我們利用apktool工具,來提取apk裏面的 smali文件。

cmd到apktool文件夾下面,執行 (你也可以配置環境變量,這樣會方便一些)

    apktool.bat d -f [apk輸入路徑] [文件夾輸出路徑]

反編譯成功後,打開smali文件夾,找到 UserModel.java 對應包名下的 UserModel.smali 文件。

爆破

找到了爆破文件,找到了爆破點,接下來就可以對 UserModel.smali 文件進行爆破了(爲什麼叫爆破,我也不知道,行內都是這樣叫的,感覺高大上,其實就是修改文件)。

用編輯器打開 UserModel.smali ,找到 getIs_vip 方法

可以看到,它返回了成員變量 is_vip 的值,我們只需要把它的返回值修改成 1 就行了。

如果對smali指令不熟悉,你可以花10分鐘去了解一下smali的基本語法。

定義一個string類型的常量 v1,賦值爲 1,並將它返回出去。

動態調試

破解的這個好像太簡單了,都省掉了調試步驟,那就直接

保存,搞定!

回編

接下來把反編譯生產的文件夾又重新回編成 apk。

重新打包

cmd到apktool文件夾下面,執行

    apktool b [文件夾輸入路徑] -o [apk輸出路徑]

如果修改smali文件沒有問題的話,就可以正常生成一個新的 apk 文件。

這時候直接將重新打包的apk文件拿去安裝是不行的,因爲之前zip解壓的目錄中,META-INF 文件夾就是存放簽名信息,爲了防止惡意串改。

所以我們需要對重新打包的apk重新簽名。

重新簽名

首先準備一個 .jks 的簽名文件,這個開發android的同學應該很熟悉了。

配置了JDK環境變量,直接執行:

    jarsigner -verbose -keystore [簽名文件路徑] -storepass [簽名文件密碼] -signedjar [新apk輸出路徑] -digestalg SHA1 -sigalg MD5withRSA [舊apk輸入路徑] [簽名文件別名]

最後在你的文件夾下面,就可以看到一個 某貓VIP破解版.apk

安裝並驗證功能

總結

最後來梳理一下破解流程:

1、將原應用 apk 後綴改成 zip,解壓出 classes.dex 文件

2、使用 dex2jar 將 classes.dex 轉成 jar 文件

3、將 jar 文件用 jd-gui 打開,查看源代碼

4、adb定位到類名包路徑,找到相關代碼

5、apktool 反編譯 apk,找到 smali 對應的爆破點

6、修改 smali 文件,調試程序

7、重新打包,重新簽名

以上是我對這次破解流程的一個總結,如果有不對或者遺漏的地方,還請各位大佬指正。

最近有點感冒,乾咳一個多月了還不好起來,想到小菊花媽媽課堂那句話:孩子咳嗽老不好,多半是廢了。我也就放棄治療,待在空蕩的房間,幹着喜歡乾的事_。我也是剛接觸Android逆向沒多久,一開始以爲很複雜,很麻煩,當時只是抱着無聊想試試的心態,反正都放棄治療了,沒想到只花了一個多小時,竟然就成功了,並沒有想象中的那麼難。

如果你對逆向也感興趣的話,並且和我一樣是初學者,我覺得這個實戰過程非常適合你。一是能讓你感受到破解的整個過程;二是難度不大,不會打擊到你的興趣,同時還能得到一定的成就感。

原文地址:github.com/goldze/Anti…

文章寫到這裏就結束了,如果你覺得文章寫得不錯就給個讚唄?你的支持是我最大的動力!

最後,熟悉的閱讀分享環節

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章