返回首页

逆向 9S12HY64:无反汇编器修补

文章描述了无反汇编器逆向工程 9S12HY64 固件:I²C 嗅探、在 Ghidra 中签名搜索、SREC 修补以更改显示。实现了指示器仿真的工作结果。该方法适用于类似任务。

修补 9S12HY64 固件:从 I²C 到结果
Advertisement 728x90

无需反汇编修复9S12HY64固件中的静态数据

通过分析基于MC9S12HY64微控制器的汽车仪表盘的I²C通信流量,并直接修改SREC固件文件,即可实现指示器显示效果的更改。该方法完全避免了代码反汇编,转而利用Ghidra工具在静态数据中定位特征码。目标是将字符A替换为P,M替换为D,同时消除数字杂项。

硬件分析与协议

9S12HY64微控制器通过一个6针接口连接到显示屏,未使用外部驱动芯片。电路追踪和参考手册确认采用I²C协议。使用Saleae逻辑分析仪,在所有档位选择模式下捕获MCU与显示屏之间的通信数据。

流量摘要表揭示了可作为潜在特征码的变动字节:

Google AdInline article slot
  • 模式A1:5A C9 9A 8D...
  • 模式M1:5A C9 9A 8D...(首字节存在变化)

红色高亮的字节被设定为固件搜索目标,推测代表二维静态消息载荷数组。

在固件中定位特征码

使用Ghidra进行十六进制搜索,无需对HCS12架构进行反汇编。特征码0x5A, 0xC9, 0x9A, 0x8D精准定位到内存区域。消息格式为:显示字节编号 + 数据。

将通信流量与内存内容匹配:

Google AdInline article slot
  • 第一个字节标识段落(A/M)。
  • 后续字节定义字符图案。

从新仪表盘的固件中提取出P和D对应的指令:

  • P:单字节替换。
  • D:双字节修正。

消息对比:

| 模式 | 原始消息 | 目标消息 |

Google AdInline article slot

|------|----------|----------|

| 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

Advertisement 728x90

继续阅读