博文出處:Android安全機(jī)制之反編譯,歡迎大家關(guān)注我的博客,謝謝!
今天我們就來(lái)探討一下反編譯,其實(shí)反編譯在我一開(kāi)始學(xué)習(xí)Android的時(shí)候就聽(tīng)說(shuō)過(guò),但是一直沒(méi)有去嘗試。初次接觸應(yīng)該就是那次“蜻蜓FM v5.0.1 apk”事件了( 此處應(yīng)有掌聲(ˉ □ ˉ) )。那時(shí)根據(jù)網(wǎng)上的教程第一次反編譯了“蜻蜓FM”的apk,看到了傳說(shuō)中的“普羅米修斯方法”以及“宙斯類(lèi)”(不得不感慨開(kāi)發(fā)小哥的智商)。之后就是在閱讀《Android群英傳》時(shí)也有相關(guān)反編譯的內(nèi)容,覺(jué)得有必要記錄一下。所以這就是本片寫(xiě)博文的起源了。
首先關(guān)于反編譯,我們先要準(zhǔn)備幾個(gè)工具:
- apktool:aoktool主要是用來(lái)反編譯資源文件的,也就是XML了。
- Dex2jar:Dex2jar就是反編譯源代碼的,會(huì)把源代碼反編譯成一個(gè)jar包。
- jd-gui :在上面Dex2jar反編譯出來(lái)的jar包,放入jd-gui中,就可以查看源代碼了。
關(guān)于上面的三個(gè)工具,我會(huì)在文末放出下載鏈接,大家可以去下載。
好了,那接下來(lái)我們就開(kāi)始反編譯之旅吧!
至于要反編譯的apk,我只能選擇自己的Koku了,點(diǎn)擊此處下載。
我們把上面下載下來(lái)的apk用winrar打開(kāi)(當(dāng)然你也可以用其他的解壓工具),我們可以看到里面的文件內(nèi)容如下圖所示:

我們發(fā)現(xiàn)classes.dex這個(gè)文件,其實(shí)classes.dex反編譯出來(lái)就是源代碼。然后我們把Dex2jar解壓出來(lái),發(fā)現(xiàn)里面有d2j-dex2jar.bat,這就是主角了。

在Dex2jar解壓出來(lái)的目錄下,打開(kāi)命令提示符輸入:
d2j-dex2jar.bat [classes.dex所在的路徑]
比如:

運(yùn)行后,我們發(fā)現(xiàn)在Dex2jar解壓出來(lái)的目錄下多了一個(gè)classes-dex2jar.jar。

然后我們把下載下來(lái)的jd-gui.zip解壓,里面會(huì)有jd-gui.exe。相信大家都懂吧。用jd-gui.exe打開(kāi)上面的classes-dex2jar.jar,你會(huì)驚喜地發(fā)現(xiàn)源代碼就在你眼前!

看上面的代碼截圖,我們會(huì)發(fā)現(xiàn)比如說(shuō)setContentView()里面是一串?dāng)?shù)字。不過(guò)別怕,我們都知道R文件是用來(lái)關(guān)聯(lián)資源文件的,把上面的那串?dāng)?shù)字復(fù)制下來(lái),再打開(kāi)R.class,查找一下:

原來(lái)那串?dāng)?shù)字就代表了activity_my_favorite.xml這個(gè)layout。那么問(wèn)題來(lái)了,我們?nèi)绾畏淳幾gXML文件呢?那就要用到上面的apktool了。
打開(kāi)apktool的所在目錄,把koku.apk移動(dòng)到apktool的同一目錄下,輸入命令符:
java -jar apktool_2.1.0.jar d koku.apk
如果你配置了Java環(huán)境變量,則可以直接輸入:
apktool_2.1.0.jar d koku.apk
運(yùn)行完成之后,我們可以發(fā)現(xiàn)在目錄下多了一個(gè)名字叫koku的文件夾,而這就是我們反編譯出來(lái)的XML文件了。

我們打開(kāi)里面的AndroidManifest.xml:

里面真的有<uses-permission>、<activity>等信息!然后我們打開(kāi)res里面的layout文件夾,會(huì)發(fā)現(xiàn)里面有我們上面提到的activity_my_favorite.xml:

里面的布局一目了然。到這里,這樣一個(gè)apk的基本的源代碼我們都可以看得到。當(dāng)然,反編譯別人的apk應(yīng)該是以學(xué)習(xí)為主,而不是惡意地二次打包以及破壞。
在這里額外多說(shuō)一句,如果要反編譯的apk經(jīng)過(guò)了代碼混淆,那么反編譯出來(lái)的就變成了a.class、b.class、c.class等等,所以代碼混淆可以有效地阻止apk反編譯。
而如果你想要將代碼混淆,只要打開(kāi)項(xiàng)目中的build.gradle(Module:app)文件,minifyEnabled為true則說(shuō)明打開(kāi)混淆功能。proguard-rules.pro為項(xiàng)目自定義的混淆文件,在項(xiàng)目app文件夾下找到這個(gè)文件,在這個(gè)文件里可以定義引入的第三方依賴(lài)包的混淆規(guī)則。
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
好了,差不多該講的都講完了,今天就到這里了。
下面給出反編譯工具的下載鏈接:
~have a nice day~