无需反汇编修复9S12HY64固件中的静态数据
通过分析基于MC9S12HY64微控制器的汽车仪表盘的I²C通信流量,并直接修改SREC固件文件,即可实现指示器显示效果的更改。该方法完全避免了代码反汇编,转而利用Ghidra工具在静态数据中定位特征码。目标是将字符A替换为P,M替换为D,同时消除数字杂项。
硬件分析与协议
9S12HY64微控制器通过一个6针接口连接到显示屏,未使用外部驱动芯片。电路追踪和参考手册确认采用I²C协议。使用Saleae逻辑分析仪,在所有档位选择模式下捕获MCU与显示屏之间的通信数据。
流量摘要表揭示了可作为潜在特征码的变动字节:
- 模式A1:5A C9 9A 8D...
- 模式M1:5A C9 9A 8D...(首字节存在变化)
红色高亮的字节被设定为固件搜索目标,推测代表二维静态消息载荷数组。
在固件中定位特征码
使用Ghidra进行十六进制搜索,无需对HCS12架构进行反汇编。特征码0x5A, 0xC9, 0x9A, 0x8D精准定位到内存区域。消息格式为:显示字节编号 + 数据。
将通信流量与内存内容匹配:
- 第一个字节标识段落(A/M)。
- 后续字节定义字符图案。
从新仪表盘的固件中提取出P和D对应的指令:
- P:单字节替换。
- D:双字节修正。
消息对比:
| 模式 | 原始消息 | 目标消息 |
|------|----------|----------|
| A1 | 5A C9 9A 8D... | 5A XX XX 8D... (P) |
| M1 | 5A C9 9A 8D... | 5A YY ZZ 8D... (D) |
修补SREC文件
SREC结构:头信息、地址、数据、校验和(KS)。字节修改后需重新计算校验和。
Python脚本用于KS计算:
# 示例脚本(源自GitHub)
def calc_srec_checksum(line):
# 字节求和并取反
s = sum(bytes.fromhex(line[1:-1])) # 排除S和KS
return format((~s + 1) & 0xFF, '02X')
修改操作:
- 对于P:修改某一行的第一个字节。
- 对于D:调整两行中的第一和第二字节。
重新计算KS后,生成的固件显示部分替换结果,但仍存在数字杂项。
消除数字杂项
数字(1–5)的生成方式为:第00字节 + 第12字节的半字节(基数0x80 + 数值)。在固件中搜索数字特征码,将‘4’的数据清零(保留1、2、3)。
- 格式:字节编号 – 数据。
- 修改行后重新计算KS。
最终固件实现完整的P/D模拟,且无数字干扰。
关键收获
- I²C流量嗅探 可在不分析代码的前提下定位静态数据。
- Ghidra十六进制搜索 即使面对未知架构(如HCS12)也极为有效。
- SREC修补 必须精确处理校验和以确保有效性。
- 该方法可扩展 至其他使用串行协议的嵌入式系统。
- 该流程降低风险,避免执行修改后的代码。
— Editorial Team
暂无评论。