1. 前言
在学习 Android Verify Boot 时,boot.img 都包含哪些数据,你有尝试亲自去分析 boot.img 吗?
一个 boot 分区的镜像,为了满足 AVB 必要,必要举行如何处置惩罚?
本文以实际操纵的形式,带你检察 boot.img 镜像,包括 avbtool 的多个操纵,以及如何如何手动剖析 AVB Footer,如何利用 shell 命令验证带有 salt 的镜像 hash 值。
由于 AVB 的 VBMeta 数据较为复杂,本文没有对齐举行深入分析,后续考虑单独剖析。
假如以为实际操纵比力繁琐,请转到第 4 节,检察 avbtool 命令,以及 boot.img 的格式总结。
2. 环境
1. 编译 AOSP 源码
假如你有自己的代码环境,可以自行编译一个 Android 源码,然后参照本文的操纵分析你的 boot.img。
假如你没有自己实战的平台,可以参考 《如何下载和编译 Android 源码?》中的步骤,下载开源 AOSP 代码 android-13.0.0_r41 的源码,并基于 Google Pixel 7 (“panther”) 举行编译:
- # prepare android-13.0.0_r41
- $ repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r41
- $ repo sync
- # prepare Pixel 7("panther") binaries
- $ wget https://dl.google.com/dl/android/aosp/google_devices-panther-tq2a.230405.003.e1-2c3467dd.tgz
- $ tar -zxf google_devices-panther-tq2a.230405.003.e1-2c3467dd.tgz
- $ ./extract-google_devices-panther.sh
- # build
- $ source build/envsetup.sh
- $ lunch aosp_panther-userdebug
- $ make dist -j128 2>&1 | tee make-dist-20241202.log
复制代码 为了后面的操纵方便,我这里将全部的编译 log 都保存到文件 make-dist-20241202.log 中了。
2. 网络 avbtool 日志
在编译阶段,全部的 AVB 数据处置惩罚都由 avbtool.py 工具举行,所以在我们的编译 log 中搜刮 avbtool,并将全部 avbtool 相关的操纵并保存到 make-dist-20241202-avbtool.log 文件中:
- $ grep -n avbtool make-dist-20241202.log | tee make-dist-20241202-avbtool.log
复制代码 3. 操纵
1. 利用 avbtool 处置惩罚 boot.img
在编译 log 文件 make-dist-20241202-avbtool.log 中检察 avbtool 用于 boot.img 的操纵,再回到完备的 log 文件中检察,原始的对 boot.img 操纵的 log 是这样的:
- 2024-12-02 14:53:54 - add_img_to_target_files.py - INFO :
- ++++ boot ++++
- 2024-12-02 14:53:54 - common.py - INFO : Re-signing prebuilt boot.img from PREBUILT_IMAGES...
- 2024-12-02 14:53:54 - common.py - INFO : Running: "/local/public/users/rocky/android-13.0.0_r41/out/host/linux-x86/bin/avbtool add_hash_footer --image /local/public/users/rocky/android-13.0.0_r41/out/soong/.temp/tmpusb5srwm --partition_size 67108864 --partition_name boot --key external/avb/test/data/testkey_rsa2048.pem --algorithm SHA256_RSA2048 --prop com.android.build.boot.os_version:13 --prop com.android.build.boot.fingerprint:Android/aosp_panther/panther:13/TQ2A.230405.003.E1/rocky12021421:userdebug/test-keys --prop com.android.build.boot.security_patch:2023-04-05 --rollback_index 1680652800"
复制代码 根据 log 中的信息,看起来是对 PREBUILT_IMAGES 文件夹下面的 boot.img 重现署名了。
为了表现方便,整理一下署名的具体命令,如下:
- avbtool add_hash_footer \
- --image boot.img \
- --partition_size 67108864 \
- --partition_name boot \
- --key external/avb/test/data/testkey_rsa2048.pem \
- --algorithm SHA256_RSA2048 \
- --prop com.android.build.boot.os_version:13 \
- --prop com.android.build.boot.fingerprint:Android/aosp_panther/panther:13/TQ2A.230405.003.E1/rocky12021421:userdebug/test-keys \
- --prop com.android.build.boot.security_patch:2023-04-05 \
- --rollback_index 1680652800
复制代码 简单来说,就是对 boot.img 执行 add_hash_footer 操纵,然后利用 external/avb/test/data/testkey_rsa2048.pem 举行署名。
2. 利用 avbtool 检察 boot.img
我们利用 avbtool 工具的 info_image 检察下生成的 boot.img 文件:
- $ avbtool info_image --image out/target/product/panther/boot.img
- Footer version: 1.0
- Image size: 67108864 bytes
- Original image size: 24981504 bytes
- VBMeta offset: 24981504
- VBMeta size: 1664 bytes
- --
- Minimum libavb version: 1.0
- Header Block: 256 bytes
- Authentication Block: 320 bytes
- Auxiliary Block: 1088 bytes
- Public key (sha1): cdbb77177f731920bbe0a0f94f84d9038ae0617d
- Algorithm: SHA256_RSA2048
- Rollback Index: 1680652800
- Flags: 0
- Rollback Index Location: 0
- Release String: 'avbtool 1.2.0'
- Descriptors:
- Hash descriptor:
- Image Size: 24981504 bytes
- Hash Algorithm: sha256
- Partition Name: boot
- Salt: 9f4a6530e6ce8d00b77548ed0ad00344cd7724f83ca0bf9a8f0ad9ea4c366b41
- Digest: e355127406fbce41f1cd044e6ab06aff4c24a36e9984bceb3cc59d3f14a66be1
- Flags: 0
- Prop: com.android.build.boot.os_version -> '13'
- Prop: com.android.build.boot.fingerprint -> 'Android/aosp_panther/panther:13/TQ2A.230405.003.E1/rocky12021421:userdebug/test-keys'
- Prop: com.android.build.boot.security_patch -> '2023-04-05'
复制代码 解释下这里表现的重点:
- AVB Footer 版本: 1.0
- 处置惩罚后的 boot.img 镜像大小为 64M (即 67108864),给 avbtool 传入的参数指定生成的镜像为 64M
- 原始的不带任何额外数据的 boot.img 镜像为 24981504 字节 (可以通过 avbtool erase_footer 移除额外的 AVB 数据来还原原始的镜像)
- AVB 的元数据 VBMeta 大小为 1664 字节,位于偏移量为 24981504 的位置(原始镜像竣事的地方)
- AVB 的元数据 VBMeta 的具体内容
- 各个块数据大小
- 署名利用的公钥的 sha1 哈希:cdbb77177f731920bbe0a0f94f84d9038ae0617d
- 署名填充算法:SHA256_RSA2048
- 回滚 Index 值:1680652800
- 包含了 1 个哈希描述符
- 包含了 3 个 Prop 属性
3. 利用 avbtool 添加的额外数据
当利用 avbtool 对原来的 boot.img 执行 add_hash_footer 操纵时到底添加了哪些数据呢?
- 写入原始未经处置惩罚的镜像 boot.img
- 将原始镜像 boot.img 盘算得到的 VBMeta 元数据存放在原始镜像竣事的地方
- 将新镜像填充到指定的 64M 大小(--partition_size 67108864),假如利用 --dynamic_partition_size 参数,则不举行填充,直接按照 4K 对齐举行处置惩罚
- 在新镜像的最后 64 直接直接写入 AVB Footer 内容
注:全部操纵都按照 4K 页面举行
比方:
- 原始未经处置惩罚的 boot.img 镜像填充到 4K 对齐;(生成时已经按照 4K 对齐了)
- VBMeta 存放在 4K 起始位置,并且填充到 4K 对齐(这里实际 1664 字节,最终占用 4K)
- 假如必要填充,则填充到指定大小 - 4K,因为最后 4K 放 AVB Footer
- 最后 1 个 4K 竣事位置的 64 字节写入 AVBFooter
所以,最终的 boot.img 格式如下:
- boot.img layout:
- +----------------+ <-- 0
- | |
- | Boot Image |
- | |
- +----------------+ <-- original_image_size
- | VBMeta | <-- vbmeta_offset
- | (64KB max) |
- +----------------+
- | |
- | Padding |
- | |
- +----------------+ <-- Last 4KB offset
- | (4KB) |
- | AVB Footer | <-- Last 64 bytes
- +----------------+ <-- partition_size (64MB)
复制代码 总体来说,利用 add_hash_footer 操纵的镜像处置惩罚后包含以下 3 块数据:
- 原始分区镜像
- AVB 元数据 (VBMeta),位置从原始镜像竣事开始
- AVB Footer 数据,最后一个 4K 页面的最后 64 个字节
4. 查验 boot.img 中额外添加的数据
为了证明上一节的结论,即:利用 add_hash_footer 操纵的镜像处置惩罚后包含以下 3 块数据:
- 原始分区镜像
- AVB 元数据 (VBMeta),位置从原始镜像竣事开始
- AVB Footer 数据,最后一个 4K 页面的最后 64 个字节
我们利用 hexdump 工具检查生成的 boot.img 文件
检察 AVB Footer
整个 64M 镜像最后 4K 的起始地点为 0x3FFF000,这里检察从 0x3FFF000 开始的 4096 字节:
- $ hexdump -C -s 0x3FFF000 -n 4096 out/target/product/panther/boot.img
- 03fff000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
- *
- 03ffffc0 41 56 42 66 00 00 00 01 00 00 00 00 00 00 00 00 |AVBf............|
- 03ffffd0 01 7d 30 00 00 00 00 00 01 7d 30 00 00 00 00 00 |.}0......}0.....|
- 03ffffe0 00 00 06 80 00 00 00 00 00 00 00 00 00 00 00 00 |................|
- 03fffff0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
- 04000000
复制代码 可以看到,这里最后 64 直接为 AVB Footer。
可以根据文件 external/avb/libavb/avb_footer.h 中界说的 AVB Footer 来手动剖析一下:
- /* Magic for the footer. */
- #define AVB_FOOTER_MAGIC "AVBf"
- #define AVB_FOOTER_MAGIC_LEN 4
- /* Size of the footer. */
- #define AVB_FOOTER_SIZE 64
- /* The current footer version used - keep in sync with avbtool. */
- #define AVB_FOOTER_VERSION_MAJOR 1
- #define AVB_FOOTER_VERSION_MINOR 0
- /* The struct used as a footer used on partitions, used to find the
- * AvbVBMetaImageHeader struct. This struct is always stored at the
- * end of a partition.
- */
- typedef struct AvbFooter {
- /* 0: Four bytes equal to "AVBf" (AVB_FOOTER_MAGIC). */
- uint8_t magic[AVB_FOOTER_MAGIC_LEN];
- /* 4: The major version of the footer struct. */
- uint32_t version_major;
- /* 8: The minor version of the footer struct. */
- uint32_t version_minor;
- /* 12: The original size of the image on the partition. */
- uint64_t original_image_size;
- /* 20: The offset of the |AvbVBMetaImageHeader| struct. */
- uint64_t vbmeta_offset;
- /* 28: The size of the vbmeta block (header + auth + aux blocks). */
- uint64_t vbmeta_size;
- /* 36: Padding to ensure struct is size AVB_FOOTER_SIZE bytes. This
- * must be set to zeroes.
- */
- uint8_t reserved[28];
- } AVB_ATTR_PACKED AvbFooter;
复制代码 剖析效果:
- magic( 4): 41 56 42 66 -> magic: "AVBf"
- version_major( 4): 00 00 00 01 -> major: 1
- version_minor( 4): 00 00 00 00 -> minor: 0
- original_image_size( 8): 00 00 00 00 01 7d 30 00 -> 0x00000000 017d3000 = 24981504
- vbmeta_offset( 8): 00 00 00 00 01 7d 30 00 -> 0x00000000 017d3000 = 24981504
- vbmeta_size( 8): 00 00 00 00 00 00 06 80 -> 0x00000000 00000680 = 1664
复制代码 所以,通过最后 64 字节的 AVB Footer 剖析得到以下内容:
- Footer version: 1.0
- Image size: 67108864 bytes
- Original image size: 24981504 bytes
- VBMeta offset: 24981504
- VBMeta size: 1664 bytes
复制代码 检察 AVB 元数据 VBMeta
从前面可以看到,原始镜像大小为 24981504 字节,VBMeta offset 也是从偏移位置 24981504 开始,我们看下从24981504 开始的这 4K 数据:
- $ hexdump -C -s 24981504 -n 4096 out/target/product/panther/boot.img
- 017d3000 41 56 42 30 00 00 00 01 00 00 00 00 00 00 00 00 |AVB0............|
- 017d3010 00 00 01 40 00 00 00 00 00 00 04 40 00 00 00 01 |...@.......@....|
- 017d3020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 |............... |
- 017d3030 00 00 00 00 00 00 00 20 00 00 00 00 00 00 01 00 |....... ........|
- 017d3040 00 00 00 00 00 00 02 00 00 00 00 00 00 00 02 08 |................|
- 017d3050 00 00 00 00 00 00 04 08 00 00 00 00 00 00 00 00 |................|
- 017d3060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 |................|
- 017d3070 00 00 00 00 64 2c ba 00 00 00 00 00 00 00 00 00 |....d,..........|
- 017d3080 61 76 62 74 6f 6f 6c 20 31 2e 32 2e 30 00 00 00 |avbtool 1.2.0...|
- 017d3090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
- *
- 017d3100 97 e0 ad 7d 58 29 0d 94 9e 8c 19 04 db 9f f1 50 |...}X).........P|
- 017d3110 8d 4d 2e 03 c2 23 ff ed f5 71 7e 39 ee a1 c9 35 |.M...#...q~9...5|
- 017d3120 71 b9 61 3a 06 3e ae 36 e3 79 19 12 10 c8 d9 cb |q.a:.>.6.y......|
- 017d3130 06 58 06 4f c2 04 03 46 f1 0b a8 87 84 e7 a4 84 |.X.O...F........|
- 017d3140 7a e3 39 79 e3 48 d8 83 68 a1 fd bc 33 15 5e 76 |z.9y.H..h...3.^v|
- 017d3150 13 96 ef f1 96 4a de 93 62 00 b9 00 39 1f 2a 01 |.....J..b...9.*.|
- 017d3160 7e b1 da c1 7e 9b a4 8a 97 7a 1b d6 eb 8e f3 73 |~...~....z.....s|
- 017d3170 9e 3f 61 36 c3 74 1f 74 83 e9 7d e7 5d 8b 85 31 |.?a6.t.t..}.]..1|
- 017d3180 57 bf 55 e6 83 18 f1 76 3f 93 c6 dc 68 b2 c2 54 |W.U....v?...h..T|
- 017d3190 a3 56 42 6f b0 da 9e 41 55 62 4d bf 3e 8d 24 cb |.VBo...AUbM.>.$.|
- 017d31a0 d6 b0 9f 9b 08 58 e6 75 d8 0c fd 61 f2 6e 2d 80 |.....X.u...a.n-.|
- 017d31b0 25 e4 12 0d 09 64 0c 27 44 7f 4e e9 10 c4 95 03 |%....d.'D.N.....|
- 017d31c0 ea f4 89 26 c0 ae d4 c5 9b e5 74 44 af 9e d9 58 |...&......tD...X|
- 017d31d0 77 85 73 51 ea ad f2 0b 76 f8 81 ff 26 d8 e5 8e |w.sQ....v...&...|
- 017d31e0 ab 0d 2b e7 e6 10 9e 44 86 28 16 10 d5 57 90 f0 |..+....D.(...W..|
- 017d31f0 db 9a db f5 76 e0 1e c2 f6 88 e7 e1 a4 11 91 79 |....v..........y|
- 017d3200 e2 eb 56 85 32 ba 0a bd 49 45 09 0d fc ce 9a 18 |..V.2...IE......|
- 017d3210 85 80 ab 64 c9 db cc f2 8c 35 fd a2 55 2c 4e 9f |...d.....5..U,N.|
- 017d3220 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
- *
- 017d3240 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 b8 |................|
- 017d3250 00 00 00 00 01 7d 30 00 73 68 61 32 35 36 00 00 |.....}0.sha256..|
- 017d3260 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
- 017d3270 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 20 |............... |
- 017d3280 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 |... ............|
- 017d3290 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
- *
- 017d32c0 00 00 00 00 62 6f 6f 74 9f 4a 65 30 e6 ce 8d 00 |....boot.Je0....|
- 017d32d0 b7 75 48 ed 0a d0 03 44 cd 77 24 f8 3c a0 bf 9a |.uH....D.w$.<...|
- 017d32e0 8f 0a d9 ea 4c 36 6b 41 e3 55 12 74 06 fb ce 41 |....L6kA.U.t...A|
- 017d32f0 f1 cd 04 4e 6a b0 6a ff 4c 24 a3 6e 99 84 bc eb |...Nj.j.L$.n....|
- 017d3300 3c c5 9d 3f 14 a6 6b e1 00 00 00 00 00 00 00 00 |<..?..k.........|
- 017d3310 00 00 00 00 00 00 00 38 00 00 00 00 00 00 00 21 |.......8.......!|
- 017d3320 00 00 00 00 00 00 00 02 63 6f 6d 2e 61 6e 64 72 |........com.andr|
- 017d3330 6f 69 64 2e 62 75 69 6c 64 2e 62 6f 6f 74 2e 6f |oid.build.boot.o|
- 017d3340 73 5f 76 65 72 73 69 6f 6e 00 31 33 00 00 00 00 |s_version.13....|
- 017d3350 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 88 |................|
- 017d3360 00 00 00 00 00 00 00 22 00 00 00 00 00 00 00 54 |.......".......T|
- 017d3370 63 6f 6d 2e 61 6e 64 72 6f 69 64 2e 62 75 69 6c |com.android.buil|
- 017d3380 64 2e 62 6f 6f 74 2e 66 69 6e 67 65 72 70 72 69 |d.boot.fingerpri|
- 017d3390 6e 74 00 41 6e 64 72 6f 69 64 2f 61 6f 73 70 5f |nt.Android/aosp_|
- 017d33a0 70 61 6e 74 68 65 72 2f 70 61 6e 74 68 65 72 3a |panther/panther:|
- 017d33b0 31 33 2f 54 51 32 41 2e 32 33 30 34 30 35 2e 30 |13/TQ2A.230405.0|
- 017d33c0 30 33 2e 45 31 2f 72 6f 63 6b 79 31 32 30 32 31 |03.E1/rocky12021|
- 017d33d0 34 32 31 3a 75 73 65 72 64 65 62 75 67 2f 74 65 |421:userdebug/te|
- 017d33e0 73 74 2d 6b 65 79 73 00 00 00 00 00 00 00 00 00 |st-keys.........|
- 017d33f0 00 00 00 00 00 00 00 48 00 00 00 00 00 00 00 25 |.......H.......%|
- 017d3400 00 00 00 00 00 00 00 0a 63 6f 6d 2e 61 6e 64 72 |........com.andr|
- 017d3410 6f 69 64 2e 62 75 69 6c 64 2e 62 6f 6f 74 2e 73 |oid.build.boot.s|
- 017d3420 65 63 75 72 69 74 79 5f 70 61 74 63 68 00 32 30 |ecurity_patch.20|
- 017d3430 32 33 2d 30 34 2d 30 35 00 00 00 00 00 00 00 00 |23-04-05........|
- 017d3440 00 00 08 00 c9 d8 7d 7b c6 55 51 dd 32 24 a2 e0 |......}{.UQ.2$..|
- 017d3450 0e bc 7e fd bd a2 53 80 58 69 7e f5 4a 40 87 95 |..~...S.Xi~.J@..|
- 017d3460 90 54 59 3d 55 ca ff 36 34 1a fa e1 e0 90 2a 1a |.TY=U..64.....*.|
- 017d3470 32 68 5b f3 df ad 0b f9 b1 d0 f7 ea ab 47 1f 76 |2h[..........G.v|
- 017d3480 be 1b 98 4b 67 a3 62 fa df e6 b5 f8 ee 73 16 5f |...Kg.b......s._|
- 017d3490 b8 b1 82 de 49 89 d5 3d d7 a8 42 99 81 75 c8 d8 |....I..=..B..u..|
- 017d34a0 84 7b bd 54 a8 22 64 44 bc 34 06 10 3c 89 c2 d1 |.{.T."dD.4..<...|
- 017d34b0 f3 2c 03 65 91 b1 a0 d1 c8 21 56 15 99 48 20 27 |.,.e.....!V..H '|
- 017d34c0 74 ef 01 7a 76 a5 0b 6b fd e3 fa ed 0d f9 0f 7a |t..zv..k.......z|
- 017d34d0 41 fa 76 05 37 49 fe 34 4f 4b 01 49 e4 98 f7 89 |A.v.7I.4OK.I....|
- 017d34e0 8e cd 36 aa 39 1d a9 7d 5d 6b 5a 52 d1 75 69 a8 |..6.9..}]kZR.ui.|
- 017d34f0 df 7c de 1c 1b f9 d9 19 5b b7 47 4c b9 70 2e ad |.|......[.GL.p..|
- 017d3500 e5 d6 88 7c ed 92 6e 46 08 10 b5 76 03 3e 09 ac |...|..nF...v.>..|
- 017d3510 4d b6 2c cd 12 00 bd d4 a7 03 d3 1b 91 08 23 36 |M.,...........#6|
- 017d3520 5b 11 fe af 59 69 b3 3c 88 24 37 2d 61 ba c5 99 |[...Yi.<.$7-a...|
- 017d3530 51 18 97 f9 23 42 96 9f 87 2e cd b2 4d 5f a9 24 |Q...#B......M_.$|
- 017d3540 f2 45 da e2 65 26 26 4d 1e fa 3b 53 ab c5 d3 79 |.E..e&&M..;S...y|
- 017d3550 53 2f 66 b8 21 94 66 9a 93 6f 35 26 43 8c 8f 96 |S/f.!.f..o5&C...|
- 017d3560 b9 ff ac cd f4 00 6e be b6 73 54 84 50 85 46 53 |......n..sT.P.FS|
- 017d3570 d5 dd 43 fe b2 6a 78 40 79 56 9f 86 f3 d3 81 3b |..C..jx@yV.....;|
- 017d3580 3d 40 90 35 32 9a 51 7f f8 c3 4b c7 d6 a1 ca 30 |=@.52.Q...K....0|
- 017d3590 fb 1b fd 27 0a b8 64 41 34 c1 17 de a1 76 9a eb |...'..dA4....v..|
- 017d35a0 cf 0c 50 d9 13 f5 0d 0b 2c 99 24 cb b5 b4 f8 c6 |..P.....,.$.....|
- 017d35b0 0a d0 26 b1 5b fd 4d 44 66 9d b0 76 aa 79 9d c0 |..&.[.MDf..v.y..|
- 017d35c0 5c 3b 94 36 c1 8f fe c9 d2 5a 6a a0 46 e1 a2 8b |\;.6.....Zj.F...|
- 017d35d0 2f 51 61 51 a3 36 91 83 b4 fb cd a9 40 34 46 98 |/QaQ.6......@4F.|
- 017d35e0 8a 1a 91 df d9 2c 3a bf 57 3a 46 46 20 f2 f0 bc |.....,:.W:FF ...|
- 017d35f0 31 5e 29 fe 58 90 32 5c 66 97 99 9a 8e 15 23 eb |1^).X.2\f.....#.|
- 017d3600 a9 47 d3 63 c6 18 bb 8e d2 20 9f 78 af 71 b3 2e |.G.c..... .x.q..|
- 017d3610 08 89 a1 f1 7d b1 30 a0 e6 1b bd 6e c8 f6 33 e1 |....}.0....n..3.|
- 017d3620 da b0 bd 16 41 fe 07 6f 6e 97 8b 6a 33 d2 d7 80 |....A..on..j3...|
- 017d3630 03 6a 4d e7 05 82 28 1f ef 6a a9 75 7e e1 4e e2 |.jM...(..j.u~.N.|
- 017d3640 95 5b 4f e6 dc 03 b9 81 00 00 00 00 00 00 00 00 |.[O.............|
- 017d3650 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
- *
- 017d4000
复制代码 从输出的内容看,从位置 0x017d3650 (针对 VBMeta 的偏移为 0x650)开始,后面的数据全部都填充为 0 了。
这里的重点是剖析 AVB Footer,并提取信息检察 VBMeta 的具体位置。但关于 VBMeta 数据具体内容的剖析不是这里的重点,所以暂时略过。
5. 别的操纵
1. 还原原始的 boot.img 镜像
可以通过 avbtool 的 erase_footer 命令来还原原始镜像。
为了不破坏原始数据,这里先将生成的 boot.img 复制为 boot1.img,然后基于 boot1.img 举行操纵:
- $ cp out/target/product/panther/boot.img boot1.img
- $ avbtool erase_footer --image boot1.img
- $ ls -al boot1.img
- -rw-r--r-- 1 rocky users 24981504 Dec 3 15:57 boot1.img
复制代码 从这里可以看到,当移除了 VBMeta,AVB Footer 以及填充后,boot1.img 恢复到了原始镜像的 24981504 字节大小。
2. 验证原始的 boot.img 镜像加 salt 后的哈希值
在分析 boot.img 时,提到了 boot.img 的 VBMeta 中包含了一个 Hash Descriptor:
- Hash descriptor:
- Image Size: 24981504 bytes
- Hash Algorithm: sha256
- Partition Name: boot
- Salt: 9f4a6530e6ce8d00b77548ed0ad00344cd7724f83ca0bf9a8f0ad9ea4c366b41
- Digest: e355127406fbce41f1cd044e6ab06aff4c24a36e9984bceb3cc59d3f14a66be1
- Flags: 0
复制代码 我们可以通过上一步还原的 boot1.img 以及这里利用的 Salt 值验证 Digest 值:
- # 1. 将 Salt 转换成二进制文件
- $ echo -n "9f4a6530e6ce8d00b77548ed0ad00344cd7724f83ca0bf9a8f0ad9ea4c366b41" | xxd -r -ps > salt.bin
- $ hexdump -Cv salt.bin
- 00000000 9f 4a 65 30 e6 ce 8d 00 b7 75 48 ed 0a d0 03 44 |.Je0.....uH....D|
- 00000010 cd 77 24 f8 3c a0 bf 9a 8f 0a d9 ea 4c 36 6b 41 |.w$.<.......L6kA|
- 00000020
- # 2. 将 salt.bin 和 boot1.img 合并到一起计算 sha256 哈希
- $ cat salt.bin boot1.img | sha256sum
- e355127406fbce41f1cd044e6ab06aff4c24a36e9984bceb3cc59d3f14a66be1 -
复制代码 从上面可以看到,将 Salt 的内容添加到原始镜像的署名再盘算 SHA256 哈希,确实得到了 Hash Descriptor 中的 Digest 值。
各种安全算法中所谓的加盐操纵,实际上就是将一个随机的二进制数据添加到必要盘算的数据前面,然后再对数据举行所必要的操纵。
4. 总结
1. avbtool 子命令
本文主要演示了 avbtool 的 3 个子命令:
- add_hash_footer
- info_image
- erase_footer
add_hash_footer
add_hash_footer 用于处置惩罚原始的 boot.img,生成 AVB 必要的数据,包括 VBMeta 和 AVB Footer
- avbtool add_hash_footer \
- --image boot.img \
- --partition_size 67108864 \
- --partition_name boot \
- --key external/avb/test/data/testkey_rsa2048.pem \
- --algorithm SHA256_RSA2048 \
- --prop com.android.build.boot.os_version:13 \
- --prop com.android.build.boot.fingerprint:Android/aosp_panther/panther:13/TQ2A.230405.003.E1/rocky12021421:userdebug/test-keys \
- --prop com.android.build.boot.security_patch:2023-04-05 \
- --rollback_index 1680652800
复制代码 info_image
info_image 用于检察镜像中的 AVB 数据,主要是 VBMeta 元数据
- $ avbtool info_image --image out/target/product/panther/boot.img
- Footer version: 1.0
- Image size: 67108864 bytes
- Original image size: 24981504 bytes
- VBMeta offset: 24981504
- VBMeta size: 1664 bytes
- --
- Minimum libavb version: 1.0
- Header Block: 256 bytes
- Authentication Block: 320 bytes
- Auxiliary Block: 1088 bytes
- Public key (sha1): cdbb77177f731920bbe0a0f94f84d9038ae0617d
- Algorithm: SHA256_RSA2048
- Rollback Index: 1680652800
- Flags: 0
- Rollback Index Location: 0
- Release String: 'avbtool 1.2.0'
- Descriptors:
- Hash descriptor:
- Image Size: 24981504 bytes
- Hash Algorithm: sha256
- Partition Name: boot
- Salt: 9f4a6530e6ce8d00b77548ed0ad00344cd7724f83ca0bf9a8f0ad9ea4c366b41
- Digest: e355127406fbce41f1cd044e6ab06aff4c24a36e9984bceb3cc59d3f14a66be1
- Flags: 0
- Prop: com.android.build.boot.os_version -> '13'
- Prop: com.android.build.boot.fingerprint -> 'Android/aosp_panther/panther:13/TQ2A.230405.003.E1/rocky12021421:userdebug/test-keys'
- Prop: com.android.build.boot.security_patch -> '2023-04-05'
复制代码 erase_footer
erase_footer 用于移除镜像中的 AVB 数据,包括 VBMeta, AVB Footer 和中央填充的数据,恢复原始镜像。
- $ avbtool erase_footer --image boot1.img
复制代码 2. boot.img 镜像格式
当利用 avbtool 对原始的 boot.img 镜像执行 add_hash_footer 操纵时,主要发生了以下变化:
- 写入原始未经处置惩罚的镜像 boot.img
- 将原始镜像 boot.img 盘算得到的 VBMeta 元数据存放在原始镜像竣事的地方(4K 对齐)
- 将新镜像填充到指定大小(比方 64M 大小)
- 在新镜像的最后 64 字节直接写入 AVB Footer 内容
注:全部操纵都按照 4K 页面对齐举行
所以,最终的 boot.img 格式如下:
- boot.img layout:
- +----------------+ <-- 0
- | |
- | Boot Image |
- | |
- +----------------+ <-- original_image_size
- | VBMeta | <-- vbmeta_offset
- | (64KB max) |
- +----------------+
- | |
- | Padding |
- | |
- +----------------+ <-- Last 4KB offset
- | (4KB) |
- | AVB Footer | <-- Last 64 bytes
- +----------------+ <-- partition_size (64MB)
复制代码 总体来说,利用 add_hash_footer 操纵的镜像处置惩罚后包含以下 3 块数据:
- Original Data: 原始分区镜像
- VBMeta: AVB 元数据 (VBMeta),位置从原始镜像竣事开始
- AVB Footer: AVB Footer 数据,最后一个 4K 页面的最后 64 个字节
本文的内容除了分析 boot.img 之外,也适合任何别的基于 add_hash_footer 操纵的镜像,比方 dtbo.img,或者 radio.img 这类小分区镜像。因为较大分区(如 system, vendor, product 等)镜像会利用 add_hashtree_footer 操纵。
5. 别的
我创建了一个 Android AVB 讨论群,主要讨论 Android 设备的 AVB 验证问题。
我还几个 Android OTA 升级讨论群,主要讨论 Android 设备的 OTA 升级话题。
接待您加群和我们一起交流,请在加我微信时注明“Android AVB 交流”或“Android OTA 交流”。
仅限 Android 相关的开发者参与~
公众号“洛奇看世界”后台回复“wx”获取个人微信。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |