最快的學(xué)習(xí)方式是直接閱讀實(shí)際項(xiàng)目源碼佃延, 最快的開發(fā)方式也是直接使用最佳實(shí)踐现诀。 Android逆向, 用來學(xué)習(xí)和研究最合適不過了履肃。
歸功與android和java成熟的開發(fā)者體系仔沿, android 系統(tǒng)通用的, 重要的組件(4大組件, View子類尺棋, 系統(tǒng)服務(wù)等)由于在框架中頻繁用到封锉,app 加固和混淆機(jī)制通常對頂層的代碼通常不會(huì)做過度的混淆處理。
基于此,我們在使用jadx或者其他dex2jar工具后成福, 如果想更進(jìn)一步使用和閱讀源碼碾局。 我們必須對整個(gè)文件依賴有更清晰的認(rèn)知, 這篇文章相當(dāng)于拋磚引玉奴艾, 在分析java文件和包結(jié)構(gòu)的同時(shí)净当,對于和app頂層組件和重要系統(tǒng)第三方庫相關(guān)度高的混淆文件開發(fā)了一個(gè)工具, 方便把原來四分五裂的java class文件重整到相應(yīng)的依賴包中蕴潦, 方便大家閱讀像啼。
下面我們開始這趟逆向之旅吧!
工具選取
首先潭苞,選中你認(rèn)為值得學(xué)習(xí)或者研究的app(這個(gè)還是蠻重要的忽冻,用戶評(píng)分實(shí)最終指標(biāo),不過即便app有其中一個(gè)功能你認(rèn)為做的不錯(cuò)依然值得去研究)
反編譯成smali的話比較容易修改基礎(chǔ)代碼, 重新打包比較不容易出錯(cuò)此疹, 使用apktool 工具就可以
一步一步帶你反編譯apk僧诚,并教你修改smali和重新打包
但是想要更多更全的代碼為長遠(yuǎn)所用, 這次我們需要想要做的更多,直接弄成java的秀菱, 方便學(xué)習(xí)代碼結(jié)構(gòu)
這是一個(gè)一應(yīng)俱全的apk反編譯網(wǎng)站振诬,
APK Decompilers - Online Android APK Decompiler
下載apk之后, 在windows下解壓就可以使用了衍菱! 服務(wù)器應(yīng)該也是windows赶么, 如果你是linux類操作系統(tǒng), 解壓工具可能會(huì)出錯(cuò)脊串, 文件路徑是反斜杠額 ;(
若果你對app某一功能感興趣辫呻, 比如DiscoverActivity, 在查看其java文件代碼的時(shí)候, DiscoverActivity里面會(huì)充斥一些a,b,c,d類似的符號(hào)琼锋, 雖然你會(huì)知道這些符號(hào)不在默認(rèn)package里面就會(huì)在混淆后的頂層package里面放闺, 但是這里有一個(gè)問題: 要理解頂層的DiscoverActivity, 我們順著鏈條找下去, 會(huì)找到混淆代碼中的d,e,f,g等類引用缕坎, 這些類可能是孤立的app feature里面的類怖侦,也可能是第三方混淆后的產(chǎn)物。 而分析三方包谜叹,這個(gè)復(fù)雜性太廣匾寝, 深度也太深了。 特別對于復(fù)雜項(xiàng)目荷腊, 動(dòng)不動(dòng)幾十個(gè)三方包艳悔, 就為了兼容和提高用戶體驗(yàn).
所以:
上帝的歸上帝,凱撒的歸凱撒
凱撒的事情女仰,我們也得做.
項(xiàng)目結(jié)構(gòu)
首先分析下項(xiàng)目結(jié)構(gòu)猜年, 無非就android系統(tǒng)相關(guān)抡锈, 第三方相關(guān), 和本app相關(guān)的代碼
目標(biāo)代碼:
我們遍歷所有java文件乔外, 對于field的聲明和function 參數(shù)類型的聲明的作保留床三, 拋除import語句里面,和內(nèi)部類的聲明袁稽, 加上jdk默認(rèn)關(guān)鍵字和常用類和當(dāng)前package的類使用 最后剩下的就是我們應(yīng)該直接從頂層混淆代碼中down下來查詢的代碼勿璃。
去除引用:
對于直接引用defpackage里面的代碼, 我們使用正則直接將這些類添加到目標(biāo)代碼中推汽, 排除的代碼依然不變
替換類名:
find 和sed 作替換直接引用
find . -type f -print0 | xargs -0 sed -i 's/defpackage.//g'
處理完畢之后, 一切清爽多了:
最后附上gist代碼:
rearrange decompiled apk java source code, for code navigation convenience