Real Android, 從逆向開始

reverse engineering

最快的學習方式是直接閱讀實際項目源碼, 最快的開發(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 工具就可以

一步一步帶你反編譯apk,并教你修改smali和重新打包

但是想要更多更全的代碼為長遠所用, 這次我們需要想要做的更多,直接弄成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'

處理完畢之后, 一切清爽多了:

QQ圖片20191027190719.png
QQ圖片20191027190728.png

最后附上gist代碼:

rearrange decompiled apk java source code, for code navigation convenience

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容