Android反編譯技術(shù)總結(jié)

一、Apk反編譯工具及其使用方法

1.原理

學習反編譯之前,建議先學習一下Apk打包的過程,明白打包完成后的Apk里面都有什么文件瀑罗,各種文件都是怎么生成的胸嘴。

這里有兩篇AndroidWeekly中推薦過的好文章:

Apk技術(shù)也有非常多的技術(shù)可以學習,主要都是圍繞著如何減小體積斩祭,如何提高打包速度展開劣像,這里先不多說了。下面是一張基本的Apk文件結(jié)構(gòu)圖摧玫。

APK文件結(jié)構(gòu)

Apk文件本質(zhì)上其實是一個zip包耳奕。直接拿解壓工具解壓就可以看到其中包含了什么。下面簡單介紹一下Apk文件的結(jié)構(gòu)诬像。

  • AndroidManifest.xml:應用的全局配置文件
  • assets文件夾:原始資源文件夾屋群,對應著Android工程的assets文件夾,一般用于存放原始的網(wǎng)頁坏挠、音頻等等芍躏,與res文件夾的區(qū)別這里不再贅述,可以參考上面介紹的兩篇文章降狠。
  • classes.dex:源代碼編譯成class后对竣,轉(zhuǎn)成jar,再壓縮成dex文件榜配,dex是可以直接在Android虛擬機上運行的文件否纬。
  • lib文件夾:引用的第三方sdk的so文件。
  • META-INF文件夾:Apk簽名文件芥牌。
  • res文件夾:資源文件,包括了布局聂使、圖片等等壁拉。
  • resources.arsc:記錄資源文件和資源id的映射關系。

上面的截圖中每個文件都是一個最基本的Apk 文件應該包含在內(nèi)的柏靶。但是直接把Apk當做zip解壓后的這些文件是沒法直接閱讀的弃理,畢竟他們都是經(jīng)過了build-tools打包工具處理過的。我們直接用文本編輯器打開這里面的Manifest文件看看屎蜓。

反編譯前的Manifest文件

反編譯Apk的目的就是Apk拆成我們可以閱讀的文件痘昌。通過反編譯,我們一般想要得到里面的AndroidManifest.xml文件炬转、res文件java代碼辆苔。

2.Apk反編譯步驟

(1) ApkTool拆包,得到AndroidManifest和res等資源文件

工具下載地址:https://bitbucket.org/iBotPeaches/apktool/downloads

功能:拆解Apk文件扼劈,反編譯其中的資源文件驻啤,將它們反編譯為可閱讀的AndroidManifest.xml文件res文件。前面講過荐吵,直接把Apk文件當做zip解壓骑冗,得到的xml資源文件赊瞬,都是無法直接用文本編輯器打開閱讀的,因為它們在打包時經(jīng)過了build-tools的處理贼涩。

用法:官網(wǎng)https://ibotpeaches.github.io/Apktool/documentation/有介紹巧涧,最新版本是2.2.0,運行環(huán)境需要jre1.7遥倦。

這里叹括,我演示一下用apktool來拆解Apk文件的基本方法惧眠,只需要在終端里面執(zhí)行下面的命令。

java -jar apktool.jar d yourApkFile.apk
// 注意`apktool.jar`是剛才下載后的jar的名稱,`d`參數(shù)表示decode
// 在這個命令后面還可以添加像`-o -s`之類的參數(shù)帕涌,例如
// java -jar apktool.jar d yourApkFile.apk -o destiantionDir -s
// 幾個主要的參數(shù)設置方法及其含義:
-f 如果目標文件夾已存在,強制刪除現(xiàn)有文件夾
-o 指定反編譯的目標文件夾的名稱(默認會將文件輸出到以Apk文件名命名的文件夾中)
-s 保留classes.dex文件(默認會將dex文件解碼成smali文件)
-r 保留resources.arsc文件(默認會將resources.arsc解碼成具體的資源文件)

下面我們看一下java -jar apktool.jar d yourApkFile.apk拆解后的結(jié)果:

Apk拆包結(jié)果

我們已經(jīng)得到一個可以用文本編輯器打開的閱讀的AndroidManifest.xml文件埂息、assets文件夾良蒸、res文件夾、smali文件夾等等粮呢。original文件夾是原始的AndroidManifest.xml文件婿失,res文件夾是反編譯出來的所有資源,smali文件夾是反編譯出來的代碼啄寡。注意豪硅,smali文件夾下面,結(jié)構(gòu)和我們的源代碼的package一模一樣挺物,只不過換成了smali語言懒浮。它有點類似于匯編的語法,是Android虛擬機所使用的寄存器語言识藤。

這時砚著,我們已經(jīng)可以文本編輯器打開AndroidManifest.xml文件和res下面的layout文件了。這樣痴昧,我們就可以查看到這個Apk文件的package包名稽穆、Activity組件、程序所需要的權(quán)限赶撰、xml布局舌镶、圖標等等信息。其實我們把Apk上傳到應用市場時豪娜,應用市場也會通過類似的方式解析我們的apk餐胀。

