【问题标题】:Is this Intel Hex firmware file corrupted?此 Intel Hex 固件文件是否已损坏?
【发布时间】:2020-12-27 04:45:22
【问题描述】:

我有一个Intel Hex 格式的固件文件,它属于P80C528EBA microcontroller。该微控制器为 8 位 mC,基于 80C51 架构。

下面,你可以看到文件的前 5 行:

     :llaaaattddddddcc
   1 :03800000028100FA
   2 :028003008028D3
   3 :02800B00806093
   4 :0280130080608B
   5 :01801B003232

您可能知道并且我在上面添加了 Intel Hex 格式行的结构如下:

:llaaaattddddd..............cc
|||||||||||                 CC->Checksum
|||||||||DD->Data...
|||||||TT->Record Type
|||AAAA->Address
|LL->Record Length
:->Colon

正如您在我文件的前 5 行中看到的,第 2 行的 AAAA 值是 0x8003,它等于第 1 行的 LL + AAAA (0x03 + 0x8000 )。但是这种模式对于接下来的 3 行是不正确的。例如,对于第 3 行,我们期望 0x8005 等于 0x8003 + 0x02(AAAA + LL 第 2 行),但令人惊讶的是我们有 0x800B。我在这个文件中有大约 10 行错误的模式(大约有 2000 行)。

问题:这是否意味着文件已损坏并且某些行被删除?还是可以在 Intel Hex 格式的行之间留一些空洞(如上)?

【问题讨论】:

  • 工具在转换为十六进制之前显示什么?你有什么文件格式选项。其余数据很可能被假定为零或全为 1。
  • 请展示一个最小的完整示例、最小的源代码、用于生成某些输出的工具以及用于将其转换为 hex 文件的工具。当您将中间文件与 hex 文件等进行比较时所看到的,或者可能是什么工具使用了这个 hex 文件等......
  • intel hex 格式与此处无关,它只是一种表示与地址相关的数据的方式,重要的是生成它的工具和为用例使用它的工具。 “intel hex 文件格式”只是表示地址和数据的一种方式,它对于您可以用它表示什么或如何表示没有更大的规则,该格式不控制行外或行间发生的事情(除了地址如何可以扩展,但这里不相关)。
  • 对任意数量的能够解释 HEX 格式的阅读器进行快速检查会告诉您该文件在内部是一致的。

标签: microcontroller intel disassembly firmware


【解决方案1】:

文件没有损坏,所有校验和都正确。

我唯一期望的是文件结束记录

:00000001FF

但正如您所说,该文件比您显示的摘录要长得多。

不管怎样,Intelhex 文件有间隙是完全可以的。

此外,记录不必按顺序排列。

如果你反汇编机器码,你会得到

C8000:  ljmp    C8100
C8003:  sjmp    C802D
C800B:  sjmp    C806D
C8013:  sjmp    C8075
C801B:  reti

您正在查看重置和中断例程开始的位置。

【讨论】:

  • 太棒了!谢谢你。你能告诉我你用什么工具来拆卸它吗?我想反汇编整个文件。
  • 这是我多年前写的一个表驱动反汇编器。您使用的是哪个操作系统?
  • 我有 Linux 和 Windows。
  • 反正固件开头有多个连续的sjmp、ljmp跳转指令有什么意义呢?
  • 因为几年来一直错过为我的主页寻找新提供商的时间,所以只剩下一些镜像,for example this one。代码又旧又坏,现在可能需要一些按摩才能编译。 -- 不管怎样,Ghidra 看起来应该可以拆卸,但我从未尝试过。
猜你喜欢
  • 2019-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-25
相关资源
最近更新 更多