逆向单词机固件:屏驱都抠出来了,我栽在焊接上
先说结局:失败了。固件没跑起来,设备大概也被我焊坏了。
但逆向那半程是真通了。写下来,万一刚好有人需要。
起因:一块 ESP32 把我惯坏了
前段时间玩 StickS3,就是块 ESP32 开发板。刷固件、看串口,一切都顺,顺得我开始飘。
于是有了个大胆的想法:家里那台百词斩 Ace Max 单词机,能不能刷我自己写的固件?
以前看大佬逆向设备、发自制固件,觉得特别屌,但从没觉得那是自己能碰的事。现在有 AI 帮我读汇编,好像可以试试?
目标定得挺具体。芯片是杰理的一颗 WiFi SoC,外挂 16MiB SPI Flash,一块 360×240 墨水屏。我想让它开机拉一个救援热点,连上去有网页控制台,支持双分区 OTA,屏幕由我自己驱动。
逆向:这部分全通了
第一步永远是备份。整片 Flash 读出来,读三遍、哈希一致才敢信。这是唯一的退路,没有它后面一步都不该走。
然后是解密。厂商固件是加密的,密钥流还原出来之后整个镜像就摊开了:分区表、配置区、应用代码,还有尾部一段设备身份数据。那段全球唯一,刷坏了没处配,任何操作都必须绕开它。
最花功夫也最值的是墨水屏驱动。我没去猜时序。都有原厂固件了,猜是最蠢的做法。把驱动那段反汇编出来一条条读,厂商真正用的东西全在里面:
- 控制器是 UC8179,片选、数据/命令、复位、忙信号各挂在哪个 IO
- 刷新波形 LUT,不是网上抄的 Waveshare 通用表,是厂商实测调过的单相位表
- 温度补偿、VCOM 极性交替、上电到刷新的完整时序
方法上有两点值得单独说,因为都卡了我很久。
一是这颗芯片的指令集没什么现成的友好支持,跳转目标得自己算(指令地址 + 4 + 位移)。算错一个偏移,就会跟着一条假的调用链跑偏半天。
二是 LUT 根本不在代码段里。它在数据段,得从 SDRAM 的加载地址反算回文件偏移才找得到。我一开始想靠"结构化猜表"去扫,扫不出来,纯属浪费时间。
一句话:有原厂固件在手,任何参数都不该猜。
然后它不启动,而我是瞎的
刷进去,通电。屏幕没有任何变化,热点扫不到,芯片摸着温温的,像在跑,又像卡死。
三条能说话的通道,一条都没有:
- 串口:调试焊盘我够不着。后面会说到,这句是重点
- 墨水屏:它要被固件驱动起来才会显示,而"驱动它"恰恰是可能出错的那一环。屏不亮,我分不清是屏驱写错了,还是根本没跑到画屏那一步
- USB:厂商把刷写通道封了,我这版也还没实现
我改了三版。换分区布局、给刷屏加喂狗和让权、排掉低功耗休眠、核对 IO 电压档位。三版一模一样地失败。
而「一模一样地失败」这件事本身才最要命。没有任何观测手段的时候,你不是在改 bug,你是在求签。
唯一一个对的主意:拿 Flash 当串口
绝路上想明白一件事。既然没有调试通道,那就自己造一个。Flash 本来就在,那就拿它当通道。启动的每个关键节点,往一个已知的空白扇区写一个字节:
// 到达一个阶段就往 Flash 写一个标记字节,依次排开
enum {
MARK_APP_MAIN = 'A', // 进了主函数,证明 app 被加载了
MARK_WIFI_TASK = 'W', // WiFi 任务起来了
MARK_BEFORE_WIFION = 'b', // 马上要开 WiFi
MARK_AFTER_WIFION = 'a', // WiFi 开完回来了
MARK_SERVER_UP = 'S', // 网页服务起来了
};选空白扇区有个小讲究。那片区域首刷后是全 0xFF,而 NOR Flash 可以把 1 写成 0 而不必先擦除,所以写标记不会牵动整块擦写。
跑一次,把芯片拆下来读那个扇区,字节序列停在哪个字母,启动就走到哪:
- 全是空白,说明 app 根本没被加载,问题在引导,跟我的代码无关
- 只有
A,卡在任务调度 - 有
A W b没有a,死在开 WiFi 那一下,病根在板级初始化
这套探针我编好了、刷好了、校验过了。就差焊回去跑一次。
我栽在哪:焊接
那片 Flash 是焊死在板子上的。所以每验证一个假设,流程是:拆下来,夹到编程器上刷,焊回去,通电,没反应,再拆。
开发板上这一步叫「插个 USB」。在这儿,它要求我有把一颗贴片芯片反复拆焊十几次而不伤板子的手艺。
我没有。二把刀的水平,焊盘被我弄松了,现在就算刷回原厂固件也开不了机。
所以卡住我的不是那条 A W b,那玩意儿多半真能指出病根。是我手上的活儿没跟上。
留下的两条
有转接底座就一定要焊上去。我最大的教训不是代码,是那片焊死的 Flash。一个 SOP8 排线夹座,能把「拆焊一次,外加一次弄坏板子的机会」变成「插拔两秒」。没有它,任何需要反复刷写的固件活儿都是自虐。
动手前先确认你有一条能说话的通道。串口、SWD、哪怕一颗你能点亮的 LED。一个连「成没成功」都无法观测的系统,写得再对也调不出来。
逆向那套存档还在。哪天真焊了底座、手也练了,捡起来就能接着跑。
结尾
AI 确实把门槛拉低了一大截。反汇编读不懂,它帮我读;时序不会算,它帮我算。以前我只能围观大佬发固件,这回我居然自己走到了「就差焊回去跑一次」。
但也就到这儿了。大佬还是大佬,他们手上那套东西 AI 目前还替不了。
单词机现在躺在桌上。下次动手之前,我先去练焊接。
COMMENTS 留言
READING MEMORY CARD…