当前位置:首页 > 知识

解包工具payload

第一次用payload解包,解包是工具帮朋友恢复一台变砖的安卓平板。他刷机刷到一半断电,解包开机卡在logo,工具Recovery也进不去。解包我翻出payload.bin,工具用payload-dumper-go跑了一遍,解包三分钟不到,工具boot.img、解包system.img全出来了。工具那一刻我才意识到,解包这玩意儿比传统的工具fastboot刷机包省事太多。

payload.bin是解包Android OTA更新包里的一种封装格式。Google从Android 8.0开始推A/B分区更新,工具OTA包不再是解包简单的zip里塞几个img文件,而是把所有分区镜像打包进一个payload.bin,再用一套差分算法做增量更新。好处是更新体积小、刷写原子化,坏处是——你想单独提取某个分区,直接解压zip是拿不到的。

Payload解包工具就是干这个的。核心原理不复杂:payload.bin内部有manifest描述每个分区的偏移、大小、哈希值,工具读取manifest,按偏移把对应数据切出来,再根据操作类型(REPLACE、REPLACE_BZ、REPLACE_XZ、ZERO、DISCARD)做相应处理,最终输出可挂载或可刷写的img文件。

常用的工具有几个。payload-dumper-go是Go写的,单文件,跨平台,命令行参数简单,我平时首选。Python版的payload_dumper功能更全,支持增量包合并,但依赖装起来麻烦。还有人在Windows上套了个GUI壳,叫Payload Dumper GUI,适合不碰命令行的用户。

实际用的时候有几个坑。增量OTA包(incremental OTA)不能单独解包,必须配合原厂全量包做合并,否则manifest里的源分区哈希对不上,工具直接报错退出。另外,部分厂商会在payload.bin里加自己的签名校验,第三方工具解出来的img可能刷不进去,得先过dm-verity或avb校验。我遇到过一台一加,解出的boot.img刷回去直接红字警告,后来用Magisk修补后才正常。

命令层面,payload-dumper-go的用法基本是这样:

payload-dumper-go -o output_dir payload.bin

想只解某个分区,加-p boot就行。Python版则是:

python payload_dumper.py payload.bin

输出目录里会按分区名生成img文件,直接fastboot flash对应分区即可。

还有个小技巧。解包前先看manifest里的分区列表,确认目标分区是否存在。有些OTA包不包含vendor、product这些分区,因为它们在A/B更新里走的是动态分区映射,payload里只放super.img的差分数据。这时候你解出来的super.img还得再用lpunpack拆一次,才能拿到具体的逻辑分区。

我自己的习惯是,拿到任何payload.bin先跑一遍--list或-l,把分区名和大小列出来,心里有数再动手。别小看这一步,曾经有人直接解包一个20GB的payload,结果磁盘空间不够,解到一半进程被杀,输出目录里全是半截文件,还得重来。

工具本身不复杂,但用对了能省很多事。尤其是做ROM定制、系统修复、安全分析的时候,payload解包几乎是绕不开的一环。掌握它,等于多了一把打开Android系统镜像的钥匙。

分享到: