如果你想反編譯一個簡單的APK文件,修改里面的代碼,那么你不妨嘗試看一下,還是不難的。

系統(tǒng):Windows
一、apktool
apktool工具的作用:
- 我們可以通過apktool去查看apk的AndroidManifest、XML文件和圖片資源文件。
- 可以修改apk中的代碼,不過并非源碼,而是smail文件,這個后面會講。
首先要下載apktool工具,我們需要去到apktool官網(wǎng)去下,鏈接是:https://ibotpeaches.github.io/Apktool/install/

翻譯過來是這樣子:

我這邊是在E盤新建一個“apktool反編譯工具”的文件夾,并將兩個文件(apktool.jar)&(apktool.bat)放在里邊,然后配置系統(tǒng)環(huán)境變量Path:

然后調(diào)出cmd命令行窗口,就可以自由使用apktool命令了~
相關(guān)命令:
//apk解析
apktool d -f E:\gongju\apktool反編譯工具\app.apk -o E:\gongju\apktool反編譯工具\test
解析后的目錄結(jié)構(gòu)是這樣的:

這里我們可以查看:
assets:資源文件
lib:jni相關(guān)的so包
original:原始的AndroidManifest.xml文件和簽名文
res:xml和圖片資源
smail:反編譯出來的代碼,smail文件夾中目錄結(jié)構(gòu)和源代碼的包一樣
AndroidManifest:就AndroidManifest.xml
//打包成apk
apktool b -f E:\gongju\apktool反編譯工具\test -o E:\gongju\apktool反編譯工具\packed.apk
此外,可以修改smail文件后用apktool工具來重新打包,這樣子避免了開發(fā)過程中一些小改動導(dǎo)致重新修改、編譯以及打包的情況。
那么問題來了,smail文件是什么?
Dalvik虛擬機和Jvm一樣,也有自己的一套指令集,類似匯編語言,但是比匯編簡單許多,只要你會java,了解android的相關(guān)知識,就可以輕松的看懂,如果得到這些匯編文件呢,利用apktool或者dex2jar工具包(網(wǎng)上很多),反編譯classes.dex文件,就可以得到以smali為后綴的文件,這些smali文件就是Dalvik的寄存器語言。
以上是摘抄的,打開來看看是這樣子的,怎么樣?我反正看不怎么懂。

怎么改代碼呢?是不是還要學(xué)會這種匯編語言的語法呢?其實大可不必,只要會看一點就可以。
首先我們需要定位要改的代碼所在的位置,這里用到的工具有:
- dex2jar:將dex文件轉(zhuǎn)換成jar文件的工具
- jd-gui:查看jar文件的反編譯工具
二、dex2jar
下載地址:https://sourceforge.net/projects/dex2jar/postdownload
使用步驟:
-
把app(應(yīng)用名稱).apk的后綴改成zip或者rar,即改成app.zip或app.rar,右鍵“解壓”出來,目錄結(jié)構(gòu)如下:
拿到dex文件 - 把classes.dex文件拷貝到的dex2jar文件夾下,執(zhí)行命令:
d2j-dex2jar classes.dex
至此dex文件就轉(zhuǎn)化為jar文件了。
image.png
三、jd-gui
下載地址:http://java-decompiler.github.io/

使用步驟:
-
打開工具,查看jar包信息,可以定位到需要修改的地方,假設(shè)我要改一個請求的url地址,馬上就可以定位到:
- 根據(jù)路徑可以確認(rèn)smail文件的位置,如圖上所示。然后去到對應(yīng)的smail文件夾(這里是com\game\sdk\util\Constans.smail),改了它就可以了。
這只是一個簡單的修改,同樣你如果有這個項目中依賴的包的源碼,你就可以改這個包源碼。通過編譯成jar文件,再通過轉(zhuǎn)化為dex(通過dx.bat),再轉(zhuǎn)化為smail(baksmali.jar),最終替換調(diào)此項目中的相關(guān)smail即可。
四、dx.bat
1.這個是Android自帶的(如何你安裝了Android Studio)工具,你可以在以下目錄中找到它:

2.通過cmd命令行進入到當(dāng)前目錄:
cd C:\Users\Administrator\AppData\Local\Android\Sdk\build-tools\28.0.3輸入此命令:
dx.bat --dex --no-strict --no-warning --output=E:\work\out\dex\classes.dex(此處替換你想輸入dex文件的位置) E:\Project\jhsdk\build\intermediates\bundles\default\classes.jar(此處替換你的jar文件所在的位置)拿到
五、baksmali.jar
下載鏈接:
https://bitbucket.org/JesusFreke/smali/downloads/
命令:
java -jar baksmali.jar(此處為baksmail.jar文件的路徑) -o E:\work\out\smali(輸出smail文件的位置) E:\work\out\dex\classes.dex(dex文件的位置)
六、補充
上述這些都是代碼層面的修改,如果我們想改資源就更簡單了,直接在res文件中修改,不過要注意不能隨意更改,資源大都被引用了,刪除了會導(dǎo)致我們在build構(gòu)建apk時直接報錯,亦或者安裝apk失敗。
另外,如果我們要改apk的包名和版本呢?包名簡單,只需要在AndroidManifest中修改就可以,sdk版本在哪修改呢?在這兒:



