为吉他音箱刷入固件补丁
原标题:Patching my guitar amp's firmware
速览
本文记录了为吉他音箱设备刷入固件补丁的过程。固件更新通常用于修复已知漏洞、提升设备稳定性或增加新功能。此举有助于延长硬件使用寿命并优化使用体验。
AI 深度解读
深度解读:逆向工程 Yamaha THR10c 吉他音箱固件
背景
近年来,硬件逆向工程(Reverse Engineering)在极客和开发者社区中日益流行。本文作者是一名电子爱好者,近期对逆向工程产生了浓厚兴趣。他手中拥有一台 Yamaha THR10c 吉他音箱(Guitar Amp),在查阅该设备的官方服务手册(Service Manual)时,发现原理图中提到了 UART 接口和 JTAG 接口。
作者的主要目标是通过逆向工程手段,转储(Dump)音箱的固件,并尝试刷入经过修改的固件,以实现一些官方固件不支持的功能。具体需求包括:
- 开关扬声器模拟:希望能在不使用扬声器模拟的情况下,将音箱连接到真实的吉他扬声器或通过 TPA3118 功放模块输出。虽然官方固件支持通过 USB 发送 MIDI SysEx 命令来切换此功能,但该设置会在切换音箱模型时重置,且会导致音量显著升高。
- 耳机连接时的内部扬声器输出:希望实现当耳机接口连接外部设备(如混音器或额外扬声器)时,音箱内部扬声器仍能发声。
核心内容
硬件改造与接口识别
作者首先按照服务手册打开音箱,在主 PCB 板上定位到了两个测试点/接口:CB3 和 CB4。
-
接口识别与焊接:
- CB4:引脚间距为 2mm,确认为 JST PH 系列(型号 B4B-PH-K),用于 UART 接口。
- CB3:起初难以识别,作者排除了常见的 2mm 双排或 1mm 单排连接器。通过观察板子上其他使用 FFC(扁平柔性电缆)的类似焊盘,并注意到 JST 标记,推断其为 JST FMN 系列。由于 Mouser 缺货,作者最终使用了兼容的 Molex 52808-0870 连接器(8针反向版本)。
- 焊接过程:作者将 PCB 从外壳取出,使用吸锡器清理了过孔。由于接地引脚导热快,焊接具有一定挑战性,但最终成功安装了新连接器。为了便于后续调试,作者将连接线从音箱后部的槽口引出,以便在调试期间保持音箱组装状态。
-
UART 调试失败:
- 作者使用 USB-UART 线缆连接电脑并通电,尝试了多种常见波特率,但 TX 引脚无任何信号输出。示波器确认无活动。作者决定转向 JTAG 接口进行尝试。
JTAG 接口分析与连接
JTAG(Joint Test Action Group)是一种用于硬件测试和嵌入式处理器调试的串行接口。它主要包含四个引脚:TCK(时钟)、TMS(模式选择)、TDI(数据输入)和 TDO(数据输出),以及可选的 TRST(测试复位)。
- 硬件连接:
- 工具选择:作者选择了基于 FTDI FT2232H 芯片的 Mini Module。该芯片拥有两个多功能通道,允许同时使用 JTAG 和 UART(尽管 UART 当时未工作)。
- 引脚映射:
- CB3 接口的 8 个引脚中,大部分直接连接到主控芯片 SSP2 的标记引脚。
- 其中一个引脚经过一个与门连接到 SSP2 的 ICN 引脚,另一个输入来自 R3112N291A-TR-F 芯片(一种低压检测器,可能用于系统复位)。
- 复位引脚配置:FT2232H 的 AD0-AD3 分别对应 TCK, TDI, TDO, TMS。AD4-AD7 为通用 GPIO。作者发现未连接复位引脚会导致问题,因为 TRST 是低电平有效,且被 R17 下拉至地。为了启用 TAP 控制器,作者将 TRST 连接到 VCC,并使用 GPIO 引脚 AD4 控制 TRST,AD5 控制 SRST(系统复位),以便软件能重置控制器。
- 电源配置:按照手册,作者将 V3V3 跳线至 VIO,并将 CN3-1 跳线至 CN3-3 以使用 USB 总线供电。
软件调试与固件提取
-
OpenOCD 配置:
- 作者首先尝试了 UrJTAG,但因 TRST 引脚配置问题遇到困难,随后转向 OpenOCD。
- 通过自定义配置文件,作者成功让 OpenOCD 发现了 TAP 控制器。日志显示探测到的 JTAG ID 为
0x4f1f0f0f。
-
芯片架构确认:
- 通过搜索 JTAG ID,作者发现该 ID 常见于 NXP LPC 2xxx 系列,该系列基于 ARM7TDMI-S 核心。这证实了主控芯片 SSP2 很可能也使用了 ARM7TDMI-S 核心。
- 配置 OpenOCD 后,软件检测到 EmbeddedICE version 7,这是 ARM7 核心的调试支持接口。
-
内存读写与字节序问题:
- 作者通过 GDB 连接到 OpenOCD,成功实现了内存和寄存器的读写,以及代码单步执行。
- 字节序发现:默认的小端模式(Little-endian)不正确。通过对比逐字节读取和逐字读取的内存数据,作者确认 SSP2 使用的是大端模式(Big-endian)。
- 字节读取示例:
0x0: 0xe3 0xa0 0xf4 0x02 ... - 字读取示例:
0x0: 0xe3a0f402 ...
- 字节读取示例:
- 作者据此更新了配置文件以修正字节序设置,为后续固件提取和修改奠定了基础。
关键要点
- 接口识别技巧:在硬件逆向工程中,当标准连接器标识不明时,观察板子上其他类似封装(如 FFC 连接器)或参考芯片手册中的引脚定义是关键的破局点。
- JTAG 调试的必要性:当 UART 接口无输出或不可用时,JTAG 是获取嵌入式设备底层访问权限(如内存读写、代码执行)的有效替代方案。
- 复位引脚的重要性:在使用 JTAG 调试 ARM 等处理器时,正确配置 TRST(测试复位)和 SRST(系统复位)引脚至关重要,否则 TAP 控制器可能无法正常工作。
- 字节序(Endianness)陷阱:ARM 处理器可能支持大端或小端模式,具体取决于硬件引脚配置。在通过 GDB 或 OpenOCD 读取内存时,必须根据实际硬件配置调整字节序,否则数据解析将完全错误。
- 工具链选择:OpenOCD 相比 UrJTAG 提供了更灵活的配置选项(如通过 GPIO 控制复位引脚),更适合复杂的硬件调试场景。
意义与影响
- 延长设备生命周期与自定义化:通过逆向工程获取固件访问权限,用户可以突破厂商的功能限制,实现硬件功能的自定义(如本例中的扬声器模拟开关和音频路由修改),从而更好地满足个性化需求。
- 硬件安全研究的启示:虽然本文主要关注功能修改,但 JTAG 接口的存在及其可访问性也揭示了嵌入式设备的安全隐患。如果 JTAG 接口未通过熔丝(Fuses)禁用或加密保护,攻击者可能提取固件、分析漏洞或植入恶意代码。
- 社区知识共享的价值:此类详细的逆向工程记录(包括硬件连接图、软件配置参数、调试日志)为其他爱好者提供了宝贵的参考,降低了硬件调试的门槛,促进了开源硬件社区的发展。
- 技术栈的实用性验证:文章验证了 OpenOCD、FTDI 适配器以及 GDB 在嵌入式调试中的强大组合能力,证明了即使面对非标准接口和未知芯片,通过系统性的排查和配置,也能成功建立调试通道。
查看原文 →mforney.org
