方法 1 展开 · MDZ-26-AA / 小米盒子 4S Pro · S905X3

在 U-Boot 里让芯片
自己解密,再把明文抄出来

不硬解加密文件。思路只有一句:正常启动时芯片本来就会把 boot 解密到内存——你要在它解密完、还没跳进内核之前,用 U 盘或网线把那段内存原样搬回电脑。

目标分区/dev/block/mmcblk0p11
大小 / 偏移16 MB · 0x2FC00000
扇区起止(512B)起始 0x17E000 · 共 0x8000 扇区
难度 / 时间★★★★☆ · 拆机后约 1–2 小时
前置状态能进 U-Boot 命令行才成立

⚠️ 先把预期说清

取出来的是解密后的 boot 镜像 / 内核,不是 eFuse 里的密钥。密钥永远不出芯片。如果这台的 U-Boot 命令行被锁、串口被关,这条路当场不通——先用第 4 步的 10 分钟验证它,不要先买一堆东西。文中主板与模块照片全部是网上实拆帖的真实照片并注明了来源(见图 2、图 3),不再用自画示意图冒充实物。但照片只能帮你认位置:焊盘顺序必须以你手里那块板子的丝印 + 万用表实测为准,照片方向一转左右就反了,不能照着照片猜顺序焊。

FIGURE 01 — PRINCIPLE

原理:一张图看懂全过程

eMMC 里的 boot 是 AML Secure Boot 加密的 blob,在电脑上直接打开算不开。BootROM / BL2 / BL31 在启动链里用 eFuse 密钥把它解开,放进 DDR 内存。U-Boot(BL33)正好处在“已解密、未执行完”的窗口期。

eMMC p11加密 boot.img16 MB · AMLSECU 芯片自己解密BootROM + BL31密钥只在 eFuse 里用 DDR 内存 ★明文 boot / Kernel Image你在这里拦截U-Boot 命令行窗口 U 盘 / TFTPfatwritetftpput 电脑验魔数拆 kernel
图 1 · 核心窗口在 DDR:不在文件上破解,而是截住芯片解密后的内存副本。错过这个窗口、内核一旦跑起来,U-Boot 就回不来了,只能断电重来。
1 拆机找到 UART 焊盘
2 接 TTL3.3V · 交叉 TX/RX
3 打断启动进 U-Boot shell
4 读 + 解密imgread / bootm 分步
5 导出内存U 盘优先,网线备选
6 电脑验证看 ANDROID! / Image 魔数
01 — SHOPPING & PREP

你需要准备什么东西

分四组:必备的先买齐,二选一的导出介质选一种就行。价格是国内电商常见区间,只作预算参考,下单时看实价。

串口与拆机 必备

  • USB 转 TTL 模块 ×1芯片选 CP2102 / FT232 / CH340 均可,必须能切到 3.3V 电平。不要买 RS232 电平的、不要用 5V 档。约 ¥10–30
  • 杜邦线 母对母 / 母对公 ×4至少 GND、TX、RX 三根;多备一根。线别太长,30 cm 内信号更稳。
  • 撬棒 + 螺丝刀套装塑料撬片(别用金属硬撬卡扣)、小十字 / 梅花。拆前先拍照记录螺丝位置。
  • 万用表 ×1用来在那组 3 脚焊盘里通断验出 GND、复核 TX/RX。没有它不要靠猜焊盘。
  • 电烙铁 + 细焊锡 + 助焊剂焊盘很小,用尖头烙铁、低温点焊;没把握就用测试钩 / 探针顶住,不必飞线焊死。已有可跳过

导出介质 二选一即可

  • 方案 A(推荐):U 盘 ×18 GB 以上,提前格成 FAT32、MBR 分区表,根目录保持空。U-Boot 的 fatwrite 只认这一套,exFAT / NTFS 大概率不认。
  • 方案 B:网线 + 路由器盒子网口接回路由器/交换机,电脑同网段,电脑上开 TFTP 服务端。适合 U 盘驱动不认时用。
  • 兜底:串口日志本身实在不行可用 md.b 把数据打进串口日志再拼文件——16 MB 会非常慢,只作最后手段,不用提前准备。

