不記得是哪一天,忽忽悠悠地就進入了某貓社區(你懂的),今後,天天早上一瓶養分快線。慶幸的是,該社區爲了盈利,開啓了VIP通道和播放次數限制,否則能夠直接喝蛋白質了。不過正值青春、精力旺盛的咱們,怎麼能讓理智控制慾望?那就成爲高大上的會員,開啓VIP加速通道,無限觀看!充錢?充錢是不可能充錢的,這輩子都不可能充錢。做爲Android開發者,應該用特殊的手段來搞定特殊的事情,帶着咱們目標,那就來一次Android的逆向之旅吧!java
發佈此文的目的,除了分享整個破解過程外,還但願能夠幫助你打開Android逆向的大門,體驗不同的Android世界。android
此文章僅供技術交流
此文章僅供技術交流
此文章僅供技術交流
git
...沒時間解釋了,趕忙上車吧..github
玩逆向的基本工具,這裏須要準備Android逆向三件套 apktool、dex2jar、jd-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,使用者不須要進行任何多餘的操做,安裝便可使用。
其實這一步是最難的,逆向最難的在於脫殼,脫殼分兩種,手動脫殼(手脫)和機器脫殼(機脫)。什麼是脫殼呢?就是不少App在發佈到應用市場以前,會進行加固,即加殼,它會把真正的dex文件給"藏"起來,咱們就須要經過脫殼的方式去找到應用裏真正的dex,才能拿到裏面的源碼。只有拿到源碼並讀懂源碼(混淆後連蒙帶猜),才能找到爆破點,才能修改代碼從新編譯。
咱們這裏破解的某貓App,由於它的特殊性質,它上不了市場,也沒有加固,最可氣的是,它竟然不混淆,這讓咱們破解的難度直線降低。
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");
複製代碼
那接下來只須要修改用戶實體類 UserModel 的 getIs_vip() 方法,讓它永遠返回 1 就好了。
dex2jar、jd-gui 都只是分析工具,下面纔是真正破解的開始。
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