Android系统System.img逆向工程

本文最后更新于:2020年8月12日 中午

目的

Android Rom打包后,根据类型,粗略分为固件包和普通卡刷包;不管是固件包(如:三星Odin固件包),还是卡刷包(如:GSI通刷包)。为了操作方便,有时会打包成system.img格式。现在就带大家在Linux上挂载system.img。

得到镜像文件

以三星固件包为例,其他手机品牌可以参考:Github 解包开源项目
我解压的是SM-A505U_1_20191216162802(美版三星A50)。下载后,固件名称为SM-A505U_1_20191216162802_rru9m4tdds_fac.zip。解压这个文件:

unzip SM-A505U_1_20191216162802_rru9m4tdds_fac.zip

得到:

  • BL_A505USQS3ASL4_CL16561534_QB27874851_REV00_user_low_ship.tar.md5
  • AP_A505USQS3ASL4_CL16561534_QB27874851_REV00_user_low_ship_meta_OS9.tar.md5
  • CP_A505USQS3ASL4_CP14622435_CL16561534_QB27874851_REV00_user_low_ship.tar.md5
  • HOME_CSC_OMC_OYN_A505UOYN3ASL4_CL16561534_QB27874851_REV00_user_low_ship.tar.md5
  • CSC_OMC_OYN_A505UOYN3ASL4_CL16561534_QB27874851_REV00_user_low_ship.tar.md5
  • USERDATA_CCT_A505USQS3ASL4_CL16561534_QB27874851_REV00_user_low_ship.tar.md5

用file命令校验,发现这些就是tar压缩文件,三星使用md5结尾,方便Odin检测md5数值。
所以,我们用tar的解压命令,解压AP文件:

tar xvf AP_A505USQS3ASL4_CL16561534_QB27874851_REV00_user_low_ship_meta_OS9.tar.md5

在解压的文件里,就有我们system.img.lz4,这个是进过lz4压缩后的img镜像文件。

提取system.img

其实刚刚就在提取了,这一步;我们把system.img.lz4文件解压

lz4 -d system.img.lz4

得到system.img镜像文件。如果无法识别lz4命令:

# Ubuntu
apt-get update
apt-get install liblz4-tool
# Centos
yum install lz4
yum install lz4-devel

校验system.img类型

使用文件file命令:

file system.img

可能会有以下结果:

  • system.img: Android sparse image, version: 1.0, Total of 1510400 4096-byte output blocks in 33 input chunks.
  • system.img: Linux rev 1.0 ext2 filesystem data, UUID=873a602a-a04c-5918-94d6-e1f574def67e (extents) (large files) (huge files)
    上面两个比较常见,还有这种不常见:
  • VMS Alpha executable
    以上三种,类型方便为:ext 文件、raw 文件和yaffs2 文件。

判断

ext文件

首先,需要用 simg2img 工具把 system.img 转为为 ext4 文件格式,该工具位于 out/host/linux-x86/bin/simg2img,可以使用apt-get安装:

apt-get install simg2img

再使用工具进行转换:

simg2img system.img system_new.img

会得到一个 system_new.img,它是 raw 格式的完整镜像:

root@iZxf3axaooao5qZ:/Cloud/SM# file system_new.img
system_new.img: Linux rev 1.0 ext2 filesystem data, UUID=873a602a-a04c-5918-94d6-e1f574def67e (extents) (large files) (huge files)

yaffs2文件

这个比较麻烦,但是比较少。下载 unyaffs:https://code.google.com/archive/p/unyaffs/downloads 源码,然后执行下面命令编译得到 unyaffs 可执行文件

gcc -o unyaffs unyaffs.c

创建一个 system 目录,将 unyaffs 和 system.img 放到 system 目录中,然后执行命令,即可解压到当前目录

unyaffs system.img

raw文件

这个是最舒服的了,Linux上直接挂载即可:
创建一个system的目录用来挂载:

mkdir system

用Linux挂载命令进行挂载:

sudo mount -t ext4 system_new.img system

ext文件和raw文件区别

raw 其特点是完整的ext4分区镜像(包含很多全零的无效填充区),可以直接使用mount进行挂载,因此比较大
ext 就是说是一个非常普通的dat文件。由于它将raw ext4进行稀疏描述,因此尺寸比较小(没有全零的无效填充区)
所以,我们只需要用脚本(simg2img),进行一次编译操作,就可以把ext文件编译、转换成raw文件了。


若文章对你帮助很大,想捐赠的话ヾ(≧▽≦*)o

点击图片跳转捐赠界面(○` 3′○)