首页
社区
课程
招聘
[分享]使用APKTool反编译apk文件
发表于: 2020-5-28 21:28 4738

[分享]使用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步骤:

  1. 下载apktool.bat文件。

  2. 下载apktool.jar文件。去掉文件名中的版本号,即最终文件名为“apktool.jar”。

  3. 将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期)

最后于 2020-5-30 17:21 被Editor编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//