电脑与软件 必备

  • 一台 Windows 或 Linux 电脑装好 TTL 驱动(CP210x / CH341 驱动按芯片下官方版),设备管理器 / ls /dev/ttyUSB* 能看到串口号。
  • 串口终端软件Windows:PuTTY / MobaXterm;Mac/Linux:screen / minicom。关键是要能保存完整日志到文件。
  • 十六进制查看器HxD(Windows)或 xxd(Linux/Mac),用来验文件头魔数。
  • 拆包工具(验完再用)Python 3 + binwalk 或 Android Image Kitchen / magiskboot,用来从明文 boot 里拆 kernel 与 ramdisk。

供电与杂项 建议

  • 盒子原装电源适配器全程用原装电源给盒子供电。TTL 模块的 VCC 脚不接盒子,只借 GND 共地,接法见第 3 节图 3 与逐根文字说明。
  • HDMI 线 + 显示器/电视串口没输出时靠屏幕判断它到底卡在哪一步启动,两边一起看不抓瞎。
  • 手机(拍照记录)拆机前、拆开后、接线后各拍一张;焊盘丝印看不清时放大拍,比事后回忆可靠。
  • 标签纸 / 记号笔在杜邦线两头标 TX / RX / GND,接错交叉线是新手第一大坑。
下单前先做一个零成本验证:先借 / 用手头任意 TTL 模块接上(第 3–5 步),确认串口有日志且能打断进 U-Boot,再决定要不要买烙铁、测试钩这些。进不去 U-Boot,后面全套都用不上。
02 — OPEN & LOCATE UART

拆机:找到串口焊盘

1

断电拆壳

拔掉电源和 HDMI。沿底壳缝隙用塑料撬片走一圈解开卡扣,取下底盖。主板上的螺丝拆下后单独放好。全程断电操作,直到接线确认完才第一次上电。

2

认 UART 焊盘:实测是未焊接的 3 脚位,不是 4 脚

先纠正旧版的猜法:之前按其他盒子的通用经验写的“3–4 个焊盘、GND / TX / RX / VCC 四脚排法”对这台是错的,已经删掉。ZNDS《小米盒子 4S Pro TTL 调试》帖作者实测:这块主板上有一个未焊接的 3 脚焊盘位就是 TTL,接上后能进 U-Boot——只有 3 个脚,没有第 4 个 VCC 焊盘,板子靠自己的电源供电。下面两张都是真实照片,不是示意图。

小米盒子 4S Pro MDZ-26-AA 主板实拍全图,蓝色主板,中央屏蔽框内可见 S905X3 芯片与存储芯片,下方是 HDMI、USB 与电源接口
图 2a · 主板实拍全图:板号 DKTB-M23-S905X3-AB(板子顶部边缘丝印),屏蔽框内中间就是带 Amlogic 标记的 S905X3 芯片。先用这张对版型:板号或布局对不上的,不是同一块板,别往下套。
来源:ZNDS《小米盒子 4S Pro MDZ-26-AA 全网首拆》主板实拍。
TTL 焊盘特写实拍:J200 位号旁并排的 3 个未焊接焊盘,原帖作者用红字标注 GND、TX、RX,周围可见 C238、C239 丝印
图 2b · TTL 焊盘特写(原帖实拍):位号 J200 旁并排的 3 个焊盘,原帖作者用红字标了 GND / TX / RX,旁边是 C238 / C239 的丝印框。注意照片方向:这张照片里的板子是倒着拍的,丝印都是反的——你把自己那块板转个方向,左右立刻就反了。所以不要背“左边是 GND”这种顺序,要对着 J200 位号和你实物当时的方向核对,再按下一步用万用表定 GND。
来源:ZNDS《小米盒子 4S Pro TTL 调试》作者实测帖。
3

丝印看不清时,用万用表定这 3 个脚

