使用“差”数据表逆向工程 MCU

逆向工程 调试 手臂 嵌入式
2021-07-02 23:10:43


我正在对中国 MCU 进行逆向工程。
这个芯片的数据表很差,他们遗漏了重要的东西,比如内存映射、框图 ecc……所以我被卡住了。 这就是我所做的:
我可以访问SWD接口(它类似于 jtag,但特定于 arm)并且我可以通过 gdb 调试东西。我首先查看了主 CPU,数据表上写着“128MHz 高 CPU 性能处理器”,所以我可以假设它是ARM Cortex(可能是 M3)。
在内存中我找到了向量表(放置在 0)和重置处理程序(0x4)。现在我可以从入口点(重置处理程序)开始读取代码。但是代码很大,通过 gdb 读取所有内容很烦人,但最重要的是我不知道事情在哪里。好吧,通过向量表我知道堆栈和入口点在哪里。我有芯片中使用的一些中断的位置,但仅此而已。问题是,我能从这几条信息中找出内存映射吗?你的方法会如何应对这种“挑战”?谢谢 :)

2个回答

如果您有 SWD,您至少应该能够获得设备 ID 或确定设备系列。例如,大多数 Cortex-M 设备具有非常统一的内存映射。您还可以探测内存读取(例如每个 0x1000 字节)以确定哪些地址是有效的。

如果您触摸向量表,则第一个条目是堆栈指针的初始值。在大多数情况下,它被设置为可能的最高 RAM 地址。例如,如果它是 0x2000A000,那么您就知道您拥有具有 40KB RAM 的 MCU。如果您的 MCU 不是定制芯片,而是与 ST、NXP 或其他供应商的某些已知 MCU 的副本,那么稍后会更容易。

也许尝试一些其他供应商的官方工具,你会抓住你的芯片,它会使转储闪存更容易。

无论如何,您可以尝试从地址 0x1FFFF7E0 读取位置大小闪存大小(至少在 ST MCU 中)。另一方面,正如 Igor 所说,您可以尝试下载大块的闪存,然后将其构建在一起。稍后当您拥有完整的内容时,您可以尝试使用您的代码提供在线反汇编程序,并通过试错过程找到您的核心。