【逆向】Android逆向小白花一個小時破解某社區VIP

原文地址:https://github.com/goldze/Anti-Android-KM

前言

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

發佈此文的目的,除了分享整個破解過程外,還但願能夠幫助你打開Android逆向的大門,體驗不同的Android世界。android

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

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

準備工做

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

apktool:反編譯apk、從新打包新apk。你能夠獲得 smali、res、AndroidManifest.xml 等文件;編輯器

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

jd-gui:一款能夠方便閱讀 jar 文件的代碼工具。ui

他們之間的關係,能夠參考下圖:spa

下載好上面三個工具,就能夠開啓你的逆向之旅了!.net

逆向開始

提到逆向,可能不少朋友會想到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 文件

第三步:將 jar 文件用 jd-gui 打開,查看源代碼

靜態分析

拿到源碼後,首先咱們須要找到應用的限制點,繞過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

安裝並驗證功能

總結

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

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

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

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

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

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

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

七、從新打包,從新簽名

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

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

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

若是你也想來試一試,請準備好你的養分快線,apk安裝包原文件我會放在羣共享裏,歡迎你的加入!

QQ羣:61455640

Android逆向之旅

相關文章
相關標籤/搜索