这组只有 3 个脚,要定的就是哪个是 GND、剩下两个谁是 TX / 谁是 RX:
GND:通断档,一表笔点 HDMI/USB 金属外壳(地),另一表笔逐个点这 3 个焊盘,响的那个是 GND。这一步不靠照片、不靠左右位置。
TX / RX:剩下两个就是它俩。TX 在上电启动时电平会跳变、主动往外发日志;RX 基本静默。实操上先按原帖标注试接,看不到日志就把 TX/RX 两根对调——接反只是没字,不会烧。
没有 VCC 要找:旧版让你在这组焊盘里找一个“3.3V VCC 脚”是错的。注意 TX 空闲时本身就接近 3.3V,别把 TX 误认成供电脚,更不要往任何一个焊盘上灌电源。

03 — WIRING

接线:只接三根,VCC 不接

旧版这里是一张自画的接线示意图,已经删掉——接错线是真会烧板的,这种图不能靠画。下面是真实模块照片,接法用文字逐根写清;模块上的脚名以你手里那块模块自己的丝印为准,不同批次模块的针脚排列并不一样。

CH340 USB 转 TTL 模块实物照片:红色小板,黑色 CH340C 芯片,板上印有 USB TO TTL 字样,右侧排针旁丝印依次标着 DTR、RXI、TXO、VCC、CTS、GND
图 3 · CH340 USB 转 TTL 模块实物(真实照片):芯片上印着 CH340C,排针旁的丝印能直接读到 RXI / TXO / VCC / GND——你实际接的只有 RXI、TXO、GND 三根,VCC 那根针空着不接。你买的模块若是 CP2102 / FT232 或不同版式的 CH340,针脚顺序以那块板自己的丝印为准,不要照这张照片数针脚位置。
来源:Banggood 在售 CH340 USB 转 TTL 模块商品实拍图(经 Electronic Pro 商品页引用同款模块照片)。

逐根接法(文字版,对着图 2b 的 3 脚焊盘接)

两个最常见的烧板原因:① TTL 模块跳线帽在 5V 档就往 3.3V 焊盘上接;② 把 VCC 也接上、与盒子自身供电对冲。接线后、上电前,用万用表再量一遍模块 TX/RX 对地是不是 3.3V 逻辑电平。

串口参数(终端里这样设)

115200波特率 Baud
8数据位 Data bits
None / 1校验 None · 停止位 1
None流控 Flow control 关
# Linux / Mac 示例(串口号按实际改)
screen /dev/ttyUSB0 115200
# 或
minicom -D /dev/ttyUSB0 -b 115200

# Windows:PuTTY → Connection type 选 Serial
# Serial line 填 COM 口(如 COM3),Speed 填 115200,其余默认
# 连上后立刻开日志:PuTTY → Logging → All session output,存一个 .log 文件
04 — ENTER U-BOOT

上电打断:进 U-Boot 命令行

1

先开终端,再给盒子上电

顺序反了会错过开头日志。终端连好、日志记录打开,然后插盒子电源。正常的话串口会立刻刷出启动日志:DDR 初始化、BL 系列、U-Boot 版本、Hit any key to stop autoboot 之类的倒计时提示。

2

在倒计时内狂按回车 / 空格打断

看到倒计时就连续敲 Enter(部分版本是任意键 / 空格)。成功后提示符会停住,类似 mdz-26-aa# 或 g12a# ——这一步成功,这条路就成立了一大半。

3

先只看,不改:跑三条只读命令存档

这三条都是只读查看,先把输出连同整个串口日志保存好。后面命令叫法对不上时,全靠这份 help 输出现场查。

help          # 列出这台 U-Boot 到底支持哪些命令(重点找 imgread / store / fatwrite / tftpput)
printenv      # 看启动变量(重点记:bootcmd、loadaddr、kernel_addr_r、boot_part 的值)
bdinfo        # 看内存范围,确认后面用的装载地址在 DDR 范围内
红线动作(在本指南里全程不做):saveenv、mmc write、mmc erase、nand write、改 bootcmd 后保存。这些是“写”的动作,与导出无关。万一手滑输了改 env 的命令但没执行 saveenv,直接断电重启即可恢复。
到这里先停一下自检:串口有日志 ✔ 能打断 ✔ 出现命令提示符 ✔ —— 三项全中才继续。进不去(倒计时不出现 / 按键无反应 / 提示符要求密码)说明这台的 U-Boot 被锁,方法 1 到此为止,转故障排查表看说明。
05 — READ, DECRYPT & EXPORT

