Android系统System.img逆向工程
本文最后更新于 2024年11月2日 凌晨
目的
Android Rom打包后,根据类型,粗略分为固件包和普通卡刷包;不管是固件包(如:三星Odin固件包),还是卡刷包(如:GSI通刷包)。为了操作方便,有时会打包成system.img格式。现在就带大家在Linux上挂载system.img。
得到镜像文件
以三星固件包为例,其他手机品牌可以参考:Github 解包开源项目
我解压的是SM-A505U_1_20191216162802(美版三星A50)。下载后,固件名称为SM-A505U_1_20191216162802_rru9m4tdds_fac.zip。解压这个文件:
1 |
|
得到:
- 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文件:
1 |
|
在解压的文件里,就有我们system.img.lz4,这个是进过lz4压缩后的img镜像文件。
提取system.img
其实刚刚就在提取了,这一步;我们把system.img.lz4文件解压
1 |
|
得到system.img镜像文件。如果无法识别lz4命令:
1 |
|
1 |
|
校验system.img类型
使用文件file命令:
1 |
|
可能会有以下结果:
- 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安装:
1 |
|
再使用工具进行转换:
1 |
|
会得到一个 system_new.img,它是 raw 格式的完整镜像:
1 |
|
yaffs2文件
这个比较麻烦,但是比较少。下载 unyaffs:https://code.google.com/archive/p/unyaffs/downloads 源码,然后执行下面命令编译得到 unyaffs 可执行文件
1 |
|
创建一个 system 目录,将 unyaffs 和 system.img 放到 system 目录中,然后执行命令,即可解压到当前目录
1 |
|
raw文件
这个是最舒服的了,Linux上直接挂载即可:
创建一个system的目录用来挂载:
1 |
|
用Linux挂载命令进行挂载:
1 |
|
ext文件和raw文件区别
raw 其特点是完整的ext4分区镜像(包含很多全零的无效填充区),可以直接使用mount进行挂载,因此比较大
ext 就是说是一个非常普通的dat文件。由于它将raw ext4进行稀疏描述,因此尺寸比较小(没有全零的无效填充区)
所以,我们只需要用脚本(simg2img),进行一次编译操作,就可以把ext文件编译、转换成raw文件了。