Apk的反编译

参考自Android APK反编译就这么简单 详解(附图)

准备工具

  • apktool(获取资源)
  • dex2jar(获取源码)
  • jd-gui(查看源码)

流程

一、获取资源(代码,图片,XML文件等)
  1. 解压apktool,得到三个文件:apktool.jarapktool.bataapt.exe
  2. 将需要反编译的apk放到刚才解压的文件夹下
  3. 打开命令行,定位到刚才的文件夹,执行

apktool.bat d -f [apk文件] -o [输出文件夹]
例:apktool.bat d -f test.apk -o test

如下画面即执行成功


Apk的反编译_第1张图片
apktool_command
  1. 反编译成功后找到上面的输出文件夹,这里面就是该apk下的资源了
二、获取源码
  1. 解压dex2jar,得到一个同名的文件夹dex2jar。解压jd-gui,得到jd-gui.exe
  2. 将需要反编译的apk文件后缀改为rar或zip等可解压的格式并解压出来,从中找到一个classes.dex文件,将它放入上面的dex2jar文件夹中
  3. 命令行定位到dex2jar文件夹,执行

dex2jar.bat classes.dex

下图即执行成功


Apk的反编译_第2张图片
dex2jar_command.png
  1. 执行成功后会在该目录下生成一个classes_dex2jar.jar文件,通过刚才解压得到的jd-gui.exe文件打开即可看到源码了
    Apk的反编译_第3张图片
    效果图

    被混淆后的apk
    Apk的反编译_第4张图片
    混淆后的效果图

注意

  1. 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

你可能感兴趣的:(Apk的反编译)