如何从硬件设备中提取未知固件的副本?

逆向工程 硬件 固件
2021-06-17 01:45:50

感谢这是一个广泛的问题,但尽管谷歌搜索了好几天,我还没有找到关于如何从硬件“捕获”或复制未知固件的一般原则的直接解释。

我收集到,一旦你有了它,你就可以开始使用各种工具来分析它,但我首先想了解的是如何获得它。

据我了解,您需要通过 JTAG 或 UART 连接连接到它,之后我有点迷茫。

2个回答

您可能会怀疑,这在很大程度上取决于硬件。一般来说,您是对的,通常可以使用 JTAG 和/或 UART 来获取固件的副本(当然,从供应商处下载固件更新通常是最简单的方法,但我假设这不是您想要的意思是)。

JTAG 实现通常允许您读/写内存,而闪存芯片通常“映射”到某个预定义地址的内存中(找到该地址通常需要谷歌搜索、经验和反复试验);因此,您可以使用UrJTAGOpenOCD等工具来读取 flash 的内容。

UART 只是一个串口,所以它提供什么接口或选项(如果有的话)完全取决于创建系统的开发人员;大多数引导加载程序(例如,U-Boot)确实允许您读/写闪存/内存,并将 ASCII 十六进制转储到您的终端窗口。然后您需要解析 hexdump 并将其转换为实际的二进制值。同样,YMMV 可能无法通过 UART 转储内存或闪存。

其他设备可能具有提供类似功能的其他机制;例如,Microchip 的 PIC 微控制器使用ICSP(电路内串行编程)接口来读取、写入和调试固件。此类接口通常是专有的,可能会也可能不会被记录(Microchip 是众所周知的)。

供应商可能会采取措施保护或禁用 JTAG、UART 和 ICSP 等调试接口,但通常您可以直接转储闪存芯片(这通常比 JTAG/UART 快,但可能需要一些去/焊)。对于诸如内置闪存芯片的微控制器之类的设备(即闪存芯片不会暴露给您),您可能需要采用更先进的技术来破解此类复制保护。

就个人而言,由于我不怎么处理基于微控制器的系统,直接转储闪存芯片通常是我从设备获取固件副本的首选。

提取硬件芯片的内容被称为“ snarf ”ing。(该词可能对您的 Google 搜索有所帮助。)

要获取芯片的内容,您需要一个 ROM 读取器/编程器,例如来自http://www.needhams.com/programmers.htm的设备之一

ROM编程器