note1:其實還有一種方法,可以省去每次解包時瘤载,都要輸入java -jar apktool.jar xxx這行命令骂澄,官網(wǎng)也有說明,就是將這個命令包裝成shell腳本惕虑,方法見:https://ibotpeaches.github.io/Apktool/install/

note2:如果你在編譯的時候坟冲,發(fā)現(xiàn)終端里面提示發(fā)生了brut.android.UndefinedResObject錯誤磨镶,說明你的apktool.jar版本太低了,需要去下載新版工具了健提。

note3:如果想要自己實現(xiàn)一個解析Apk文件琳猫,提取版本、權(quán)限信息的java服務時私痹,可以引用apktool.jar中的ApkDecoder脐嫂,調(diào)用decode方法來實現(xiàn)∥勺瘢可以看下圖中账千,apktool.jar里面有解析Apk文件的實現(xiàn)。

apktool.jar

(2) dex2jar反編譯dex文件暗膜,得到java源代碼

上一步中匀奏,我們得到了反編譯后的資源文件,這一步我們還想看java源代碼学搜。這里要用的工具就是dex2jar娃善。

工具下載地址:https://sourceforge.net/projects/dex2jar/

功能:將dex格式的文件,轉(zhuǎn)換成jar文件瑞佩。dex文件時Android虛擬機上面可以執(zhí)行的文件聚磺,jar文件大家都是知道,其實就是java的class文件炬丸。在官網(wǎng)有詳細介紹瘫寝。

用法:打開下載的dex2jar-2.0文件夾,里面有shell和bat腳本稠炬,進入終端焕阿,就可以在命令行使用了。

d2j-dex2jar classes.dex
// 獲取classes.dex文件在最前面說過酸纲,只要把Apk當做zip解壓出來捣鲸,里面就有dex文件了
// 或者用apktool反編譯時帶上 `-s` 參數(shù)

運行后瑟匆,可以看到classes.dex已經(jīng)變成了classes-dex2jar.jar闽坡。

進入dex2jar文件夾

note1:第一次下載下來后,在mac里運行的時候可能會提示需要管理員的權(quán)限愁溜,這里我給這些sh腳本chmod 777后疾嗅,即可運行它。

root執(zhí)行dex2jar

note2:寫完這一節(jié)的時候冕象,我發(fā)現(xiàn)把dex轉(zhuǎn)換成jar已經(jīng)有了更好的工具enjarify代承,https://github.com/google/enjarify這個工具是谷歌官方開源的用于反編譯dex文件的。使用方法和dex2jar差不多渐扮,也是簡單的命令行操作论悴。這個工具的主頁中也提到dex2jar已經(jīng)是一個比較老的工具掖棉,在遇到混淆等等復雜的情況時,可能無法正常工作膀估。所以這里推薦大家使用enjarify這個工具幔亥。

(3) jd-gui查看java源代碼

工具下載地址:官網(wǎng)http://jd.benow.ca/上選擇自己所需要的版本。

功能:這個工具不用多說察纯,寫java的人都知道帕棉。有時候我們自己開發(fā)一個jar包給別人用,也會用它來查看class是不是都被正確的打入到了jar內(nèi)饼记,我以前介紹的gradle自定義打包jar的博客中也提到過它香伴。

用法:下載后雙擊既可以運行這個工具,直接把上一步得到的classes-dex2jar.jar拖到jd-gui程序的界面上即可打開了具则,效果如下圖所示即纲。

classes-dex2jar.jar

反編譯Apk步驟小結(jié)

反編譯一個Apk,查看它的資源文件和java代碼乡洼,我們需要用到3個工具崇裁。

反編譯就是用這3個工具得到AndroidManifest.xml、res束昵、java代碼等拔稳。但是我們可以看到,如果你要對一個Apk做盡可能徹底的反編譯锹雏,把它扒得干干凈凈巴比,這一步一步的基本操作還是稍顯麻煩。另外加固過Apk的情況可能更復雜礁遵,需要我們勤動手嘗試轻绞。為了能提高效率,下面我把自己見過的一些集成工具介紹給大家佣耐,盡可能實現(xiàn)可以一鍵反編譯Apk政勃。

二、自動化工具匯總(一鍵反編譯Apk)

1.谷歌提供的工具:android-classyshark

下載地址:https://github.com/google/android-classyshark/releases兼砖,下載下來之后是一個可執(zhí)行的jar文件奸远,win下或者mac下都只要雙擊即可運行。

