(Mac)反編譯Android APK詳細(xì)操作指南[ApkTool,dex2jar,JD-GUI]

早在4年前我曾發(fā)表過一篇關(guān)于《Android開發(fā)之反編譯與防止反編譯》的文章段化,在該文章中我對(duì)如何在Windows平臺(tái)反編譯APK做了講解,如今用Mac系統(tǒng)的同學(xué)越來越多峰弹,也有很多朋友問我能否出一篇關(guān)于如何在Mac平臺(tái)上反編譯APK的文章铅歼,今天呢我就抽時(shí)間來寫一下在Mac平臺(tái)上如何反編譯APK介陶,希望對(duì)感興趣的同學(xué)能有學(xué)幫助。

在開始講解反編譯之前呢踢京,我們先來掃個(gè)盲:

什么是APK?

APK的全程是Android application package誉碴,是Android的應(yīng)用程序包,平時(shí)我們安裝Android應(yīng)用的時(shí)候需要將APK文件下載到本地然后安裝瓣距,Android系統(tǒng)會(huì)將其識(shí)別為Android應(yīng)用包黔帕。另外,需要指出的是APK 其實(shí)是一個(gè)基于 ZIP 文件格式的文件蹈丸,所以支持你用解壓軟件將其解壓成黄,當(dāng)你將APK文件解壓之后你會(huì)看到如下文件:

APK文件結(jié)構(gòu)
  • .dex代碼文件:它是classes文件通過DEX編譯后的文件格式,用于在Dalvik虛擬機(jī)上運(yùn)行的主要代碼部分逻杖;
  • resources 資源文件:以resources以及res目錄為代表的Android程序中所需要的一些資源奋岁,如圖片資源,顏色資源荸百,字符串闻伶,布局等;
  • assets文件:assets目錄下存放的是原生資源文件够话,比如在里面存放字體蓝翰,鈴聲等光绕;
  • manifest清單文件:以AndroidManifest.xml為代表的Android清單文件,清單文件向 Android 系統(tǒng)提供應(yīng)用的必要信息畜份,系統(tǒng)必須具有這些信息方可運(yùn)行應(yīng)用的任何代碼奇钞。

了解過,APK的之后漂坏,接下來就給大家介紹反編譯一個(gè)APK所需要那些工具:

反編譯一個(gè)APK需要那些工具景埃?

無論是在Windows平臺(tái)還是在Mac平臺(tái),反編譯APK都離不了ApkTool顶别、dex2jar谷徙、JD-GUI 這三種工具,那么這三種工具都是做什么用的呢驯绎?

  • ApkTool:是一款應(yīng)用在Apk上的逆向工程的工具完慧,它有編譯、反編譯剩失、簽名等功能屈尼,在這篇文章中會(huì)講解如何利用ApkTool查看apk的xml文件、AndroidManifest.xml和圖片等拴孤。
  • dex2jar:顧名思義脾歧,這款工具的作用主要是將dex文件轉(zhuǎn)換成jar文件,轉(zhuǎn)換成jar后我們才好借助JD-GUI來查看反編譯dex后的代碼演熟;
  • JD-GUI:一款Java反編譯器GUI鞭执,通過它我們能查看到反編譯后的dex的代碼,通常需要配合dex2jar使用芒粹;

準(zhǔn)備工作(安裝ApkTool兄纺、dex2jar、JD-GUI的具體流程)

介紹過ApkTool化漆、dex2jar估脆、JD-GUI 的作用后,接下來我們做一些反編譯前的準(zhǔn)備工作座云,首先呢我們需要安裝ApkTool疙赠。

ApkTool

下載ApkTool

大家可以從https://ibotpeaches.github.io/Apktool/install/上下載ApkTool,也可以下載我為大家準(zhǔn)備好的ApkTool疙教、dex2jar棺聊、JD-GUI

安裝ApkTool

  1. 將下載好的apktool文件與apktool_2.3.1.jar文件準(zhǔn)備好贞谓,并將apktool_2.3.1.jar更名為apktool.jar
  2. apktool.jarapktool移動(dòng)到/usr/local/bin目錄下(可以通過在終端中輸出命令open /usr/local/bin來打開這個(gè)目錄)葵诈;
  3. 為上述兩個(gè)文件增加可執(zhí)行權(quán)限裸弦,即在終端中輸入并執(zhí)行:
    chmod +x apktool.jar
    chmod +x apktool
    
  4. 在終端輸入apktool看是否可以運(yùn)行祟同,如果不可以需要在系統(tǒng)偏好設(shè)置中打開安全與隱私中點(diǎn)擊仍要運(yùn)行apktool.jar;

至此ApkTool的安裝便完成了理疙,在終端運(yùn)行apktool命令會(huì)看到如下輸出:

apktool

dex2jar

下載dex2jar

大家可以從https://sourceforge.net/projects/dex2jar/files/上下載dex2jar晕城,也可以下載我為大家準(zhǔn)備好的ApkTool、dex2jar窖贤、JD-GUI砖顷。
下載后直接解壓即可。

JD-GUI

下載JD-GUI

大家可以從http://jd.benow.ca/上下載JD-GUI赃梧,也可以下載我為大家準(zhǔn)備好的ApkTool滤蝠、dex2jar、JD-GUI授嘀。

使用ApkTool反編譯APK得到xml文件物咳、AndroidManifest.xml和圖片

cd /你存放apk的目錄或在下面命令中使用xxx.apk文件的絕對(duì)路徑
apktool d xxx.apk //該命令執(zhí)行后會(huì)在同級(jí)目錄下生成一個(gè)與你編譯的apk同名的目錄

通過上述命令就可以反編譯apk了。

apktool d

