讲师中心 微信公众号
AI工具推荐 视频效率加速

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

秋杰同学_4044

秋杰同学_4044

发布时间:2026-04-08 20:40:49

|

397人浏览过

|

来源于php中文网

原创

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,而非逆向二进制结构。

实操建议:

立即学习“C++免费学习笔记(深入)”;

  • 从 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 的元数据已由内核解密并映射为逻辑块,不再以原始格式存在。

C++14
C++14

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

下载

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

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++

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

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

相关专题

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

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

5154

2025.06.09

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

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

5311

2025.07.04

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

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

3208

2023.10.19

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

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

5249

2025.10.17

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

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

3869

2025.12.29

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

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

486

2026.01.19

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

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

3212

2023.12.07

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

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

922

2023.08.14

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

0

2026.11.03

热门下载

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

精品课程

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

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

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

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn