不硬解加密文件。思路只有一句:正常启动时芯片本来就会把 boot 解密到内存——你要在它解密完、还没跳进内核之前,用 U 盘或网线把那段内存原样搬回电脑。
取出来的是解密后的 boot 镜像 / 内核,不是 eFuse 里的密钥。密钥永远不出芯片。如果这台的 U-Boot 命令行被锁、串口被关,这条路当场不通——先用第 4 步的 10 分钟验证它,不要先买一堆东西。文中主板与模块照片全部是网上实拆帖的真实照片并注明了来源(见图 2、图 3),不再用自画示意图冒充实物。但照片只能帮你认位置:焊盘顺序必须以你手里那块板子的丝印 + 万用表实测为准,照片方向一转左右就反了,不能照着照片猜顺序焊。
eMMC 里的 boot 是 AML Secure Boot 加密的 blob,在电脑上直接打开算不开。BootROM / BL2 / BL31 在启动链里用 eFuse 密钥把它解开,放进 DDR 内存。U-Boot(BL33)正好处在“已解密、未执行完”的窗口期。
分四组:必备的先买齐,二选一的导出介质选一种就行。价格是国内电商常见区间,只作预算参考,下单时看实价。
md.b 把数据打进串口日志再拼文件——16 MB 会非常慢,只作最后手段,不用提前准备。ls /dev/ttyUSB* 能看到串口号。screen / minicom。关键是要能保存完整日志到文件。xxd(Linux/Mac),用来验文件头魔数。binwalk 或 Android Image Kitchen / magiskboot,用来从明文 boot 里拆 kernel 与 ramdisk。拔掉电源和 HDMI。沿底壳缝隙用塑料撬片走一圈解开卡扣,取下底盖。主板上的螺丝拆下后单独放好。全程断电操作,直到接线确认完才第一次上电。
先纠正旧版的猜法:之前按其他盒子的通用经验写的“3–4 个焊盘、GND / TX / RX / VCC 四脚排法”对这台是错的,已经删掉。ZNDS《小米盒子 4S Pro TTL 调试》帖作者实测:这块主板上有一个未焊接的 3 脚焊盘位就是 TTL,接上后能进 U-Boot——只有 3 个脚,没有第 4 个 VCC 焊盘,板子靠自己的电源供电。下面两张都是真实照片,不是示意图。
这组只有 3 个脚,要定的就是哪个是 GND、剩下两个谁是 TX / 谁是 RX:
GND:通断档,一表笔点 HDMI/USB 金属外壳(地),另一表笔逐个点这 3 个焊盘,响的那个是 GND。这一步不靠照片、不靠左右位置。
TX / RX:剩下两个就是它俩。TX 在上电启动时电平会跳变、主动往外发日志;RX 基本静默。实操上先按原帖标注试接,看不到日志就把 TX/RX 两根对调——接反只是没字,不会烧。
没有 VCC 要找:旧版让你在这组焊盘里找一个“3.3V VCC 脚”是错的。注意 TX 空闲时本身就接近 3.3V,别把 TX 误认成供电脚,更不要往任何一个焊盘上灌电源。
旧版这里是一张自画的接线示意图,已经删掉——接错线是真会烧板的,这种图不能靠画。下面是真实模块照片,接法用文字逐根写清;模块上的脚名以你手里那块模块自己的丝印为准,不同批次模块的针脚排列并不一样。
# 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 文件
顺序反了会错过开头日志。终端连好、日志记录打开,然后插盒子电源。正常的话串口会立刻刷出启动日志:DDR 初始化、BL 系列、U-Boot 版本、Hit any key to stop autoboot 之类的倒计时提示。
看到倒计时就连续敲 Enter(部分版本是任意键 / 空格)。成功后提示符会停住,类似 mdz-26-aa# 或 g12a# ——这一步成功,这条路就成立了一大半。
这三条都是只读查看,先把输出连同整个串口日志保存好。后面命令叫法对不上时,全靠这份 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,直接断电重启即可恢复。先记住这台的三个数,后面每条命令都从它们推出来:
先读一份加密版垫底:一是确认 mmc read 的扇区数没算错,二是后面解密失败时能对比文件头。
mmc dev 0 mmc info mmc read 0x10000000 0x17e000 0x8000 md.b 0x10000000 0x40 # 看前 64 字节:这是加密 blob 的样子,记下来作对照
Amlogic 的 U-Boot 版本差异很大,没有一条命令保证每台都叫这个名。按下面顺序试,哪条存在用哪条:
imgread kernel boot 0x10000000 md.b 0x10000000 0x100 # 解密成功的话,这里应能看到 ANDROID! 字样或规整的 boot 头
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} 0x100store read boot 0x10000000 0 0x1000000 md.b 0x10000000 0x100
md.b 输出:出现 ASCII 的 ANDROID!(boot 头),或下一步导出的文件在电脑上能被 magiskboot / binwalk 认出结构,就是成功。如果文件头和 A 步加密版一模一样,说明这条命令只做了“读”没做“解密”,换下一条路线,别反复试同一条。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 也导一份(改个文件名),回电脑后两个都验,总有一个是对的。多导一份只是多花两分钟,比少导了再拆机重来便宜得多。
大小应为 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 头包装。
# 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 路线重导,不要在电脑端硬解。
拔掉 TTL 线(或至少拔 GND 之外两根信号线并绝缘包好,别让裸线头在壳内短路),按拆机照片原样装回底壳。正常上电进系统,确认盒子功能无异常——本指南全程只读内存和闪存,正常情况下系统应与拆机前完全一致。
| 现象 | 最可能的原因 | 怎么办 |
|---|---|---|
| 串口全程无任何输出 | 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 的最终判定以自己板子的丝印与万用表实测为准。