然后在反編譯后生成的目錄中你會(huì)看到相關(guān)的資源文件:

apktool反編譯

由于APkTool只能將資源文件提取處理蹄皱,對(duì)于.dex類型的文件是無法查看的览闰,這里就需要用到dex2jar了。

dex2jar將dex反編譯成jar

第一步巷折,解壓apk獲得dex文件

使用解壓軟件將apk進(jìn)行解壓:


unzip-apk.png

也可將apk文件的后綴改為.rar然后雙擊進(jìn)行快速解壓压鉴。

使用解壓軟件打開apk 和使用apktool反編譯出的apk不同

  • 直接解壓apk和使用apktool反編譯apk都能獲得AndroidManifest.xml,但直接解壓獲得的AndroidManifest.xml是亂碼的锻拘,無法直接查看晴弃;
  • 直接解壓apk獲得res資源文件是不包含resources.arsc部分的,而使用apktool反編譯出來的res是包含的逊拍;
apktool-unzip.png

從上圖中可以看到有2個(gè)classes.dex文件(這是因?yàn)閼?yīng)用了MultiDex所致)這就是項(xiàng)目的源碼 將這個(gè)兩個(gè)文件拷貝到下載解壓的dex2jar目錄下:

classes.dex.png

然后執(zhí)行如下代碼進(jìn)行反編譯:

cd /你的dex2jar解壓目錄 也就是上面圖中存放class.dex文件的目錄
sh d2j-dex2jar.sh classes.dex
sh d2j-dex2jar.sh classes2.dex

通過上述命令會(huì)得到兩個(gè).jar文件:


classes-dex2jar.jar

使用JD-GUI查看反編譯后的程序源碼

將dex轉(zhuǎn)換成jar之后接下來我們就可以使用JD-GUI來查看反編譯后的程序源碼了:

操作步驟很簡單上鞠,只需雙擊運(yùn)行jd-gui-1.4.0.jar,然后將classes-dex2jar.jar拖拽到JD-GUI界面上即可:

jd-gui

FAQ

Permission denied d2j_invoke.sh

為d2j_invoke.sh增加權(quán)限:

sudo chmod +x d2j_invoke.sh //sudo chmod +取消權(quán)限

Exception in thread "main" brut.androlib.AndrolibException: Could not decode arsc file

Apktool的bug使用其他版本的Apktool芯丧,我在使用apktool_2.3.3.jar中遇到了這個(gè)問題芍阎,使用如apktool_2.3.1.jar是好的,如果你也遇到了這個(gè)問題不妨換個(gè)Apktool版本試一下缨恒。

Exception in thread "main"

參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末骗露,一起剝皮案震驚了整個(gè)濱河市岭佳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌萧锉,老刑警劉巖珊随,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡叶洞,警方通過查閱死者的電腦和手機(jī)鲫凶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衩辟,“玉大人螟炫,你說我怎么就攤上這事∫涨纾” “怎么了昼钻?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長封寞。 經(jīng)常有香客問我然评,道長,這世上最難降的妖魔是什么钥星? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任沾瓦,我火速辦了婚禮,結(jié)果婚禮上谦炒,老公的妹妹穿的比我還像新娘贯莺。我一直安慰自己,他們只是感情好宁改,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布缕探。 她就那樣靜靜地躺著,像睡著了一般还蹲。 火紅的嫁衣襯著肌膚如雪爹耗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天谜喊,我揣著相機(jī)與錄音潭兽,去河邊找鬼。 笑死斗遏,一個(gè)胖子當(dāng)著我的面吹牛山卦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诵次,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼账蓉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了逾一?” 一聲冷哼從身側(cè)響起铸本,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎遵堵,沒想到半個(gè)月后箱玷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年汪茧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了椅亚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片限番。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡舱污,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出弥虐,到底是詐尸還是另有隱情扩灯,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布霜瘪,位于F島的核電站珠插,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏颖对。R本人自食惡果不足惜捻撑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缤底。 院中可真熱鬧顾患,春花似錦、人聲如沸个唧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽徙歼。三九已至犁河,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間魄梯,已是汗流浹背桨螺。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酿秸,地道東北人灭翔。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像允扇,于是被迫代替她去往敵國和親缠局。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

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

  • 注意:本篇文章是本人閱讀相關(guān)文章的總結(jié)唱矛,方便以后查閱,所有內(nèi)容非原創(chuàng),侵權(quán)刪。 本篇文章內(nèi)容來自于1.Androi...
    Amy_LuLu__閱讀 5,605評(píng)論 2 4
  • apk是安卓工程打包的最終形式绎谦,將apk安裝到手機(jī)或者模擬器上就可以使用APP管闷。反編譯apk則是將該安卓工程的源碼...
    隋胖胖LoveFat閱讀 66,631評(píng)論 6 56
  • 前言 處理反編譯,首先先要了解apk文件的結(jié)構(gòu)窃肠,然后是編譯過程包个,最后是反編譯。反編譯Apk的目的就是Apk拆成我們...
    yzzCool閱讀 5,710評(píng)論 0 8
  • 作為一名客戶端開發(fā)者冤留,在使用別人Android應(yīng)用的時(shí)候碧囊,你可能會(huì)遇到一些你覺得非常不錯(cuò)或者精致的布局、動(dòng)畫纤怒,你想...
    愛情小傻蛋閱讀 1,372評(píng)論 2 1
  • 1. 為什么要反編譯糯而? 場景一 產(chǎn)品經(jīng)理:xxx,反編譯xxx的播放器泊窘,看看他們是怎么實(shí)現(xiàn)的熄驼? 場景二 測試:這個(gè)...
    傷口不該結(jié)疤閱讀 12,140評(píng)論 7 51