Apk的反编译
2016-09-27 本文已影响128人
Silver_Lee
准备工具
- apktool(获取资源)
- dex2jar(获取源码)
- jd-gui(查看源码)
流程
一、获取资源(代码,图片,XML文件等)
- 解压apktool,得到三个文件:apktool.jar,apktool.bat,aapt.exe
- 将需要反编译的apk放到刚才解压的文件夹下
- 打开命令行,定位到刚才的文件夹,执行
apktool.bat d -f [apk文件] -o [输出文件夹]
例:apktool.bat d -f test.apk -o test
如下画面即执行成功
apktool_command
- 反编译成功后找到上面的输出文件夹,这里面就是该apk下的资源了
二、获取源码
- 解压dex2jar,得到一个同名的文件夹dex2jar。解压jd-gui,得到jd-gui.exe。
- 将需要反编译的apk文件后缀改为rar或zip等可解压的格式并解压出来,从中找到一个classes.dex文件,将它放入上面的dex2jar文件夹中
- 命令行定位到dex2jar文件夹,执行
dex2jar.bat classes.dex
下图即执行成功
dex2jar_command.png
- 执行成功后会在该目录下生成一个classes_dex2jar.jar文件,通过刚才解压得到的jd-gui.exe文件打开即可看到源码了
效果图
被混淆后的apk
混淆后的效果图
注意
- apktool解压之后的apktool.jar需要是最新的,否则将会打印以下错误信息
Exception in thread "main" brut.androlib.AndrolibException: Could not decode arsc file
at brut.androlib.res.decoder.ARSCDecoder.decode(ARSCDecoder.java:56)
at brut.androlib.res.AndrolibResources.getResPackagesFromApk(AndrolibResources.java:491)
at brut.androlib.res.AndrolibResources.loadMainPkg(AndrolibResources.java:74)
at brut.androlib.res.AndrolibResources.getResTable(AndrolibResources.java:66)
at brut.androlib.Androlib.getResTable(Androlib.java:50)
at brut.androlib.ApkDecoder.getResTable(ApkDecoder.java:189)
at brut.androlib.ApkDecoder.decode(ApkDecoder.java:114)
at brut.apktool.Main.cmdDecode(Main.java:146)
at brut.apktool.Main.main(Main.java:77)
Caused by: java.io.IOException: Expected: 0x001c0001, got: 0x00000000
at brut.util.ExtDataInput.skipCheckInt(ExtDataInput.java:48)
at brut.androlib.res.decoder.StringBlock.read(StringBlock.java:44)
at brut.androlib.res.decoder.ARSCDecoder.readPackage(ARSCDecoder.java:102)
at brut.androlib.res.decoder.ARSCDecoder.readTable(ARSCDecoder.java:83)
at brut.androlib.res.decoder.ARSCDecoder.decode(ARSCDecoder.java:49)
... 8 more