0%

Android 拆包,提取 APK 或 Framework 文件

之前由于开发一个关于 MIUI 系统界面的 Xposed 插件,为了适配不同的 Rom,需要查看不同 Rom 中的 SystemUI.apk

Android Rom 结构

  • 在 5.0 之前,Android 的系统包(卡刷包)是可以直接解压出来 system 目录,从它里面就可以直接提取出 Rom 内部的 Apk 文件。

  • 5.0 ~ 8.0 中,Android 的 Rom 包里面有 system.new.dat 文件,无法直接解压提取,很明显,我们要的 Rom 就在这里面:

    1
    2
    3
    4
    5
    6
    7
    -rwxrwx---+ 1 Tianma None   24618314 1月   1 2009 boot.img
    -rwxrwx---+ 1 Tianma None 1734469 1月 1 2009 file_contexts.bin
    drwxrwx---+ 1 Tianma None 0 5月 11 17:42 firmware-update
    drwxrwx---+ 1 Tianma None 0 5月 11 17:42 META-INF
    -rwxrwx---+ 1 Tianma None 3089031168 1月 1 2009 system.new.dat
    -rwxrwx---+ 1 Tianma None 0 1月 1 2009 system.patch.dat
    -rwxrwx---+ 1 Tianma None 16288 1月 1 2009 system.transfer.list
  • 8.1 之后,Android 的 Rom 包里面有 system.new.dat.br 文件,这个是被压缩为 .br(brotli) 格式的 system.new.dat 文件,也无法直接提取:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    -rwxrwx---+ 1 Tianma None   50484554 1月   1 2009 boot.img
    -rwxrwx---+ 1 Tianma None 9230 1月 1 2009 compatibility.zip
    drwxrwx---+ 1 Tianma None 0 5月 14 23:26 firmware-update
    drwxrwx---+ 1 Tianma None 0 5月 14 23:26 META-INF
    -rwxrwx---+ 1 Tianma None 1694882420 1月 1 2009 system.new.dat.br
    -rwxrwx---+ 1 Tianma None 0 1月 1 2009 system.patch.dat
    -rwxrwx---+ 1 Tianma None 15019 1月 1 2009 system.transfer.list
    -rwxrwx---+ 1 Tianma None 370088219 1月 1 2009 vendor.new.dat.br
    -rwxrwx---+ 1 Tianma None 0 1月 1 2009 vendor.patch.dat
    -rwxrwx---+ 1 Tianma None 3815 1月 1 2009 vendor.transfer.list

拆包步骤

Windows 下的拆包

准备:

  1. 系统:windows 10
  2. 环境:
    • Python3,并添加 Python3 到环境变量的 Path
    • 7-zip,并添加 7-zip 到环境变量的 Path
  3. 下载 system.new.dat-extractor

操作步骤:

  1. system.new-data-extractor 工具放到一个路径中没有空格的目录下
  2. 将 Rom 的 .zip 放到与前面相同的目录下
  3. 打开 system_image_extractor-V4.cmd 文件,之后会自动解包,提取出来的文件存放在 extracted_files 目录下

最终解压出来的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
drwxr-xr-x 1 Tianma 197121      0  5月 11 18:10 app/
drwxr-xr-x 1 Tianma 197121 0 5月 11 18:10 bin/
-rw-r--r-- 1 Tianma 197121 12843 5月 11 18:10 build.prop
-rw-r--r-- 1 Tianma 197121 20961 5月 11 18:10 compatibility_matrix.xml
drwxr-xr-x 1 Tianma 197121 0 5月 11 18:10 data-app/
drwxr-xr-x 1 Tianma 197121 0 5月 11 18:10 etc/
drwxr-xr-x 1 Tianma 197121 0 5月 11 18:10 fake-libs/
drwxr-xr-x 1 Tianma 197121 0 5月 11 18:10 fake-libs64/
drwxr-xr-x 1 Tianma 197121 0 5月 11 18:10 fonts/
drwxr-xr-x 1 Tianma 197121 0 5月 11 18:10 framework/
drwxr-xr-x 1 Tianma 197121 0 5月 11 18:10 lib/
drwxr-xr-x 1 Tianma 197121 0 5月 11 18:10 lib64/
drwxr-xr-x 1 Tianma 197121 0 5月 11 18:10 lost+found/
-rw-r--r-- 1 Tianma 197121 2808 5月 11 18:10 manifest.xml
drwxr-xr-x 1 Tianma 197121 0 5月 11 18:10 media/
drwxr-xr-x 1 Tianma 197121 0 5月 11 18:10 priv-app/
-rw-r--r-- 1 Tianma 197121 830651 5月 11 18:10 recovery-from-boot.p
drwxr-xr-x 1 Tianma 197121 0 5月 11 18:10 tts/
drwxr-xr-x 1 Tianma 197121 0 5月 11 18:10 usr/
drwxr-xr-x 1 Tianma 197121 0 5月 11 18:10 vendor/
drwxr-xr-x 1 Tianma 197121 0 5月 11 18:10 xbin/

macOS 下的拆包

系统:macOS 10.15

操作步骤:

  1. system.new.dat.br 解压缩为 system.new.dat,Android 8.1 及以后版本需要,低版本无需此步骤:

    • 安装 brotli

      1
      brew install brotli
    • 使用 brotli 解压缩 .br 文件:

      1
      brotli --decompress system.new.dat.br -o system.new.dat
  2. system.new.dat 转为 .img 镜像文件:

    • 下载 sdat2img.py,需要 Python 2.7+ 或者 Python 3.x 环境

    • .dat 文件转换:

      1
      sdat2img.py system.transfer.list system.new.dat system.img

      此时的 system.imgext4 格式的镜像文件

  3. 挂载 ext4 格式的 system.img 文件:

    • 安装 OSX FUSE,常规安装最新版即可

    • 安装 ext4fuse:

      1
      brew install ext4fuse
    • 使用 ext4fuse 挂载 system.img:

      1
      ext4fuse system.img mounted-img/

至此,就可以在 mounted-img/ 目录下看到解压出来的包了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ ls                                                                                                
acct init.environ.rc lost+found
apex init.mishow.ctl.rc mnt
bin init.miui.cust.rc odm
bugreports init.miui.early_boot.sh oem
cache init.miui.google_revenue_share.rc proc
charger init.miui.google_revenue_share_v2.rc product
config init.miui.nativedebug.rc product_services
cust init.miui.post_boot.sh res
d init.miui.rc sbin
data init.rc sdcard
debug_ramdisk init.recovery.hardware.rc storage
default.prop init.recovery.qcom.rc sys
dev init.usb.configfs.rc system
etc init.usb.rc ueventd.rc
init init.zygote32.rc vendor
init.batteryd.rc init.zygote64_32.rc verity_key

参考