c++如何读取和解析Android系统的SFS分区文件结构【深度】

秋杰同学_4044

秋杰同学_4044

2026-04-08

397人浏览

原创

SFS分区并非标准文件系统,而是由AVB和内核dm-verity/dm-sfs实现的只读签名验证封装层;其内容由init在early boot阶段通过libavb解析加载,用户态无法直接访问设备节点或绕过libavb解析。

c++如何读取和解析android系统的sfs分区文件结构【深度】

Android SFS 分区不是标准文件系统,libfs 和 libandroidfs 不公开也不可直接链接

Android 12+ 的 SFS(Secure File System)分区并非 ext4、f2fs 或 erofs 这类常规可挂载文件系统,而是由 Android Verified Boot(AVB)和 libavb 配合内核 dm-verity + dm-bow(或 dm-sfs)驱动实现的只读、签名验证、加密感知的元数据封装层。它不暴露 block device 接口给用户态,更不会出现在 /proc/partitions 或 lsblk 中。试图用 fopen("/dev/block/by-name/sfs", "rb") 或 open() 直接读取会失败(ENOENT 或 EACCES),因为该设备节点根本不存在或被 SELinux 策略屏蔽。

关键点:

  • SFS 分区内容由 init 在 early boot 阶段通过 libavb 解析并加载进内存,后续仅通过 /system/etc/avb/ 下的预校验 manifest(如 vbmeta_system.img)间接引用
  • 用户态 C++ 程序无法绕过内核驱动直接解析 SFS —— 它没有公开的 on-disk 格式文档,也没有 ABI 稳定的解析库
  • Google 明确将 SFS 实现为“firmware-adjacent”,源码散落在 system/security/avb/、bootable/bootloader/edk2/Platform/Android/ 及内核 drivers/md/dm-sfs.c(仅限特定 OEM 内核分支)中,不纳入 AOSP 主干

想提取 SFS 中的 manifest 或签名信息?必须走 AVB 工具链,而非自写 C++ 解析器

真正能“读取 SFS”的唯一合法路径,是复用 AOSP 提供的 avbtool(Python)及其底层 C 库 libavb。C++ 项目若需集成,应调用 libavb 的稳定 API,而非逆向二进制结构。

实操建议:

  • 从 AOSP 源码同步 system/security/avb/,编译出静态库 libavb.a(注意:需启用 AVB_ENABLE_DEBUG 才开放部分内部结构体)
  • 核心入口函数是 avb_vbmeta_image_verify() 和 avb_descriptor_foreach(),用于校验 vbmeta 并遍历其中嵌套的 AvbDescriptor(含 hash、hashtree、chain partition 等)
  • SFS 关键数据实际存于 AvbHashDescriptor 的 partition_name 字段(如 "system")与 digest 字段(32 字节 SHA256),而非独立“SFS 文件”中
  • 不要尝试用 fread() 读取 /dev/block/by-name/vbmeta_system 后手动解析 —— AVB header 偏移、descriptor 对齐、RSA 签名验证流程都必须由 libavb 完成,否则校验必失败

avb_slot_verify() 是唯一可信赖的 C++ 可调用接口,但仅适用于已挂载设备或镜像文件

如果你手头有完整的 vbmeta_system.img(例如从线刷包解包得到),C++ 可安全调用 avb_slot_verify() 获取解析结果;但若目标是运行中的设备上的 SFS 分区,则此路不通——avb_slot_verify() 要求输入是完整 vbmeta 映像字节流,而运行时 SFS 的元数据已由内核解密并映射为逻辑块,不再以原始格式存在。

典型代码片段(需链接 -lavb):

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
AvbSlotVerifyData* verify_data = nullptr;
AvbSlotVerifyResult result = avb_slot_verify(
    avb_ops,      // 自定义 AvbOps 实现,用于读取分区(如从文件 or /dev/block/...)
    "system",     // slot 名称
    AVB_SLOT_VERIFY_FLAGS_ALLOW_VERIFICATION_ERROR,
    &verify_data);
if (result == AVB_SLOT_VERIFY_RESULT_OK && verify_data) {
  // verify_data->vbmeta_images[0] 即 vbmeta_system.img 解析后结构
  // verify_data->loaded_partitions 包含 system、vendor 等经校验的分区信息
}

注意陷阱:

  • AvbOps 必须正确实现 read_from_partition() —— 若从文件读取,要处理 padding 和 alignment;若从设备读,需 root 权限 + 绕过 SELinux(avc: denied { read } for ... scontext=u:r:shell:s0)
  • avb_slot_verify() 不解析 SFS 本身,它只消费 vbmeta 中对 SFS 所保护分区(如 system)的描述,SFS 是机制,不是数据容器
  • 返回的 verify_data 中不含原始 SFS 二进制,只有校验通过后的逻辑视图(如分区哈希、公钥指纹、rollback index)

真要“解析 SFS 结构”?你大概率混淆了概念:SFS 无传统目录树,只有 AVB 描述链

很多人搜索“SFS 分区结构”是想看到类似 ls -R /sfs 的结果,但 SFS 没有 inode、dentry 或 superblock。它的“结构”就是一组 AVB descriptor 链:vbmeta → hash descriptor → hashtree descriptor →(可选)chain descriptor → 下一级 vbmeta。整个链条最终锚定到一个真实分区(如 /dev/block/by-name/system)的哈希值上。

所以,所谓“解析 SFS”,实质是:

  • 用 avbtool info vbmeta_system.img 查看 descriptor 层级关系
  • 用 avbtool verify_image --image system.img 校验其是否匹配 vbmeta 中声明的哈希
  • 在 C++ 中调用 avb_descriptor_foreach() 遍历 descriptor,根据 descriptor->tag 类型(AVB_DESCRIPTOR_TAG_HASH / AVB_DESCRIPTOR_TAG_HASHTREE)提取对应字段
  • 放弃寻找“SFS 根目录”或“SFS 文件列表”——它不存在

最易被忽略的一点:SFS 的“安全性”来自内核驱动的实时验证,不是靠用户态解析出来的某个结构体。任何脱离 libavb 或内核 dm-sfs 的“解析”,得到的只是未验证的、可能被篡改的元数据快照。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

2025.06.09

5154

18

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

2025.07.04

5311

25

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

2023.10.19

3208

3

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

2025.10.17

5229

12

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2025.12.29

3869

9

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

2026.01.19

486

15

css中的padding属性作用
css中的padding属性作用

在CSS中,padding属性用于设置元素的内边距。想了解更多padding的相关内容,可以阅读本专题下面的文章。

2023.12.07

3212

3

android开发三大框架
android开发三大框架

android开发三大框架是XUtil框架、volley框架、ImageLoader框架。本专题为大家提供android开发三大框架相关的各种文章、以及下载和课程。

2023.08.14

922

4

android是什么系统
android是什么系统

Android是一种功能强大、灵活可定制、应用丰富、多任务处理能力强、兼容性好、网络连接能力强的操作系统。本专题为大家提供android相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.22

2767

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习