Apktool

Apktool

APK 反编译的目录结构

  1. assets 用于存放资源文件,系统在编译的时候不会编译该文件夹下的资源文件。
  2. res 主要用来存放安卓资源,该文件夹下还有多个子文件夹,常见的有:anim动画,drawable图片,color颜色,menu菜单,layout布局,values常量值,xmlXML文件
  3. smail class.dex 字节码文件反编译得到的文件夹,回编译时对该文件的大小有限制,因此会分出smali_classes2smali_classes3 等多个文件夹。
  4. AndroidManifest.xmlapk的全局配置文件,提供了Android系统所需要的关于该应用的必须信息,例如应用权限。

Apktool 官方文档

Apktool - 官方文档

介绍

Apk本质上是一个包含资源和组装的Java代码的zip文件。如果只是简单地解压Apk,只能得到AndroidManifest.xml,classes.dex,resources.arsc等文件。==文件都是乱码,无法阅读==。这就需要Apktool对Apk进行反编译。

反编译命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ apktool d foo.jar
// 将jar文件解码为.jar.out文件夹

$ apktool decode foo.jar
// 将jar文件解码为.jar.out文件夹

$ apktool d bar.apk
// 将bar.apk文件解码为bar文件夹

$ apktool decode bar.apk
// 将bar.apk文件解码为bar文件夹

$ apktool d bar.apk -o baz
// 将bar.apk文件解码为baz文件夹

回编译(重新构建)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ apktool b foo.jar.out
// builds foo.jar.out folder into foo.jar.out/dist/foo.jar file

$ apktool build foo.jar.out
// builds foo.jar.out folder into foo.jar.out/dist/foo.jar file

$ apktool b bar
// builds bar folder into bar/dist/bar.apk file

$ apktool b .
// builds current directory into ./dist

$ apktool b bar -o new_bar.apk
// builds bar folder into new_bar.apk

$ apktool b bar.apk
// WRONG: brut.androlib.AndrolibException: brut.directory.PathNotExist: apktool.yml
// Must use folder, not apk/jar file

安装依赖框架

-p filePath:将框架文件存储到filePath路径

-t tag:标记框架使用的标签

作用:更好地控制文件的命名方式和存储方式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ apktool if framework-res.apk
I: Framework installed to: 1.apk
// pkgId of framework-res.apk determines number (which is 0x01) 从设备中获取并安装框架文件

$ apktool if com.htc.resources.apk
I: Framework installed to: 2.apk
// pkgId of com.htc.resources is 0x02

$ apktool if com.htc.resources.apk -t htc
I: Framework installed to: 2-htc.apk
// pkgId-tag.apk

$ apktool if framework-res.apk -p foo/bar
I: Framework installed to: foo/bar/1.apk

$ apktool if framework-res.apk -t baz -p foo/bar
I: Framework installed to: foo/bar/1-baz.apk

框架文件

正如你可能知道的,Android应用程序利用Android操作系统本身的代码和资源。这些被称为框架资源,Apktool依赖于这些资源来正确解码和构建apks。

每个Apktool版本都在内部包含了最新的AOSP框架。这允许你解码和构建大多数apks没有任何问题。但是,除了常规的AOSP文件之外,制造商还添加了他们自己的框架文件。要使用apktool对抗这些制造商apks,你必须首先安装制造商框架文件。

从哪里找到框架文件?

大多数情况下,设备上/system/framework中的任何apk都将是一个框架文件。在某些设备上,它们可能驻留在/data/system-framework中,甚至巧妙地隐藏在/system/app/system/ private -app中。它们通常以“资源”、“res”或“框架”命名。

例如:HTC的框架文件名称为com.htc.resources.apk,LG的框架文件名称为lge-res.apk.

内部框架

Apktool有一个内部框架。该文件在使用过程中被复制到$HOME/apktool/framework/1.apk

管理框架文件

根据操作系统的不同,框架文件存储在不同的位置。

  • unix - $HOME/.local/share/apktool
  • windows - %UserProfile%\AppData\Local\apktool
  • mac - $HOME/Library/apktool

选项

反编译选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-b 
#防止 baksmali 写出调试信息(.local、.param、.line 等)。如果您要比较来自不同版本的相同APK的smali,则首选使用。行号和调试将在版本之间更改,这可能会使 DIFF 报告变得痛苦。

-f
#强制删除目标目录。尝试解码到已存在的文件夹时使用

-o newFileName
#apk反编译后文件夹的名称

-r
#防止资源的反编译,只编译Java(smali)

-s
#防止 dex 文件的拆卸。这将保留apk文件,并在构建过程中简单地移动它。

unknown 文件夹

apktool.yml文件里有一个unknownFiles字段,该字段配置的就是unknown文件夹下所有文件的路径,后面跟上”0”,或者”8”;这个配置很重要,决定了后面apk重新构建时unknown目录下的文件能否打进去,如果不配置apktool进行回编译的时候会丢弃掉没有配置的文件

apktool官方文档对unknownFiles有说明:unknownFiles - Used to record name/location of non-standard files in an apk in order to place correctly on rebuilt apk(用于记录 apk 中非标准文件的名称/位置,以便正确放置在重建的 apk 上 )