
最快的學習方式是直接閱讀實際項目源碼, 最快的開發(fā)方式也是直接使用最佳實踐。 Android逆向, 用來學習和研究最合適不過了。
歸功與android和java成熟的開發(fā)者體系, android 系統(tǒng)通用的, 重要的組件(4大組件, View子類, 系統(tǒng)服務等)由于在框架中頻繁用到,app 加固和混淆機制通常對頂層的代碼通常不會做過度的混淆處理。
基于此,我們在使用jadx或者其他dex2jar工具后, 如果想更進一步使用和閱讀源碼。 我們必須對整個文件依賴有更清晰的認知, 這篇文章相當于拋磚引玉, 在分析java文件和包結構的同時,對于和app頂層組件和重要系統(tǒng)第三方庫相關度高的混淆文件開發(fā)了一個工具, 方便把原來四分五裂的java class文件重整到相應的依賴包中, 方便大家閱讀。
下面我們開始這趟逆向之旅吧!
工具選取
首先,選中你認為值得學習或者研究的app(這個還是蠻重要的,用戶評分實最終指標,不過即便app有其中一個功能你認為做的不錯依然值得去研究)
反編譯成smali的話比較容易修改基礎代碼, 重新打包比較不容易出錯, 使用apktool 工具就可以
但是想要更多更全的代碼為長遠所用, 這次我們需要想要做的更多,直接弄成java的, 方便學習代碼結構
這是一個一應俱全的apk反編譯網(wǎng)站,
APK Decompilers - Online Android APK Decompiler
下載apk之后, 在windows下解壓就可以使用了! 服務器應該也是windows, 如果你是linux類操作系統(tǒng), 解壓工具可能會出錯, 文件路徑是反斜杠額 ;(
若果你對app某一功能感興趣, 比如DiscoverActivity, 在查看其java文件代碼的時候, DiscoverActivity里面會充斥一些a,b,c,d類似的符號, 雖然你會知道這些符號不在默認package里面就會在混淆后的頂層package里面, 但是這里有一個問題: 要理解頂層的DiscoverActivity, 我們順著鏈條找下去, 會找到混淆代碼中的d,e,f,g等類引用, 這些類可能是孤立的app feature里面的類,也可能是第三方混淆后的產(chǎn)物。 而分析三方包,這個復雜性太廣, 深度也太深了。 特別對于復雜項目, 動不動幾十個三方包, 就為了兼容和提高用戶體驗.
所以:
上帝的歸上帝,凱撒的歸凱撒
凱撒的事情,我們也得做.
項目結構
首先分析下項目結構, 無非就android系統(tǒng)相關, 第三方相關, 和本app相關的代碼
目標代碼:
我們遍歷所有java文件, 對于field的聲明和function 參數(shù)類型的聲明的作保留, 拋除import語句里面,和內(nèi)部類的聲明, 加上jdk默認關鍵字和常用類和當前package的類使用 最后剩下的就是我們應該直接從頂層混淆代碼中down下來查詢的代碼。
去除引用:
對于直接引用defpackage里面的代碼, 我們使用正則直接將這些類添加到目標代碼中, 排除的代碼依然不變
替換類名:
find 和sed 作替換直接引用
find . -type f -print0 | xargs -0 sed -i 's/defpackage.//g'
處理完畢之后, 一切清爽多了:


最后附上gist代碼:
rearrange decompiled apk java source code, for code navigation convenience