功能:帶有界面讽挟,一鍵反編譯Apk工具懒叛,直接打開Apk文件,就可以看到Apk中所有的文件結(jié)構(gòu)耽梅,甚至還集成了dex文件查看薛窥,java代碼查看,方法數(shù)分析眼姐、導入混淆mapping文件等一系列工具诅迷。谷歌推出這個工具的目的是為了讓我們開發(fā)者更清楚的了解自己的Apk中都有什么文件佩番、混淆前后有什么變化,并方便我們進一步優(yōu)化自己的Apk打包實現(xiàn)罢杉。下面帶上幾張截圖答捕,真是帥氣的一筆的好工具啊屑那!

dex文件查看
方法數(shù)分析

即將到來的Android Studio 2.2中集成了一個叫做APK Analyzer的功能拱镐,這個功能不知道是不是和這個工具有關系呢,本人還沒有嘗試過2.2版本持际,有興趣的朋友可以體驗一下preview版本沃琅。

2.Python實現(xiàn)的工具:AndroidGuard

下載地址:https://github.com/androguard/androguard/releases

功能:集成了反編譯資源、代碼等各種文件的工具包蜘欲。需要安裝Python環(huán)境來運行這個工具益眉,這個工具按照不同的反編譯需求,分別寫成了不同的py功能模塊姥份,還有靜態(tài)分析的功能郭脂。所以如果想要用Python開發(fā)一個解析Apk文件并進行靜態(tài)掃描分析的服務,可以引用這個工具來實現(xiàn)澈歉。

用法:具體用法比較多展鸡,這里也不再展開了“D眩可以通過工具內(nèi)置的-h幫助指令查看各個模塊的功能莹弊。

unclechendeiMac:androguard-2.0 unclechen$ python androaxml.py -h
Usage: androaxml.py [options]

Options:
  -h, --help            show this help message and exit
  -i INPUT, --input=INPUT
                        filename input (APK or android's binary xml)
  -o OUTPUT, --output=OUTPUT
                        filename output of the xml
  -v, --version         version of the API

// androaxml.py這個模塊是用來解析AndroidManifest文件的,`-i` 表示輸入的apk文件涡尘,`-o` 表示輸出xml文件忍弛。

3.Mac專屬工具:Android-Crack-Tool

功能:這是網(wǎng)上一位名為Jermic的大神開發(fā)的、在Mac環(huán)境下使用的App考抄,集成了Android開發(fā)中常見的一些編譯/反編譯工具细疚,方便用戶對Apk進行逆向分析,提供Apk信息查看功能川梅。工具的截圖如下所示疯兼,非常強大。

Android-Crack-Tool.app

4.手機上的反編譯工具:ApkParser

功能:在電腦上已經(jīng)有了這么多的工具挑势,在手機上的也有很方便的工具镇防。APKParser是一款在查看手機上已經(jīng)安裝的Apk的信息的工具啦鸣,他可以查看軟件的AndroidManifest.xml文件潮饱、方法數(shù)、res資源文件诫给,并在手機上直接展示出來香拉。個人覺得這是一個非常實用的工具啦扬,作為開發(fā)者,手機里面必須要有它凫碌。

ApkParser

5.工具匯總

以上幾款工具都是我體驗過扑毡、感覺不錯的集成工具,推薦給大家盛险。臨近本文結(jié)束前瞄摊,又發(fā)現(xiàn)了這么一個福利網(wǎng)站-http://www.androiddevtools.cn/,其中有一章專門總結(jié)了各種Apk反編譯的工具苦掘。相信有了這么多的利器换帜,大家應該有100種方法將一個App扒得干干凈凈了。

Apk反編譯工具匯總
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鹤啡,一起剝皮案震驚了整個濱河市惯驼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌递瑰,老刑警劉巖祟牲,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異抖部,居然都是意外死亡说贝,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門慎颗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狂丝,“玉大人,你說我怎么就攤上這事哗总〖秆眨” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵讯屈,是天一觀的道長蛋哭。 經(jīng)常有香客問我,道長涮母,這世上最難降的妖魔是什么谆趾? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮叛本,結(jié)果婚禮上沪蓬,老公的妹妹穿的比我還像新娘。我一直安慰自己来候,他們只是感情好跷叉,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般云挟。 火紅的嫁衣襯著肌膚如雪梆砸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天园欣,我揣著相機與錄音帖世,去河邊找鬼。 笑死沸枯,一個胖子當著我的面吹牛日矫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绑榴,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼搬男,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了彭沼?” 一聲冷哼從身側(cè)響起缔逛,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎姓惑,沒想到半個月后褐奴,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡于毙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年敦冬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唯沮。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡脖旱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出介蛉,到底是詐尸還是另有隱情萌庆,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布币旧,位于F島的核電站践险,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吹菱。R本人自食惡果不足惜巍虫,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鳍刷。 院中可真熱鬧占遥,春花似錦、人聲如沸输瓜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至凛捏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間芹缔,已是汗流浹背坯癣。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留最欠,地道東北人示罗。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像芝硬,于是被迫代替她去往敵國和親蚜点。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容