如何使用 SPI 转储闪存?

逆向工程 硬件 尖峰
2021-06-11 02:08:18

闪存通常通过 SPI(串行外设接口总线)连接到处理单元,如 ARM 内核或微控制器。

  • 如何转储内存?
  • 能不能有保护机制?
  • 有什么陷阱要避免吗?
1个回答

尽管我认为这些问题太广泛了,并且我同意 @cb88 的观点,即数据表应该为您提供所有您需要知道的信息,但我会尝试回答一些问题。

如何转储内存

  1. 拆焊

    第一种选择是从板上拆焊芯片。完成后,您有 2 个选择

    • 使用支持您的芯片的芯片编程器(例如Dataman)读取芯片($$$ 昂贵的解决方案)。
    • 或者使用廉价的基于微控制器的解决方案,如Bus PirateArdunio或编写自己的转储程序(通常不太难)。
  2. 在电路中

    当您不能或不想移除芯片时,您还有两种选择。

    • 第一个是再次使用专业程序员或上面提到的基于微控制器的廉价程序。这种方法肯定存在一些缺陷,我将在回答您的第三个问题时进行描述
    • 或者,您可以监控 SPI 线路并使用逻辑分析仪或微控制器来解码信号。缺点是您无法控制正在读取的地址,因此您必须以某种方式为 SPI 闪存生成活动,然后根据正在访问的地址重建闪存映像。

您还可以使用设计用于将分析仪连接到系统内芯片夹子

一般来说,我真的建议拆焊芯片。它们几乎是边缘封装(例如在封装外部具有清晰可见的引脚)而不是球栅阵列(BGA) 封装。这使它们易于拆卸,也易于放回原处。它将为您省去我在下面的陷阱部分中描述的可能遇到的麻烦。

保护机制

  • OTP 存储器其中一些芯片可以包括一次性可编程 (OTP) 存储器,它们在其中存储保护位。我只看到这被用于锁定区域以防止写入,而不是用于读取。否则,拥有闪存的意义何在?

  • 加密我从未见过,也无法快速找到任何提供加密的 SPI 闪存芯片。这通常是在片上系统 (SoC) 端的内存控制器中实现的,该控制器可以即时执行,保持对主机 CPU 的良好和透明。

要避免的陷阱

要记住的一些事情;

  • 在尝试转储内存同时保持设备在线时,我几乎没有什么好的经验。这可能会出错的原因有很多。
    1. 主机处理器在运行自己的程序时让 SPI Flash 保持忙碌
    2. 主机端的看门狗重置电路板,因为它的外围设备由于您访问它而变得无法访问太长时间
    3. 当您选择自己为芯片供电时,如果同一电源轨上有多个组件,您的编程器/阅读器可能无法提供足够的电流
  • 如果您正在编写自己的嗅探器,请确保它可以足够快地对信号进行采样。例如,总线盗版在所有情况下都会失败,因为它只能在最大 ~32MHz 采样,其中 SPI 闪存的分配从 40+MHz 开始。所以你至少需要两倍的目标速度(采样定理

    闪存设备可以以高达 100+MHz 的各种速度工作,这与它们所处的各种模式(正常读取、快速读取、双读取、四读取等)有关。这种模式不仅会改变速度,而且数据传输的方式。例如,在四读模式下,闪存使用 SI/SO/WP/Hold 信号一次输出 4 位,而不是“经典”模式,在“经典”模式中,您每个时钟周期从 SO(串行输出)读出 1 位。

  • 充当主机时,请确保提供足够的电源并且信号在正确的时间处于高/低状态。所有这些信息都可以在闪存芯片的数据表中找到。