Android apk安装包反编译——apktool工具

apk 文件结构

首先是 apk,即安卓程序的安装包。Apk 是一种类似于 Symbian Sis 或 Sisx 的文件格式。通过将 APK 文件直接传到 Android 模拟器或 Android 手机中执行即可安装。
而 apk 文件实际上就是一个 MIME 为 ZIP 的压缩包,只不过后缀名进行了更改。

我们可以直接把 .apk 后缀的文件修改成 .zip 后缀的压缩包格式,然后解压后就可以看到内部的文件结构,就像下面这样:

在这里插入图片描述

文件夹结构说明:

  • assets 文件夹: 保存一些额外的资源文件,如游戏的声音文件,字体文件、图片等等,在代码中可以用 AssetManager 获取 assets 文件夹的资源。
  • lib 文件夹: 存放用 C/C++ 编写的,用NDK编译生成的 so 文件,供 java 端调用。
  • META-INF 文件夹: 存放 apk 签名信息,用来保证apk包的完整性和系统的安全。在 IDE 编译生成一个 apk 包时,会对里面所有的文件做一个校验计算,并把计算结果存放在 META-INF 文件夹内,apk 在安装的时候,系统会按照同样的算法对 apk 包里面的文件做校验,如果结果与 META-INF 里面的值不一样,系统就不会安装这个 apk,这就保证了 apk 包里的文件不能被随意修改和替换。比如拿到一个 apk 包后,如果想要替换里面的一幅图片,一段代码, 或一段版权信息,想直接解压缩、替换再重新打包,基本是不可能的。如此一来就给病毒感染和恶意修改增加了难度,有助于保护系统的安全。
  • res文件夹: 存放资源文件,包括icon,xml布局文件
  • AndroidManifest.xml文件:应用程序的清单文件,每个应用都必须定义和包含的,它描述了应用的名字、版本、权限、引用的库文件等信息。
  • classes.dex文件: 传统 Class 文件是由一个 Java 源码文件生成的 .Class 文件,而 Android 是把所有 Class 文件进行合并优化,然后生成一个最终的 class.dex 文件。它包含 APK 的可执行代码,是分析 Android 软件时最常见的目标。由于 dex 文件很难看懂,可通过 apktool 反编译得到.smali文件,smali文件是对Dalvik虚拟机字节码的一种解释(也可以说是翻译),并非一种官方标准语言。通过对smali文件的解读可以获取源码的信息。当然 你也可以通过dex2jar工具将 classes.dex 文件转化为 jar 包,然后再通过 jadx 或者 jd-gui 可以查看 jar 包里面的代码。一般软件开发者会对 classes.dex 进行加固,防止别人轻易反编译
  • resources.arsc文件: 二进制资源文件,如:字符串常量就会存放在 strings.xml 中。
  • smali:smali是将Android字节码用可阅读的字符串形式表现出来的一种语言,可以称之为 Android 字节码的反汇编语言。利用 apktool 或者 Android Killer,反编classes.dex文件,就可以得到以smali为后缀的文件,这些 smali 文件就是 Dalvik 的寄存器语言。
    简单的说,smali就是Dalvik VM内部执行的核心代码,andorid逆向分析的关键点。

下载 apktool

可在下面两种下载中选择一种方式下载:

apktool github发下页面
apktool 下载

(我这里使用的是 apktool_2.9.1.jar 版本)

使用 apktool 反编译 apk

将 apk 安装包和下载的 apktool 放在同一目录。
假如我的安装包叫 base.apk ,我想把它反编译到 test 文件夹下,反编译命令如下:

java -jar apktool_2.9.1.jar d base.apk -o test

该命令将会自动新建一个 test 文件夹, 反编译后的所有文件都将被放到里面。

说明:
jadx 不同,apktool 反编译 apk 后,你在反编译后的 AndroidManifest.xml 里是找不到 versionCode 内部版本号 和 versionName 版本名称 的,因为 apktool 把它放到了 apktool.yml 文件里,如果你要修改 versionCode 、versionName ,可以在 apktool.yml 文件里修改。

编译为apk

假如你修改了 test 文件夹里的代码 或者 修改了 versionCode 、versionName 等其他内容,可用下面的命令将 test 文件夹编译为 apk 。

java -jar apktool_2.9.1.jar b test -o test.apk

该命令将 test 文件夹编译为 test.apk 。

到这里你已经得到了一个修改后的 apk,但是这个编译后的 apk 还无法安装到手机上,因为修改了文件,在安装时手机会对安装包里的签名进行比对签名,如果签名对不上说明apk被篡改了,就不会进行安装。

所以,如果现在要对修改后的 apk 重新进行签名,才能安装。

参考:
Android 逆向入门保姆级教程
静态分析android程序之阅读smali代码
为什么有些APK解包后没有DEX文件?

相关推荐

  1. idea工具编译jar

    2023-12-27 17:36:04       54 阅读
  2. 编译jar

    2023-12-27 17:36:04       30 阅读
  3. MacOS安装编译工具JD-GUI 版本需要1.8+

    2023-12-27 17:36:04       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-27 17:36:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-27 17:36:04       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-27 17:36:04       87 阅读
  4. Python语言-面向对象

    2023-12-27 17:36:04       96 阅读

热门阅读

  1. Vue中使用require.context自动引入组件的方法介绍

    2023-12-27 17:36:04       54 阅读
  2. Hive-数据模型详解(超详细)

    2023-12-27 17:36:04       57 阅读
  3. 数据结构-怀化学院期末题(59)

    2023-12-27 17:36:04       54 阅读
  4. $bus的用法 vue

    2023-12-27 17:36:04       47 阅读
  5. Spring 表达式expression

    2023-12-27 17:36:04       49 阅读
  6. 相机FOV是什么英文单词的缩写,是什么意思。

    2023-12-27 17:36:04       56 阅读
  7. 前端axios与python库requests的区别

    2023-12-27 17:36:04       59 阅读
  8. effective c++ 笔记 导读/条款2-4

    2023-12-27 17:36:04       51 阅读
  9. NGINX高级技巧

    2023-12-27 17:36:04       61 阅读
  10. ElementuiPlus文件上传失败原因,一个小坑记录!

    2023-12-27 17:36:04       57 阅读
  11. 架构艺术:系统演进的精髓与实践

    2023-12-27 17:36:04       50 阅读
  12. Python实现音乐推荐系统

    2023-12-27 17:36:04       45 阅读