读 boot、让它解密、把内存搬出来

先记住这台的三个数,后面每条命令都从它们推出来:

0x17E000起始扇区 = 0x2FC00000 ÷ 512
0x8000扇区数 = 16 MB ÷ 512
0x10000000示例装载地址(须在 bdinfo 的 DDR 内,冲突就换)
0x1000000长度 = 16 MB
A

把加密 boot 原样读进内存(对照组)

先读一份加密版垫底:一是确认 mmc read 的扇区数没算错,二是后面解密失败时能对比文件头。

mmc dev 0
mmc info
mmc read 0x10000000 0x17e000 0x8000
md.b 0x10000000 0x40     # 看前 64 字节:这是加密 blob 的样子,记下来作对照
B

触发解密 —— 按你 help 里有的命令选一条路

Amlogic 的 U-Boot 版本差异很大,没有一条命令保证每台都叫这个名。按下面顺序试,哪条存在用哪条:

路线 B1(首选):imgread —— 专门按分区名读并解密

imgread kernel boot 0x10000000
md.b 0x10000000 0x100    # 解密成功的话,这里应能看到 ANDROID! 字样或规整的 boot 头

路线 B2:bootm 分步执行 —— 只走到装载,不跳转

bootm 一个词是“解密+装载+跳进去执行”全套;拆成子命令就能停在执行前。地址变量以你 printenv 里实际的为准。

mmc read 0x10000000 0x17e000 0x8000
bootm start 0x10000000
bootm loados
# 到此为止!不要输 bootm go、不要输 bootm(全量),那会直接跳进内核、窗口关闭
printenv kernel_addr_r    # 内核被展开到的地址通常记在这里(没有就看 loados 的输出日志)
md.b ${kernel_addr_r} 0x100

路线 B3:store 命令(部分 Amlogic 定制版)

store read boot 0x10000000 0 0x1000000
md.b 0x10000000 0x100
怎么判断解密成功?看 md.b 输出:出现 ASCII 的 ANDROID!(boot 头),或下一步导出的文件在电脑上能被 magiskboot / binwalk 认出结构,就是成功。如果文件头和 A 步加密版一模一样,说明这条命令只做了“读”没做“解密”,换下一条路线,别反复试同一条。
C

导出内存 —— 选一个通道

U 盘提前插好(FAT32 / MBR)。把解密后的起始地址替换成 B 步确认的那个地址:

usb start
usb storage
fatwrite usb 0:1 0x10000000 boot_plain.bin 0x1000000
# 语法:fatwrite <接口> <设备:分区> <内存地址> <文件名> <字节数>
fatls usb 0:1    # 确认文件在、大小对,再拔盘

电脑先开 TFTP 服务端并记下电脑 IP;盒子接网线。地址按你局域网实际改:

setenv ipaddr 192.168.1.50        # 盒子的临时 IP(只设内存变量,不 saveenv)
setenv serverip 192.168.1.100     # 电脑(TFTP 服务端)的 IP
ping ${serverip}                  # 先通再传
tftpput 0x10000000 0x1000000 boot_plain.bin

若 help 里没有 tftpput 只有 tftpboot(那是下载方向),这条路不通,回 U 盘方案。

导整段 16 MB 最省事。解密后的 boot 在内存里可能被展开成“boot 头 + kernel + ramdisk”的布局,也可能内核被单独展开到 kernel_addr_r。不确定布局时:① 先按 B 步起始地址导满 16 MB;② 再把 kernel_addr_r 起始的 16 MB 也导一份(改个文件名),回电脑后两个都验,总有一个是对的。多导一份只是多花两分钟,比少导了再拆机重来便宜得多。

06 — VERIFY ON PC

回电脑:验明文、拆 kernel

1

先看大小和文件头

大小应为 16,777,216 字节(导少了先怀疑 fatwrite 的字节数写错)。再看头 64 字节:

