-
-
[分享]使用APKTool反编译apk文件
-
发表于: 2020-5-28 21:28 4738
-
1、APK介绍
APK的全程是Android application package,是Android的应用程序包。需要指出的是APK 其实是一个基于 ZIP 文件格式的文件,所以支持你用解压软件将其解压,当你将APK文件解压之后你会看到如下文件:
.dex代码文件:它是classes文件通过DEX编译后的文件格式,用于在Dalvik虚拟机上运行的主要代码部分;
resources 资源文件:以resources以及res目录为代表的Android程序中所需要的一些资源,如图片资源,颜色资源,字符串,布局等;
assets文件:assets目录下存放的是原生资源文件,比如在里面存放字体,铃声等;
manifest清单文件:以AndroidManifest.xml为代表的Android清单文件,清单文件向 Android 系统提供应用的必要信息,系统必须具有这些信息方可运行应用的任何代码。
2、 APKTool介绍
APKTool功能是APK格式文件与smali文件的转换
APKTool是GOOGLE提供的APK编译工具,需要JAVA运行环境。
APKTool可以对APK进行反编译,可以将APK反编译成非常接近打包前的原始格式。修改后,可以将其编译回APK文件。
下载:https://ibotpeaches.github.io/Apktool/
当前Apktool的最新版本为2.1.1,需要JDK1.7的支持。在进入Apktool的安装之前,请确保电脑已安装JDK1.7。
Windows环境下安装Apktool步骤:
下载apktool.bat文件。
下载apktool.jar文件。去掉文件名中的版本号,即最终文件名为“apktool.jar”。
将apktool.bat和apktool.jar放到同一个路径下。
1)反编译
反编译命令: apktool d test.apk
反编译的文件,保存在test目录下:
利用apktool反编译,得到以smali为后缀的文件,这些smali文件就是Smali语言代码,Smali语言是Dalvik的寄存器语言。若要反编译成java语句,需要其他反编译工具。
知识点:Android采用的是java语言 进行开发,但是Android系统有自己的虚拟机Dalvik,代码编译最终不是采用的java的class而是使用的smali。 JAVA虚拟机运行的是JAVA字节码,Dalvik虚拟机运行的是Dalvik字节码。Smali语言是Davlik的寄存器语言。
JAVA程序经过编译,生成JAVA字节码保存在class文件中,JVM通过解码class文件中的内容来运行程序。而DVM运行的是Dalvik字节码,所有的Dalvik字节码由JAVA字节码转换而来,并被打包到一个DEX(Dalvik Executable)可执行文件中,DVM通过解释DEX文件来执行这些字节码,DEX文件解析出来就是smali寄存器语言。
2)重新打包与签名
将修改后的内容重新打包为 APK:
apktool b test -o unsigned_test.apk
打包之后的unsigned_test.apk是没有签名的,无法安装。
3)小结
Apktool更新并没有smali/baksmali频繁,smali/baksmali更新后要过非常久的时间才会合并到Apktool中,在这之前你可能需要忍受很多诡异的bug。其次,Apktool在反编译或者重打包dex的时候,如果发生错误,仅仅只会提供错误的exception信息而已。最后,很多apk为了对付反调试会在资源文件中加入很多junk code从而使得Apktool的解析崩溃掉,造成反编译失败或者无法重打包。
因此,若要反编译为Smali语言,建议用工具baksmali/smali来代替。
参考资料:
https://blog.andiedie.cn/posts/552a/
https://blog.csdn.net/lixpjita39/article/details/75193833
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)