Android APK 反编译原理与工具汇总
Android APK 反编译要做两件事:一是要将apk里的dex文件转换成Jar包,再通过工具查看编译前的java源文件。二是通过工具查看apk里对应的AndroidManifest.xml、resources.arsc、res各布局文件等二进制文件。在开始反编译之前我们先看下APK文件的构成。
一、APK文件的构成
apk文件的本质是压缩文件,我们将apk文件修改后缀名为zip或者rar等,可以直接解压缩查看apk文件夹。解压后的内容如下:
- 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源文件,见下图:
这里有时候会看到诸如a.a.a、b等字母标示的包名、类名或者方法名,这是由于在某些apk打包的时候进行代码混淆导致的。使用反编译工具只能看到混淆之后的代码结构,真正未混淆前的源码还需要结合mapping.txt文件进行分析。mapping.txt文件里即标注出了代码混淆前后的文件名称对应关系。
三、集成反编译工具
集成实现一步反编译的工具有jadx、Android-classyshark、Android Studio等。该工具支持直接将apk文件反编译为代码。
另外两个也是类似,Android-classyshark为google开源的产品,Android Studio是安卓的开发工具,这个比较大,其带的APK Analyzer功能可以实现APK的反编译。
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/apk-decompile/6445.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.