Android APK 反编译原理与工具汇总

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

一、APK文件的构成

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



<a href="https://www.361way.com/wp-content/uploads/2020/07/apkfile.png" target="_blank" rel="noopener noreferrer"><img src="https://www.361way.com/wp-content/uploads/2020/07/apkfile.png" width="150" height="223" title="apkfile" alt="apkfile" align="" /></a>



<br />
  • 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的映射关系。

二、反编译分解步骤

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



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



具体步骤为:



<br />
java -jar apktool_2.3.4.jar d -f yv.apk -o vpn
<br />



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



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



<br />
d2j-dex2jar.bat classes.dex
d2j-dex2jar.bat classes2.dex
d2j-dex2jar.bat classes3.dex
d2j-dex2jar.bat classes4.dex
最后使用jd-gui将Jar包文件反编译成java源文件,见下图:



<a href="https://www.361way.com/wp-content/uploads/2020/07/dex-class-java.png" target="_blank" rel="noopener noreferrer"><img src="https://www.361way.com/wp-content/uploads/2020/07/dex-class-java.png" width="500" height="327" title="dex-class-java" alt="dex-class-java" align="" /></a>



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

三、集成反编译工具

集成实现一步反编译的工具有<a href="https://github.com/skylot/jadx" target="_blank" rel="noopener noreferrer">jadx</a>、<a href="https://github.com/google/android-classyshark" target="_blank" rel="noopener noreferrer">Android-classyshark</a>、<a href="https://developer.android.google.cn/studio?hl=zh-cn" target="_blank" rel="noopener noreferrer">Android Studio</a>等。该工具支持直接将apk文件反编译为代码。



<img src="https://www.361way.com/wp-content/uploads/2020/07/jadx-gui.png" width="500" height="348" title="jadx" alt="jadx" />



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

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注