apktool 使用

1 Dalvik 与 Smali
1.1 Dalvik 虚拟机概述
Google 于 2007 年底正式发布了 Android SDK, Dalvik 虚拟机也第一次进入了我们的视野。
它的作者是丹·伯恩斯坦(Dan Bornstein) ,名字来源于他的祖先曾经居住过的名叫 Dalvik
的小渔村。Dalvik 虚拟机作为 Android 平台的核心组件,拥有如下几个特点:
1) 体积小,占用内存空间小;
2) 专用的 DEX 可执行文件格式,体积更小,执行速度更快;
3) 常量池采用 32 位索引值,寻址类方法名,字段名,常量更快;
4) 基于寄存器架构,并拥有一套完整的指令系统;
5) 提供了对象生命周期管理、堆栈管理、线程管理、安全和异常管理以及垃圾回收等
重要功能;
6) 所有的 Android 程序都运行在 Android 系统进程里,每个进程对应着一个 Dalvik 虚
拟机实例。
1.2 Dalvik 虚拟机与 Java 虚拟机的区别
Dalvik 虚拟机与传统的 Java 虚拟机有着许多不同点,两者并不兼容,它们显著的不同点
主要表现在以下几个方面:
1) Java 虚拟机运行的是 Java 字节码,Dalvik 虚拟机运行的是 Dalvik 字节码;
2) Dalvik 可执行文件体积更小;
3) Java 虚拟机基于栈架构,Dalvik 虚拟机基于寄存器架构。
1.3 Smali 概述
我们都知道,Dalvik 虚拟机(Dalvik VM)是 Google 专门为 Android 平台设计的一套虚拟
机。区别于标准 Java 虚拟机 JVM 的 class 文件格式,Dalvik VM 拥有专属的 DEX 可执行文件
格式和指令集代码。smali 和 baksmali 则是针对 DEX 执行文件格式的汇编器和反汇编器,反
汇编后 DEX 文件会产生.smali 后缀的代码文件,smali 代码拥有特定的格式与语法,smali 语
言是对 Dalvik 虚拟机字节码的一种解释。
Smali 语言起初是由一个名叫 JesusFreke 的 hacker 对 Dalvik 字节码的翻译,并非一种官
方标准语言,因为 Dalvik 虚拟机名字来源于冰岛一个小渔村的名字,JesusFreke 便把 smali
和 baksmali 取自了冰岛语中的“汇编器”和“反编器” 。目前 Smali 是在 Google Code 上的一
个开源项目。
虽然主流的 DEX 可执行文件反汇编工具不少,如 Dedexer、IDA Pro 和 dex2jar+jd-gui,
但 Smali 提供反汇编功能的同时, 也提供了打包反汇编代码重新生成 dex 的功能, 因此 Smali
被广泛地用于 APP 广告注入、汉化和破解,ROM 定制等方面。
2 反编译、编译、打包
2.1 使用 smali 和 baksmali
smali 和 baksmali 这两个工具汇编和反汇编 DEX 文件的使用非常简单,我们使用
baksmali.jar 反汇编 HelloWorld.dex 只需输入以下命令:
———————————————————————————————————————
java -jar baksmali.jar -o HelloWorldOut HelloWorld.dex
———————————————————————————————————————
命令执行成功后会在 HelloWorldOut 目录下生成相应 smali 文件,我们在修改完 smali
代码后,使用 smali.jar 重新汇编成 HelloWorld.dex,输入命令:
———————————————————————————————————————
java -jar smali.jar -o HelloWorld.dex HelloWoldOut
———————————————————————————————————————
我们只需把生成的 HelloWorld.dex 通过 adb 命令 push 到手机上,并使用 dalvikvm 命令
便可以运行这个 DEX 文件,执行的命令如下:
———————————————————————————————————————
adb push HelloWorld.dex /data/local/
adb shell dalvikvm -cp /data/local/HelloWorld.dex HelloWorld
———————————————————————————————————————
使用 smali 和 baksmali 工具只能用来汇编和反汇编 Android 的可执行文件,因此使用这
两个工具是无法完成 Android 安装包(APK)的反编译和打包的功能,好在一个名为
android-apktool 的 Google 开源工具可以完成这个事情。
2.2 使用 apktool
apktool 工具是在 smali 工具的基础上进行封装和改进的,除了对 DEX 文件的汇编和反
汇编功能外,还可以对 APK 中已编译成二进制的资源文件进行反编译和重新编译。同时也
支持给 smali 代码添加调试信息以支持断点调试。因此我们直接使用 apktool 工具来反编译
Android apps,而不是 smali 和 baksmali 工具。
2.2.1 APK 组成
在介绍 apktool 使用之前,我们先来看看一个 apk 包的组成。apk 文件其实是 zip 压缩包
格式,我们使用工具进行解压后可以其目录组成,以 HelloWorld.apk 为例:
———————————————————————————————————————
|-- HelloWorld/
|-- AndroidManifest.xml 被编译成二进制的配置文件
|-- class.dex Android 可执行文件
|-- resources.arsc 被编译成二进制的主资源文件
|-- assets/ 不需编译的原始资源文件目录
|-- res/ 资源文件目录
|-- lib/ 库文件目录
|-- META-INF/ APK 的签名信息
———————————————————————————————————————
2.2.2 使用方法
使用 apktool 反编译 HelloWorld.apk 文件到 out 目录的方法:
———————————————————————————————————————
java -jar apktool.jar d HelloWorld.apk out/
———————————————————————————————————————
apktool d 命令执行成功会在 out 目录下产生如下所示的一级目录结构:
———————————————————————————————————————
|-- out/
|-- AndroidManifest.xml 配置文件
|-- apktool.yml 反编译生成的文件,供 apktool 使用
|-- assets/ 不需反编译的资源文件目录
|-- lib/ 不需反编译的库文件目录
|-- res/ 反编译后的资源文件目录
|-- smali/ 反编译生成的 smali 源码文件目录
———————————————————————————————————————
在浏览各个子目录的结构后,我们可以发现其结构原始 APP 工程目录结构基本一致,
smali 目录结构对应着原始的 java 源码 src 目录,而 META-INF 目录已经不见了,因为反编译
会丢失签名信息。反编译后会多生成 apktool.yml 文件,这个文件记录着 apktool 版本和 Apk
文件名和是否 framework 文件等基本信息,在 apktool 重新编译时会使用到。
在修改完相应的 smali 代码和资源文件后,我们可以使用以下命令进行编译打包:
———————————————————————————————————————
java -jar apktool.jar b out/ HelloWorld.apk
———————————————————————————————————————
有时候我们在反编译系统 app 的时候会出错,提示无法找到资源,必须先加载合适的
framework 资源文件。这是因为 apktool 编译和反编译过程会依赖到 framework 中的代码和
资源,而这个 app 中使用了 framework-res.apk 之外扩展的 framework 资源文件。因此,我
们通常反编译前会把 system/framework/目录下所有资源文件 apk 都先加载在 apktool 工具中。
使用的命令如下:
———————————————————————————————————————
java -jar apktool.jar if framework-res.apk
———————————————————————————————————————
2.2.3 反编译、编译过程
我们执行 apktool d 命令可以看整个反编译过程的输出信息:
———————————————————————————————————————
I: Baksmaling...
I: Loading resource table...
I: Loaded.
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: /home/wzx/apktool/framework/1.apk
I: Loaded.
I: Decoding file-resources...
I: Decoding values*/* XMLs...
I: Done.
I: Copying assets and libs...
———————————————————————————————————————
整个反编译过程可以分为四个阶段:
1) DEX 可执行文件 baksmali 反汇编过程;
2) 二进制配置文件 AndroidManifest.xml 反编译;
3) 根据 framework 资源列表反编译二进制资源文件;
4) 直接复制不需要反编译的资源和库文件。
为最大程度地还原被编译成二进制的资源文件,apktool 需要一个可读性较高的资源
的名称,而不是二进制索引,这些名称则是在 framework 的资源文件中被定义。apktool
默认内嵌了 Android 标准 framework 资源,因此大部分 APP 反编译不需要指定资源文件,
而通常厂商都会扩展自己的资源文件,并在系统 APP 中引用,这就是我们前面提到的反编
译前需要加载/system/framework 下所有资源文件的原因。
apktool b 命令编译打包过程输出的信息:
———————————————————————————————————————
I: Checking whether sources has changed...
I: Smaling...
I: Checking whether resources has changed...
I: Building resources...
I: Copying libs...
I: Building apk file...
———————————————————————————————————————
编译打包过程也可以分为四个阶段:
1) 汇编 smali 源码目录生成 DEX 可执行文件;
2) 使用 aapt 把资源文件编译成二进制格式文件;
3) 复制不需编译的库文件到目标目录;
4) 使用 aapt 把目标文件重新打包成 apk 文件。
2.3 deodex
odex(Optimized DEX)是一种经过优化的 dex 文件格式,大部分厂商发布的手机上都会
做 odex 处理。 odex 处理过的 image 包, 其系统 jar/apk 包的可执行文件是存在同目录下的同
名.odex 文件,jar/apk 包中是不存在 dex 文件的。
对于 odex 文件,我们只需知道两点:
1) odex 的文件结构是 dex 文件的一个超集,会在 dex 文件基础上附加一些数据;
2) odex 文件对 image 包中的/system/framework(可具体到目录中 core.jar、ext.jar、
framework.jar、services.jar 和 android.policy.jar 这 5 个 jar 包)具有强依赖性,odex 文件
在不同的 framework 上是无法被 dalvik 虚拟机加载的。
使用 apktool 是无法直接对 odex 文件进行反编译,我们必须先使用 baksmali 进行 deodex 处
理。
我们以系统 APP 计算器 Calculator.apk 为例,进行 deodex 的完整过程如下:
1) odex 处理过的 apk 包中不包含 dex 文件,其对应的 odex 文件放在与 apk 文件同一
目录下,我们先把 apk 文件中其他的资源等文件先反编译出来。
———————————————————————————————————————
java -jar apktool.jar d Calculator.apk ./Calculator
———————————————————————————————————————
2) 通过 aapt 命令获取 apk 使用的 SDK 的版本号 targetSdkVersion 为 15。
———————————————————————————————————————
aapt d badging Calculator.apk | grep targetSdkVersion
———————————————————————————————————————
3) 使用 baksmali 对 Calculator.odex 去 odex 并反编译成 smali 代码文件, -a 指明 sdk 版
本,-x 指定需 deodex 的 odex 文件,-d 指明依赖的 framework 目录,-o 指定去输出目
录。
———————————————————————————————————————
java -jar baksmali.jar -a 15 -x Calculator.odex -d framework \
-o Calculator/smali
———————————————————————————————————————
4) 在修改完相应的 smali 文件和资源文件后,我们可以重新编译打包成 apk 文件。
———————————————————————————————————————
java -jar apktool.jar d Calculator Calculator.apk
——————————————————————————————————————
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
APKTool 是一个用于解包和重新构建 Android 应用程序的开源工具。它允许您解析 APK 文件,提取出应用程序的资源文件、代码和其他文件,以便进行查看、修改和分析。以下是 APKTool 的基本使用方法: 1. 下载 APKTool:首先,您需要下载并安装 APKTool。您可以从官方网站(https://ibotpeaches.github.io/Apktool/)上获取最新版本的 APKTool。 2. 解包 APK 文件:打开终端或命令提示符窗口,转到 APKTool 的安装目录。然后执行以下命令来解包 APK 文件: ``` apktool d your_app.apk ``` 这将解包 your_app.apk 文件,并将解包后的文件保存在当前目录中的一个新目录中。 3. 修改应用程序文件:在解包后的目录中,您可以查看和修改应用程序的资源文件和代码。您可以使用任何文本编辑器进行修改。 4. 重新构建 APK 文件:完成对应用程序的修改后,您可以使用以下命令来重新构建 APK 文件: ``` apktool b your_modified_app -o new_app.apk ``` 这将使用您修改后的文件重新构建应用程序,并将生成的新 APK 文件保存为 new_app.apk。 请注意,APKTool 在解包和重新构建过程中可能会遇到一些依赖问题或资源冲突。您可能需要手动处理这些问题,以确保应用程序正常工作。 这只是 APKTool 的基本使用方法,更多高级功能和选项可以在 APKTool 的文档和相关资源中找到。希望这些信息对您有所帮助!如果您有任何其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值