最近发现DD命令还挺有用的。
已经从板子当前活动槽 _a 提取完成。
文件:
- xbl_config.elf(C:\Users\John Jiang\Documents\Codex\2026-08-12\xian\outputs\xbl_config.elf)
- xbl_config_a 完整分区镜像(C:\Users\John Jiang\Documents\Codex\2026-08-12\xian\outputs\xbl_config_a_partition.img)
提取信息:
当前槽位: _a
分区: /dev/block/by-name/xbl_config_a
实际块设备: /dev/block/mmcblk0p3
完整分区大小: 237,568 字节
ELF有效大小: 139,448 字节(0x220B8)
ELF 的 SHA-256:
5903F15B3B992126F294D3B1371557C0243FE23D855AE12976EC8CBAD5FC4A90
完整分区镜像 SHA-256:
41DA633AC42E7BE17E0D5190FEFF81FF6C87C0D0E34CDDF1B075EAC0D8536DFB
提取出的 ELF 已确认:
- 开头是标准
ELF64文件头; - 包含 11 个 Program Header;
- 其中仍有9个
PT_LOAD配置载荷; - ELF 有效结束位置由最后一个安全元数据段确定为
0x220B8; - 分区剩余区域全部是
0x00填充,已从xbl_config.elf中剔除; - 完整原始分区镜像也已保留,方便还原或复核。
它与之前的旧版本不同:
旧版本大小:143,544 字节
旧版本 SHA:3C07ADF54086649A679B4D798F52D99148B975B424EC12D5B2BDD7E3ACD8C032
新版本大小:139,448 字节
新版本 SHA:5903F15B3B992126F294D3B1371557C0243FE23D855AE12976EC8CBAD5FC4A90
因此可以确认:这次确实提取到了新刷版本的 xbl_config.elf,不是之前文件的重复副本。
我是从板子当前启动槽的 xbl_config 原始分区直接读取出来的,没有通过 Android 文件系统查找,也没有修改或刷写分区。
1. 确认设备和当前槽位
D:\Tools\platform-tools\adb.exe devices -l
D:\Tools\platform-tools\adb.exe shell getprop ro.boot.slot_suffix
板子返回:
_a
说明目前使用 A 槽。
2. 查找 xbl_config 分区
D:\Tools\platform-tools\adb.exe shell "ls -l /dev/block/by-name | grep -i xbl"
结果中有:
xbl_config_a -> /dev/block/mmcblk0p3
xbl_config_b -> /dev/block/mmcblk0p4
因此当前正在使用的分区是:
/dev/block/by-name/xbl_config_a
3. 获取 root 权限
读取原始块设备通常需要 root:
D:\Tools\platform-tools\adb.exe root
D:\Tools\platform-tools\adb.exe wait-for-device
D:\Tools\platform-tools\adb.exe shell id
这里设备返回了:
uid=0(root)
4. 查询分区大小
D:\Tools\platform-tools\adb.exe shell "blockdev --getsize64 /dev/block/by-name/xbl_config_a"
返回:
237568
即完整分区大小为 237,568 字节。
5. 直接提取完整分区
执行:
D:\Tools\platform-tools\adb.exe pull ^
/dev/block/by-name/xbl_config_a ^
D:\tmp\xbl_config_a_partition.img
也可以使用 dd:
D:\Tools\platform-tools\adb.exe shell ^
"dd if=/dev/block/by-name/xbl_config_a of=/data/local/tmp/xbl_config_a_partition.img bs=4096"
D:\Tools\platform-tools\adb.exe pull ^
/data/local/tmp/xbl_config_a_partition.img ^
D:\tmp\xbl_config_a_partition.img
第一种方法更直接,而且不会在板子上留下临时文件。
这个操作只有读取:
if=/dev/block/by-name/xbl_config_a
没有向分区写入任何内容。
6. 检查是否为 ELF
检查前几个字节:
D:\Tools\platform-tools\adb.exe shell ^
"dd if=/dev/block/by-name/xbl_config_a bs=64 count=1 2>nul | od -An -tx1"
开头是:
7f 45 4c 46
对应:
\x7FELF
说明分区开头直接就是 xbl_config.elf,不存在额外的 GPT 或文件系统封装。
7. 为什么还要裁剪?
完整分区大小为:
237568 字节
但它包含:
xbl_config ELF
+
分区尾部的 0x00 填充
通过解析 ELF Header 和所有 Program Header,计算每个段的:
p_offset + p_filesz
最大的结束位置来自最后一个安全元数据段:
0x21000 + 0x10B8 = 0x220B8
换算为十进制:
0x220B8 = 139448 字节
检查 0x220B8 后面的全部内容,只有:
0x00
因此:
xbl_config_a_partition.img:完整原始分区备份xbl_config.elf:去掉分区尾部填充后的有效 ELF
8. 简化版操作
如果只想备份分区,执行下面几条就够了:
set "ADB=D:\Tools\platform-tools\adb.exe"
"%ADB%" root
"%ADB%" wait-for-device
"%ADB%" shell getprop ro.boot.slot_suffix
"%ADB%" shell "ls -l /dev/block/by-name/xbl_config*"
"%ADB%" pull /dev/block/by-name/xbl_config_a D:\tmp\xbl_config_a_partition.img
注意最后一条中的 _a 要根据当前槽位调整。如果当前槽位是 _b,则应该执行:
"%ADB%" pull /dev/block/by-name/xbl_config_b D:\tmp\xbl_config_b_partition.img
最核心的方法就是:
确认当前 A/B 槽位,通过
/dev/block/by-name/xbl_config_<slot>读取完整原始分区,再根据 ELF Program Header 的最大结束偏移去掉分区尾部填充。