Android程序打完包之后是一個(gè)apk程序污尉,可以安裝到Android手機(jī)上示弓。我們反編譯其實(shí)也就是對(duì)這個(gè)APK文件進(jìn)行反編譯。Android的反編譯主要又分為兩個(gè)部分行冰,一個(gè)是對(duì)代碼的反編譯溺蕉,一個(gè)是對(duì)資源的反編譯,我們馬上來逐個(gè)學(xué)習(xí)一下悼做。
一疯特、反編譯
本人自己寫了一個(gè)程序來進(jìn)行反編譯,畢竟反編譯別人的程序不是特別好的事情肛走。這里我的代碼很簡(jiǎn)單就是一個(gè)按鈕點(diǎn)擊彈出一個(gè)Toast來提示“反編譯例子”漓雅。
這是我們的APP例子:Android反編譯.apk
下面讓我們用此APP為例來開始學(xué)習(xí)!
1朽色、我們需要先準(zhǔn)備Android反編譯的三個(gè)工具
- apkTool? 谷歌提供的 APK 編譯工具邻吞,可以反編譯和回編譯。[apkTool下載地址]
- dex2jar:將 dex 文件轉(zhuǎn)換成 jar 包葫男。?[dex2jar下載地址]
- jd-gui:用來查看 jar 包里面的代碼的一種工具抱冷。? [jd-gui下載地址]
2、對(duì)資源進(jìn)行反編譯
1. 這里我們需要用到apkTool
2. 接下來的工作就很簡(jiǎn)單了梢褐,我們將Android反編譯.apk拷貝到和這兩個(gè)文件同樣的目錄當(dāng)中旺遮,然后cmd也進(jìn)入到這個(gè)目錄下赵讯,并在cmd中執(zhí)行如下命令:
apktool d Android反編譯.apk
其中d是decode的意思,表示我們要對(duì)Android反編譯.apk這個(gè)文件進(jìn)行解碼耿眉。那除了這個(gè)基本用法之外边翼,我們還可以再加上一些附加參數(shù)來控制decode的更多行為:
-f 如果目標(biāo)文件夾已存在,則強(qiáng)制刪除現(xiàn)有文件夾(默認(rèn)如果目標(biāo)文件夾已存在鸣剪,則解碼失斪榈住)。
-o 指定解碼目標(biāo)文件夾的名稱(默認(rèn)使用APK文件的名字來命名目標(biāo)文件夾)西傀。
-s 不反編譯dex文件斤寇,也就是說classes.dex文件會(huì)被保留(默認(rèn)會(huì)將dex文件解碼成smali文件)桶癣。
-r 不反編譯資源文件拥褂,也就是說resources.arsc文件會(huì)被保留(默認(rèn)會(huì)將resources.arsc解碼成具體的資源文件)。
常用用法就這么多了牙寞,那么上述命令的執(zhí)行結(jié)果如下圖所示(下圖為成功案例):
3饺鹃、對(duì)代碼進(jìn)行反編譯
1. 這里我們用到dex2jar工具
解壓dex2jar壓縮包后,如下圖
這里面我們用到的是d2j-dex2jar.bat文件间雀。
2. 我們先對(duì)Android反編譯.apk進(jìn)行更改為Android反編譯.zip我們更改apk為zip就行悔详,然后用解壓軟件打開。解壓之后你會(huì)發(fā)現(xiàn)里面有一個(gè)classes.dex文件惹挟,如下圖所示:
這個(gè)classes.dex文件就是存放所有java代碼的地方了茄螃,我們將它拷貝到dex2jar解壓后的目錄下。
3. 在cmd中也進(jìn)入到同樣的目錄连锯,然后執(zhí)行:( dex2jar ? 為文件夾名稱归苍,一般cmd要到此文件夾下 。 ?d2j-dex2jar 與classes.dex ?為文件夾內(nèi)部的文件T瞬馈F雌!)
d2j-dex2jar classes.dex
那么上述命令的執(zhí)行結(jié)果如下圖所示(下圖為成功案例):
這樣我們的目錄下就會(huì)多出兩個(gè)文件
可以看到摇展,classes-dex2jar.jar這個(gè)文件就是我們借助工具之后成功轉(zhuǎn)換出來的jar文件了吻氧。但是對(duì)于我們而言,jar文件也不是可讀的咏连,因此這里還需要再借助一下jd-gui這個(gè)工具來將jar文件轉(zhuǎn)換成java代碼盯孙。
4. 下面我們就要用到我們的第三個(gè)工具了 jd-gui
直接運(yùn)行jd-gui.exe打開classes-dex2jar.jar后就可以了。結(jié)果如下圖所示:
OK祟滴,由此可見振惰,我們的代碼反編譯工作已經(jīng)成功了,MainActivity中的代碼非常清晰踱启,基本已經(jīng)做到了90%以上的還原工作报账。但是如果想要做到100%的代碼還原還是非常有難度的研底,因?yàn)橄駍etContentView()方法傳入的參數(shù),其實(shí)就是一個(gè)資源的id值而已透罢,那么這里反編譯也就只能將相應(yīng)的id值進(jìn)行還原榜晦,而無法變成像R.layout.activity_main這樣直觀的代碼展示。