Android APK 反编译要做两件事:一是要将apk里的dex文件转换成Jar包,再通过工具查看编译前的java源文件。二是通过工具查看apk里对应的AndroidManifest.xml、resources.arsc、res各布局文件等二进制文件。在开始反编译之前我们先看下APK文件的构成。

一、APK文件的构成

apk文件的本质是压缩文件,我们将apk文件修改后缀名为zip或者rar等,可以直接解压缩查看apk文件夹。解压后的内容如下:

apkfile
apkfile

  • assets文件夹:原始资源文件夹,对应着Android工程的assets文件夹,一般用于存放原始的图片、txt、css等资源文件。
  • lib:存放应用需要的引用第三方SDK的so库。比如一些底层实现的图片处理、音视频处理、数据加密的库等。而该文件夹下有时会多一个层级,这是根据不同CPU 型号而划分的,如 ARM,ARM-v7a,x86等。
  • META-INF:保存apk签名信息,保证apk的完整性和安全性。
  • res:资源文件夹,其中的资源文件包括了布局(layout),常量值(values),颜色值(colors),尺寸值(dimens),字符串(strings),自定义样式(styles)等。
  • AndroidManifest.xml文件:全局配置文件,里面包含了版本信息、activity、broadcasts等基本配置。不过这里的是二进制的xml文件,无法直接查看,需要反编译后才能查看。
  • classes.dex文件:这是安卓代码的核心部分,,dex是在Dalvik虚拟机上可以执行的文件。这里有classes.dex 4个文件,说明工程的方法数较多,进行了dex拆分。如果apk的方法数超过了65535,会生成多个dex文件,反编译的话需要对这多个dex文件均进行转换Jar包处理。
  • resources.arsc文件:记录资源文件和资源id的映射关系。

二、反编译分解步骤

如果进行逐步分解的反编译工具需要用到三个工具:

  • apktool:查看二进制文件
  • dex2jar:将dex文件转换成Jar包
  • jd-gui:将Jar包文件反编译成java源文件

具体步骤为:

1java -jar apktool_2.3.4.jar d -f yv.apk -o vpn

yv.apk (要反编译的apk名字) vpn(反编译后存到vpn目录下)。

反编译dex文件,将解压出的dex文件放到dex2jar目录,执行如下命令命令行反编译为jar文件。

1d2j-dex2jar.bat classes.dex
2d2j-dex2jar.bat classes2.dex
3d2j-dex2jar.bat classes3.dex
4d2j-dex2jar.bat classes4.dex

最后使用jd-gui将Jar包文件反编译成java源文件,见下图:

dex-class-java
dex-class-java

这里有时候会看到诸如a.a.a、b等字母标示的包名、类名或者方法名,这是由于在某些apk打包的时候进行代码混淆导致的。使用反编译工具只能看到混淆之后的代码结构,真正未混淆前的源码还需要结合mapping.txt文件进行分析。mapping.txt文件里即标注出了代码混淆前后的文件名称对应关系。

三、集成反编译工具

集成实现一步反编译的工具有jadxAndroid-classysharkAndroid Studio等。该工具支持直接将apk文件反编译为代码。

jadx
jadx

另外两个也是类似,Android-classyshark为google开源的产品,Android Studio是安卓的开发工具,这个比较大,其带的APK Analyzer功能可以实现APK的反编译。