十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Mstar固件拆包与重打包:mstar-bin-tool工具实战

Mstar固件拆包与重打包:mstar-bin-tool工具实战 简介一套面向Mstar芯片智能电视与机顶盒的固件编辑工具箱适用于开发人员和高级用户重点覆盖乐视设备的USB刷机、系统分区定制与调试。压缩包共41个文件、约739KB核心包含16个ini配置对应乐视不同机型的刷写、recovery、system、emmc2usb、开启UART等场景、5个Python脚本用于解包、打包、提取密钥等固件操作、5个bin与6个txt固件镜像与密钥文本另有exe、md、doc等辅助文件目录按win32、docs、configs等模块划分便于按需取用。已有1983人学习下载。借助这套工具用户可针对Mstar固件进行编辑、升级或降级定制乐视设备的recovery/系统分区并通过LETV_USB_SCRIPT脚本配合USB连接完成固件写入对于需要开启UART调试、修改启动/签名文件或制作第三方固件的技术人员包内提供的密钥与配置示例能节省大量摸索时间。整体适合有命令行经验的中高级开发者和维修工程师作为固件维护工具包使用。1. 为什么先拆 Mstar bin而不是直接刷整包第一次打开 mstar-bin-tool-master.zip 时我找的不是刷机脚本而是 unpack.py。Mstar 电视芯片的 bin 固件在拆包前是黑盒分区头长什么样、有没有 RSA 签名、AES 加密键在哪个偏移都藏在二进制里。LETV_USB_SCRIPT 目录下的 ini 才是入口——乐视各型号的强制升级参数全在这里。这个工具解决的恰恰是 “Mstar bin 如何改、怎么刷回去” 的问题unpack 拆出分区pack 按原校验重打包extract_keys 把默认密钥抽出来配合 USB 升级脚本完成离线更新。适合电视维修、固件定制和产线引导前提是你清楚 secure partition 的含义否则一个参数错误会让整包变砖。2. 工具链的边界unpack.py / pack.py / extract_keys.py 各管什么2.1 先解压别急着跑脚本mstar-bin-tool-master.zip 解压后不是编译工程而是一组 Python 脚本加配置目录。用 7-Zip 解开后第一眼看到的应该是这样的结构mstar-bin-tool-master/ ├── unpack.py ├── pack.py ├── extract_keys.py ├── secure_partition.py ├── utils.py ├── configs/ │ ├── letv-force-bin-update.ini │ ├── letv-x355pro-recovery.ini │ ├── letv-x450pro-system.ini │ ├── letv-x4-recovery-no-secure.ini │ ├── letv-x4-systemless-live.ini │ ├── letv-enable-uart.ini │ ├── letv-emmc2usb.ini │ └── LETV_USB_SCRIPT_938.ini ├── default_keys/ ├── win32/ └── docs/注意utils.cpython-37.pyc说明这套脚本跑过 Python 3.7环境上用 Python 3.7 到 3.10 一般没问题。win32/目录里装的是 Windows 32 位下的辅助可执行文件通常不是主程序而是在解析 Mstar 分区头时需要调用的外部工具。Linux 环境下如果脚本报找不到工具要把对应路径加进PATH或者修改utils.py里的依赖路径。我第一次跑的时候直接执行python3 unpack.py input.bin结果抛出参数错误。这个工具不是单命令式的“给我 bin 就解包”它依赖一个 ini 文件描述目标固件的分区布局和校验开关。所以解压后的第一件事不是找 README 里的刷机步骤而是把 configs 里的乐视相关 ini 挨个打开看。2.2 四个脚本四个不同的职责脚本职责典型输入典型输出unpack.py按 ini 分区表拆分 bin原厂 bin config ini多个分区镜像pack.py把分区重新拼回 bin分区目录 config ini可刷入的 binextract_keys.py从固件中提取默认密钥原厂 binRSA/AES 密钥文件secure_partition.py处理签名/加密逻辑分区文件 密钥带签名或加密的分区我的习惯是先看unpack.py --help因为不同 fork 的参数名差异很大。下面是比较常见的一组调用方式python3 unpack.py -i factory.bin -c configs/letv-x355pro-recovery.ini -o /tmp/letv_out python3 extract_keys.py -i factory.bin -o /tmp/keys python3 pack.py -i /tmp/letv_out -c configs/letv-x355pro-recovery.ini -k /tmp/keys -o patched.bin第一条命令把原厂 bin 按 recovery 配置拆开-i是输入固件-c指定分区布局-o是输出目录。第二条命令从固件里抽出默认密钥后续重打包要用。第三条命令用抽出来的密钥把修改过的分区目录重新拼成一个 bin。-k指向的目录里至少要有RSAupgrade_pub.txt、RSAupgrade_priv.txt这类文件否则 secure 分区无法重签。这里容易犯的错是把-o当成输出文件。unpack 的-o是目录pack 的-o才是目标 bin 文件。如果看到IsADirectoryError多半是参数语义搞反了。2.3 上手第一件事验证 bin 是否被识别Mstar bin 的头部有固定 magic不同机芯可能不同。我看固件是否被工具识别会直接读前 64 字节python3 -c data open(factory.bin, rb).read(64) print(data[:16].hex()) print(data[:8]) 正常 Mstar 固件头部会有一段 ASCII 描述比如MST开头或者出现MBoot、IMG之类的分区名。看到全零或者随机乱码时先检查 ini 里的 chip 型号对不对比如 letv-x355pro 对应 mstar938letv-x4 对应 mstar849配置选错时解出来的分区表是乱的。这一步不是可有可无。configs 里同名配置文件后缀不同letv-x355pro-recovery.ini和letv-x355pro-recovery-no-secure.ini的区别就在 secure 处理上。如果原厂 bin 是 secure 的你用了 no-secure 配置去 unpack解出来的分区可能正常但重打包后在电视上会直接停在 logo 或者反复重启。先用 hexdump 确认头部再选配置能省掉后面一整晚排错。3. LETV_USB_SCRIPT 的配置参数与 USB 刷入顺序3.1 ini 文件里的分区语义configs 目录里以.ini结尾的文件并不是给 Windows INI 解析器用的而是 mstar-bin-tool 自己的分区描述文件。以letv-force-bin-update.ini为例常见字段组织结构如下[common] chip mstar938 vendor letv secure 1 script LETV_USB_SCRIPT_938.ini [partition] mboot mboot recovery recovery system system params params[common]下面定义机芯和是否启用 secure。script指向同目录下的LETV_USB_SCRIPT_938.ini这个文件告诉工具当 USB 升级脚本运行时哪些分区需要被写入。[partition]列出 bin 内实际存在的分区名xxx是占位符unpack 时会替换成从原厂 bin 里解析到的分区名。用这个配置解包的命令是python3 unpack.py -i letv_938.bin -c configs/letv-force-bin-update.ini -o /tmp/upd_out执行后/tmp/upd_out下会出现mboot.bin、recovery.bin、system.bin之类文件。如果某个分区带_secure后缀说明它走了 secure_partition 的签名流程修改时要特别小心。需要明确一点配置文件里不是所有分区都允许修改。mboot是引导分区写错直接不开机params是环境变量分区修改后可能影响 UART 和启动参数。我只改 recovery 和 systemmboot 保持原样。3.2 recovery、system、full 配置怎么选乐视相关 ini 的后缀能直接反映用途配置文件名分区范围secure 状态适用场景letv-x355pro-recovery.inirecovery 为主开启替换原厂 recovery保留签名letv-x355pro-recovery-no-secure.inirecovery 为主关闭改开机动画或恢复模式调试letv-x355pro-system.inisystem 分区开启精简系统预装应用letv-x355pro-full.ini全分区视情况完整固件重打包letv-x4-recovery-no-secure.inirecovery关闭x4 机芯无签名校验场景letv-x4-systemless-live.ini系统增强动态不希望改变分区布局的修改实际选配置时不要只看名字。no-secure配置会跳过签名校验适合维修机上已经解除校验的设备但如果你手里的电视还是全原厂状态跳过校验反而刷不进去。正确做法是先拆原厂 bin看 unpack 时有没有输出secure partition相关日志再选对应配置。3.3 USB 脚本的实际写入步骤LETV_USB_SCRIPT 的核心是让电视从 USB 读取升级包而不是通过串口单独刷每个分区。把重打包好的 bin 放到 U 盘后整个流程是这样组织的mkdir -p /tmp/update cp patched.bin /tmp/update/letv-update.bin cp configs/LETV_USB_SCRIPT_938.ini /tmp/update/ syncU 盘需要格式化为 FAT32根目录单独放一个letv-update.binLETV_USB_SCRIPT_938.ini放在同一级目录。很多电视固件升级脚本会检查文件名和版本号不能随手命名为其他名字。电视端触发方式一般是关机状态下插入 U 盘按住机身或遥控器上的“音量减”和“电源”组合键直到屏幕出现升级进度条。不同型号组合键不一样稳妥的做法是看原厂USB_SCRIPT日志而不是去猜按键组合。我在这里踩过一个大坑把 U 盘做成 USB 3.0 启动盘后电视不识别。Mstar USB 升级逻辑对 USB 2.0 兼容性更好尽量用 USB 2.0 接口并避开多分区 U 盘。电视只认第一个分区如果 U 盘带了 EFI 分区升级包会被跳过去直接进入正常开机的桌面。3.4LETV_USB_SCRIPT_938.ini与主 ini 的关系主 ini 里的script LETV_USB_SCRIPT_938.ini指向的是电视芯片端要执行的脚本逻辑。打开这个文件通常能看到[update] count 1 target recovery,system verify secure reboot yestarget列出本次升级要写入的分区verify决定写入前是否校验 RSA 签名。如果verify secure而你的 bin 没有正确签名电视走到一半会提示升级失败并保持旧系统。这种情况下可以把主 ini 换成no-secure版本并同步把这里的verify改成none但代价是设备接收没有签名保护的固件。4. 从解包到重打包密钥、签名与 secure_partition 的配合4.1 unpack 之后你会得到什么执行 unpack 后输出目录里不只有分区镜像还会有一些元数据文件。以我的经验至少会看到/tmp/upd_out/ ├── header.bin ├── mboot.bin ├── recovery.bin ├── system.bin ├── partitions.json └── signature.binpartitions.json是工具保存的分区表快照pack 时需要参考它来重建头部。header.bin是剥离出来的 Mstar 头部数据包含 magic、分区偏移、长度和校验标志。signature.bin存在说明原厂固件带签名不改动任何字节时直接 pack 也会要求重新计算签名。此时不要急着改系统镜像。先检查partitions.json里的secure标志python3 -c import json; datajson.load(open(/tmp/upd_out/partitions.json)); print([(k,v.get(secure)) for k,v in data.items()])如果某个分区输出值是1修改后必须用对应私钥重签。mstar-bin-tool 的默认密钥都在default_keys/目录下但原厂量产固件不一定用默认密钥。遇到这种情况只能通过extract_keys.py从同一型号的原始备份中抽取。4.2 extract_keys.py 抽取的是哪一组密钥default_keys 和固件里出现的密钥文件命名很具体文件作用RSAupgrade_priv.txt升级包签名私钥RSAupgrade_pub.txt升级包签名公钥RSAimage_priv.txt镜像分区签名私钥RSAimage_pub.bin镜像分区签名公钥二进制RSAboot_priv.txt启动镜像签名私钥RSAboot_pub.bin启动镜像签名公钥二进制AESboot.bin引导分区 AES 密钥AESupgrade.bin升级包 AES 密钥extract_keys.py的作用是从一个已知的原厂 bin 里把这些密钥抽出来到指定目录python3 extract_keys.py -i factory.bin -o /tmp/letv_keys然后你会在/tmp/letv_keys下得到上面表格里的文件。关键点是升级包和镜像使用不同密钥。用RSAupgrade_priv.txt去签 recovery 分区电视会报签名无效必须先用RSAimage_priv.txt签镜像分区再用RSAupgrade_priv.txt签整个升级包。这个顺序错了在 secure 校验下每一步都会失败。4.3 secure_partition.py 在重打包路径上的位置重打包不是简单地把分区拼回去。secure_partition.py 要做三件事校验分区大小是否对齐、恢复 Mstar 头部里的分区表、对指定分区重新计算签名或加密。我用过的重打包命令是python3 pack.py -i /tmp/upd_out -c configs/letv-x355pro-full.ini -k /tmp/letv_keys -o new_letv.bin-i指向 unpack 的输出目录-c最好和 unpack 时用的配置一致-k指向 extract_keys 输出的密钥目录-o是最终生成文件。pack 期间日志里会出现几类信息signing recovery正在给 recovery 分区做 RSA 签名encrypting system正在用 AES 密钥加密 system 分区updating header checksum正在重算头部校验值如果日志里直接跳过签名检查 ini 里的secure和密钥目录里的私钥文件是否存在。secure 1但缺少RSAimage_priv.txtpack 会生成一个没有签名的镜像文件表面上成功实际刷机后签名校验必定失败。4.4 和常见误用的差别很多人会把 mstar-bin-tool 当成普通解包工具只改一个分区就用dd把镜像塞回去。这在 Mstar 平台上不可靠因为 Mstar bin 的分区表里每个分区地址都有长度和校验字段手动替换后头部没有更新电视端依然去读旧偏移。正确的做法是始终让 pack.py 基于 unpack 时的分区表信息重建头部而不是用 dd 直接覆盖。还有一种误用是修改了RSAupgrade_pub.txt替换成自己的公钥以为就能刷自定义固件。实际上公钥只影响校验不影响签名生成除非你把私钥也替换成配套的新私钥并且电视端信任的是旧公钥否则没有任何效果。要换成自己的密钥体系必须同时修改电视里的公钥存储区而这通常属于 secure boot 的另一个层面。5. 排错与验证diff 对比和升级日志定位 secure 失败5.1 最常遇到的三个报错现象原因处理方向Missing RSA image key密钥目录里没有 RSAimage 私钥重新运行 extract_keys.py确认输出包含 RSAimage_priv.txtPartition offset mismatch修改的分区比原分区大检查 system 镜像是否超过 ini 中定义的大小缩小后重跑USB upgrade file not foundU 盘文件名或目录层级不正确确认为 FAT32、单分区、文件名与脚本完全一致看到Partition offset mismatch时不要直接去改 ini 里的分区大小。Mstar 分区表是连续排列的你改大了 system就会覆盖后面的分区。合理做法是精简 system 内容或者改到 full 配置里使用独立空闲分区而不是破坏原分区布局。5.2 用 hexdump 和 diff 验证重打包结果刷机前我会拿原厂 bin 和重打包 bin 做一次头部对比。重点不是整个文件 diff而是前 256 字节和分区表部分。cmp -l (head -c 256 factory.bin) (head -c 256 new_letv.bin) | head -20如果前 20 行输出大量差异基本可以确定头部重建失败。再单独看某个分区python3 -c aopen(factory.bin,rb).read() bopen(new_letv.bin,rb).read() print(size diff:, len(a)-len(b)) 很多情况下改动后的 bin 会比原厂大因为签名块或 padding 被重新生成。只要分区表和签名通过大小差异不必担心。如果设备有串口升级时接上 TTL 看打印日志里出现verify image pass就说明 secure 流程已经走通。5.3 用 no-secure 配置缩短验证循环调试过程里反复重签很费时间我一般会在开发阶段先使用对应型号的no-secure配置验证逻辑是否正常。比如要用 x355pro 做 recovery 修改先把主配置换成letv-x355pro-recovery-no-secure.ini同时把LETV_USB_SCRIPT_938.ini里的verify改成none。这样刷机时不走 RSA 验证看到的错误就是纯逻辑或分区偏移问题而不是被签名掩盖掉。确认修改有效后再切回原厂 secure 配置重新走一遍 extract_keys 和 pack。最后在工程机上验证一次完整升级确认电视能正常进入系统后再量产。整个流程下来最关键的一课是不要相信“能解包就能打包”的说法Mstar 的紧凑分区表对偏移极端敏感每一次修改都必须回到原厂配置的框架里重新计算。本文还有配套的精品资源点击获取
返回列表