# Linux / Mac
ls -l boot_plain.bin
xxd boot_plain.bin | head -5
file boot_plain.bin

看到 ANDROID! 开头 = 完整的明文 boot.img;如果开头 4 字节是 41 4D 52 64(ARMd,即 0x644D5241)= 你导到的是裸的 ARM64 Kernel Image 本身,也算成功,只是少了 boot 头包装。

2

从 boot 里拆出 kernel

# magiskboot(各平台都有单文件版)
magiskboot unpack boot_plain.bin
# 产物:kernel(多为 gzip/lz4 压缩的 Image)、ramdisk.cpio、dtb 等
magiskboot decompress kernel kernel.raw   # 按它提示的格式解压
xxd kernel.raw | head -3                  # ARM64 Image 头:前几字节后应见 ARMd 魔数

拆不开、报 unknown format,多半是导出的仍是加密版——回第 5 步换 B 路线重导,不要在电脑端硬解。

3

收尾装回

拔掉 TTL 线(或至少拔 GND 之外两根信号线并绝缘包好,别让裸线头在壳内短路),按拆机照片原样装回底壳。正常上电进系统,确认盒子功能无异常——本指南全程只读内存和闪存,正常情况下系统应与拆机前完全一致。

你最终得到的东西:一份明文 boot.img + 从中拆出的 kernel(可继续用 vmlinux-to-elf / Ghidra 分析)。你没有得到的东西:eFuse 密钥本身——以后每换一个分区 / 固件版本,都得重复这套“让芯片解一次”的流程,不能在电脑上离线解密新固件。
07 — TROUBLESHOOTING

故障排查:现象 → 原因 → 怎么办

现象最可能的原因怎么办
串口全程无任何输出TX/RX 接反、GND 没共地、串口号选错,或焊盘找错先调换 TX/RX 再试;确认终端串口号;万用表复查 GND;HDMI 看盒子是否正常启动(排除盒子没上电)
输出是乱码 / 花屏字波特率不对,或 TTL 在 5V 档信号畸变确认 115200 8N1、流控关;模块切回 3.3V;杜邦线缩短、远离电源线
有日志但按键打不断,直接进系统按键窗口极短、或 RX 线没通(你发的键没送到)上电前就按住回车连打;查 RX 方向接线;换空格键试;确认终端没有开本地回显假象
进了提示符,但 help 里没有 imgread / store / fatwrite这版 U-Boot 是精简/定制版走 B2 的 bootm 分步路线;导出改看有没有 tftpput;都没有就只剩 md.b 串口慢速导出了
导出文件头和加密版完全一样用的命令只读没解密换 B 路线(imgread ↔ bootm 分步互换);注意 bootm 路线要导 kernel_addr_r 那段,不是原始装载段
fatwrite 报错 / U 盘不识别分区格式不对(exFAT/GPT 最常见)重格为 FAT32 + MBR;换小容量 U 盘;换盒子的另一个 USB 口;usb start 后先 usb storage 确认认到了再写
提示符直接没有 / 要求密码 / autoboot 无倒计时U-Boot 命令行被厂商锁掉方法 1 在这台上不成立,别在串口上反复试密码。回退到“等 root 后读内存”那条线,或先用 BSP 编译的明文内核作近似参考

关键参数速记:p11 0x2FC00000 扇区 0x17E000 + 0x8000 115200 8N1 TX↔RX 交叉 VCC 不接 不 saveenv

适用机型:小米盒子 4S Pro(MDZ-26-AA,S905X3)。其他型号的分区号、焊盘位置、U-Boot 命令集都可能不同,套用前先用 ls by-name / printenv / help 在自己那台上核对。图 2a 来源:ZNDS《小米盒子 4S Pro MDZ-26-AA 全网首拆》;图 2b 来源:ZNDS《小米盒子 4S Pro TTL 调试》(作者实测 3 脚 TTL 焊盘,接上可进 U-Boot);图 3 为 CH340 USB 转 TTL 模块商品实拍。图 1 为原理流程说明(文字流程,非实物)。照片仅供认版型与焊盘位置,TX/RX/GND 的最终判定以自己板子的丝印与万用表实测为准。