Android系统 —— image文件解析
Android系统编译之后的打包阶段,会将所有编译出来的有需要的执行文件,库文件以及各种配置文件等打包到各个镜像文件中。有时候我们需要看一下镜像文件中都打包了什么东西,那就可以通过一些方法将其挂载到一个目录,然后进行查看。
目录
- 1. 所用工具
- 1.1 simg2img
- 1.2 lpunpack
- 1.3 unpack_bootimg
- 1.4 mkdtimg
- 1.5 dtc
- 2. 解析image文件
- 2.1 boot.img,recovery.img
- 2.2 dtbo.img
- 2.3 metadata.img,userdata.img
- 2.4 super.img
- 2.5 persist.img
- 2.6 vbmeta.img,vbmeta_system.img
1. 所用工具
1.1 simg2img
简述:
将sparse格式的image文件转化为raw格式的image文件。
编译android源码默认会生成。
路径:
out/host/linux-x86/bin/simg2img
1.2 lpunpack
简述:
这个工具可以将system.img,product.img,vendor.img等文件从super.img解析出来。
路径:
out/host/linux-x86/bin/lpunpack
编译指令:
source build/envsetup.sh
lunch
make lpunpack
1.3 unpack_bootimg
简述:
专门用于解析boot.img的工具。
路径:
out/host/linux-x86/bin/unpack_bootimg
system/core/mkbootimg/unpack_bootimg.py
编译指令:
source build/envsetup.sh
lunch
make unpack_bootimg
1.4 mkdtimg
简述:
将dtbo.img文件转化为dtb文件,一个dtbo.img会包含多个dtb文件;
编译android源码默认会生成。
路径:
out/host/linux-x86/bin/mkdtimg
1.5 dtc
简述:
将dtb文件转化为可阅读的dts文件;
编译android源码默认会生成。
路径:
out/host/linux-x86/bin/dtc
2. 解析image文件
这次准备了下面这几个镜像文件进行举例解析:
#用file查看一下每个img文件的格式信息
sun@sun-pc:~/android/imgs$ file *.img
boot.img: Android bootimg, kernel (0x8000), ramdisk (0x1000000), page size: 4096, cmdline (console=ttyMSM0,115200n8 androidboot.hardware=qcom androidboot.console=ttyMSM0 androidboot.memc)
dtbo.img: data
metadata.img: Android sparse image, version: 1.0, Total of 4096 4096-byte output blocks in 4 input chunks.
persist.img: Linux rev 1.0 ext4 filesystem data, UUID=e44c9479-7df0-4905-8ac0-216d5c8adf3e (extents) (large files) (huge files)
recovery.img: Android bootimg, kernel (0x8000), ramdisk (0x1000000), page size: 4096, cmdline (console=ttyMSM0,115200n8 androidboot.hardware=qcom androidboot.console=ttyMSM0 androidboot.memc)
super.img: Android sparse image, version: 1.0, Total of 3145728 4096-byte output blocks in 120 input chunks.
userdata.img: Android sparse image, version: 1.0, Total of 11564499 4096-byte output blocks in 28 input chunks.
vbmeta.img: data
vbmeta_system.img: data
2.1 boot.img,recovery.img
这两个都是Android bootimg格式,方法都是一样的
boot.img
# sun@sun-pc:~/android/imgs$ ../system/core/mkbootimg/unpack_bootimg.py --boot_img boot.img --out boot
sun@sun-pc:~/android/imgs$ ../out/host/linux-x86/bin/unpack_bootimg --boot_img boot.img --out boot#查看解析出的boot目录
sun@sun-pc:~/android/imgs$ ls boot
dtb kernel ramdisk
recovery.img
# sun@sun-pc:~/android/imgs$ ../system/core/mkbootimg/unpack_bootimg.py --boot_img recovery.img --out recovery
sun@sun-pc:~/android/imgs$ ../out/host/linux-x86/bin/unpack_bootimg --boot_img recovery.img --out recovery#查看解析出的boot目录
sun@sun-pc:~/android/imgs$ ls recovery
dtb kernel ramdisk recovery_dtbo
2.2 dtbo.img
(1) 先从dtbo.img解析出dtb文件
#创建dtbo目录,然后使用mkdtimg工具解析dtbo.img,-b后边是输出路径(dtb是自定义的文件名前缀)
sun@sun-pc:~/android/imgs$ mkdir dtbo && ../out/host/linux-x86/bin/mkdtimg dump dtbo.img -b dtbo/dtb
sun@sun-pc:~/android/imgs$ ls dtbo
dtb.0 dtb.1 dtb.10 dtb.11 dtb.12 dtb.13 dtb.14 dtb.15 dtb.16 dtb.17 ... dtb.6 dtb.7 dtb.8 dtb.9#查看一下文件信息,的确是dtb(Device Tree Blob)文件
sun@sun-pc:~/android/imgs$ file dtbo/dtb.0
dtbo/dtb.0: Device Tree Blob version 17, size=110367, boot CPU=0, string block size=7979, DT structure block size=102332
(2) 再将上一步的dtb文件转化为可以阅读的dts文件
#将dtb.0转化为0.dts
sun@sun-pc:~/android/imgs$ ../out/host/linux-x86/bin/dtc dtbo/dtb.0 dtbo/0.dts#如果觉得一个个文件转化比较麻烦,可以使用下面的命令
find ./dtbo -name 'dtb.*' | xargs -n1 sh -c '../out/host/linux-x86/bin/dtc $1 -o $1.dts && rename "s/dtb\.//" $1.dts' sh
2.3 metadata.img,userdata.img
这两个解析步骤一样,下面以metadata.img为例
(1) 将sparse格式的metadata.img转化为raw格式的metadata_raw.img
sun@sun-pc:~/android/imgs$ ../out/host/linux-x86/bin/simg2img metadata.img metadata_raw.img
(2) 将metadata_raw.img挂载到一个目录上,此时访问这个目录就可以访问镜像文件的内容了
#首先创建目录metadata,然后将metadata_raw.img挂载到此目录
sun@sun-pc:~/android/imgs$ mkdir metadata && sudo mount -o ro metadata_raw.img metadata#可以看到metadata目录已经有内容了
sun@sun-pc:~/android/imgs$ ls
lost+found
2.4 super.img
(1) sparse格式转化为raw格式
sun@sun-pc:~/android/imgs$ ../out/host/linux-x86/bin/simg2img super.img super_raw.img
(2) 使用lpunpack解析super_raw.img
sun@sun-pc:~/android/imgs$ mkdir super
sun@sun-pc:~/android/imgs$ ../out/host/linux-x86/bin/lpunpack super_raw.img supersun@sun-pc:~/android/imgs$ ls super
product_a.img product_b.img system_a.img system_b.img vendor_a.img vendor_b.img
(3) 挂载解析出来的镜像文件
#以system_a.img为例,其他同理
sun@sun-pc:~/android/imgs/super$ mkdir system_a
sun@sun-pc:~/android/imgs/super$ sudo mount -o ro system_a.img system_a#查看system_a.img解析出来的文件
sun@sun-pc:~/android/imgs/super$ ll system_a
总用量 172
drwxr-xr-x. 22 root root 4096 1月 1 2009 ./
drwxrwxr-x 3 sun sun 4096 8月 26 13:49 ../
drwxr-xr-x. 2 root root 4096 1月 1 2009 acct/
drwxr-xr-x. 2 root root 4096 1月 1 2009 apex/
lrw-r--r--. 1 root root 11 1月 1 2009 bin -> /system/bin
lrw-r--r--. 1 root root 50 1月 1 2009 bugreports -> /data/user_de/0/com.android.shell/files/bugreports
lrw-r--r--. 1 root root 11 1月 1 2009 cache -> /data/cache
lrw-r--r--. 1 root root 19 1月 1 2009 charger -> /system/bin/charger
dr-xr-xr-x. 2 root root 4096 1月 1 2009 config/
lrw-r--r--. 1 root root 17 1月 1 2009 d -> /sys/kernel/debug/
drwxrwx--x. 2 sun sun 4096 1月 1 2009 data/
drwxr-xr-x. 2 root root 4096 1月 1 2009 debug_ramdisk/
lrw-------. 1 root root 23 1月 1 2009 default.prop -> system/etc/prop.default
drwxr-xr-x. 2 root root 4096 1月 1 2009 dev/
lrw-r--r--. 1 root root 11 1月 1 2009 etc -> /system/etc
lrwxr-x---. 1 root 2000 16 1月 1 2009 init -> /system/bin/init
-rwxr-x---. 1 root 2000 2067 1月 1 2009 init.environ.rc*
-rwxr-x---. 1 root 2000 34196 1月 1 2009 init.rc*
-rwxr-x---. 1 root 2000 3343 1月 1 2009 init.recovery.qcom.rc*
-rwxr-x---. 1 root 2000 7690 1月 1 2009 init.usb.configfs.rc*
-rwxr-x---. 1 root 2000 5649 1月 1 2009 init.usb.rc*
-rwxr-x---. 1 root 2000 611 1月 1 2009 init.zygote32.rc*
-rwxr-x---. 1 root 2000 1029 1月 1 2009 init.zygote64_32.rc*
drwx------. 2 root root 16384 1月 1 2009 lost+found/
drwxr-xr-x. 2 root root 4096 1月 1 2009 metadata/
drwxr-xr-x. 2 root sun 4096 1月 1 2009 mnt/
drwxr-xr-x. 2 root root 4096 1月 1 2009 odm/
drwxr-xr-x. 2 root root 4096 1月 1 2009 oem/
drwxr-xr-x. 2 root root 4096 1月 1 2009 postinstall/
drwxr-xr-x. 2 root root 4096 1月 1 2009 proc/
drwxr-xr-x. 2 root root 4096 1月 1 2009 product/
lrw-r--r--. 1 root root 24 1月 1 2009 product_services -> /system/product_services
drwxr-xr-x. 3 root root 4096 1月 1 2009 res/
drwxr-x---. 2 root 2000 4096 1月 1 2009 sbin/
lrw-r--r--. 1 root root 21 1月 1 2009 sdcard -> /storage/self/primary
drwxr-x--x. 2 root 1028 4096 1月 1 2009 storage/
drwxr-xr-x. 2 root root 4096 1月 1 2009 sys/
drwxr-xr-x. 14 root root 4096 1月 1 2009 system/
-rw-r--r--. 1 root root 2608 1月 1 2009 ueventd.rc
drwxr-xr-x. 2 root 2000 4096 1月 1 2009 vendor
2.5 persist.img
这个镜像是linux ext4格式的,直接挂载即可
sun@sun-pc:~/android/imgs$ mkdir persist
sun@sun-pc:~/android/imgs$ sudo mount -o ro persist.img persistsun@sun-pc:~/android/imgs$ ls persist
lost+found sensors
2.6 vbmeta.img,vbmeta_system.img
这两个镜像文件暂时还没有找到相关解析方法,后续找到再更新
Android系统 —— image文件解析相关推荐
- Android init.rc文件解析过程详解(三)
Android init.rc文件解析过程详解(三) 三.相关结构体 1.listnode listnode结构体用于建立双向链表,这种结构广泛用于kernel代码中, android源代码中定义了l ...
- 安卓 linux init.rc,[原创]Android init.rc文件解析过程详解(二)
Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...
- Android init.rc文件解析过程详解(二)
Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...
- Android init.rc文件解析过程详解(一)
Android init.rc文件解析过程详解(一) 一.init.rc文件结构介绍 init.rc文件基本组成单位是section, section分为三种类型,分别由三个关键字(所谓关键字 ...
- Android so(ELF) 文件解析
文章目录 前言 生成 so 文件 相关工具 objdump readelf 整体结构图 头部结构 段表结构 字符串表结构 程序表结构 符号表结构 重定位表结构 其他结构 解析代码 打开 ELF 文件 ...
- Android系统ODEX文件格式解析
对于一个Android的apk应用程序,其主要的执行代码都在其中的class.dex文件中.在程序第一次被加载的时候,为了提高以后的启动速度和执行效率,Android系统会对这个class.dex文件 ...
- 【Android 逆向】Android 系统中文件的用户和分组 ( 文件所有者与分组 | /sdcard/ 的文件分组 | /data/ 目录分析 | 用户类型 )
文章目录 一.文件所有者与分组 二./sdcard/ 的文件分组 三./data/ 目录分析 四.用户类型 一.文件所有者与分组 使用 ls -l 命令 , 查看 Android 系统根目录 , 下图 ...
- Android系统架构基本模式解析
Android系统架构总共被分为四层,在这里大家就可以通过介绍对这四个层次进行一个深入的解读,以加深大家对这一系统的认识. 如今,大家面对市场中种类繁多的手机必然挑的眼花缭乱.不过,在智能手机占据主要 ...
- Android APK包文件解析
原博文题目:Android 篡改apk文件的可行性分析 Android的.apk文件实际上就是一个zip文件 可以直接用winrar打开 如下图所示: 包括了一个META-INF目录 一个res目录 ...
最新文章
- 设置让TortoiseGit记住账号和密码
- POJ 1696 Space Ant(极角排序)【计算几何】
- python用一行代码编写一个回声程序_利用Python实现一个WC程序
- 转 Openfire 性能优化
- nzhtl1477-ただいま帰りました ( bfs )
- chrome vue插件_「Vue学习记录一」开发环境准备
- click事件在什么时候出发_什么是移动端?
- (19)Xilinx PCIE中断理论(学无止境)
- 数据存储的问题(1)
- java1.6升级1.7_jdk从1.6升级到1.7可能会遇到的Version问题
- java+线程安全的hash,多线程下HashMap安全问题-ConcurrentHashMap解析
- 东大14春学期《计算机应用基础》在线作业1,东大18春学期《计算机应用基础》在线作业...
- BGP路由反射器原理和实现(华为设备)
- springboot 和springMVC interceptor使用
- 5G即将全面普及,我们到底该换手机卡还是换手机?
- 微信小程序监听手势左右滑动
- 在fpga中用Cordic算法来产生正弦函数
- 快递100企业版接口(API)gitee
- 华为云ECS服务器中通过docker部署jenkins
- 太香了!墙裂推荐 6 个Python数据分析神器!!
热门文章
- 突破无人驾驶量产瓶颈,威蓝科技利用仿真测试降本增效
- 奇妙的AE特效插件之红巨人粒子特效Trapcode Suite
- 1秒消失 alert jquery_jquery 弹窗信息显示几秒后自动消失
- 网狐6603服务器列表加载失败,600 秒后将重新加载, ADO 错误:0x80004005,连接失败
- java 拒绝连接_java.net.ConnectException:连接被拒绝
- pytorch rnn 实现手写字体识别
- 三极管三种放大组态的比较?为什么共基频带宽呢?(硬件每日一题)
- JavaScript利用Date对象实现倒计时效果
- 百度之星1005 序列变换(lis)
- 基于asp.net网上选课系统设计