STM32固件入口点

逆向工程 固件 手臂 料斗 入口点
2021-06-14 19:14:45

我正在尝试为 DIY 项目拆卸固件,打开硬件但关闭固件。我的问题是如何正确初始化反汇编器(Hopper Disassembler)。

我试图找出的值是这里显示的值:

料斗拆卸器

据我所知,处理器是STM32F100C8,ARM Cortex-M3,64Kbytes Flash,8Kbytes RAM。BOOT0 引脚被拉低,所以我知道它是从主闪存启动的:

从主闪存引导:主闪存在引导存储空间 (0x0000 0000) 中有别名,但仍可从其原始存储空间 (0x800 0000) 访问。换句话说,可以从地址 0x0000 0000 或 0x800 0000 开始访问闪存内容。

启动顺序如下:

CPU 从地址 0x0000 0000 获取栈顶值,然后从 0x0000 0004 开始从引导存储器开始执行代码

我使用arm-none-eabi-objcopy并发现将 .hex 文件转换为 .bin 文件

0x0000 0000  |  10050020 (Stack pointer) 
0x0000 0004  |  05A90008 (ResetHandler)

我不明白的是内存地址。

堆栈指针太大而无法成为相对偏移量(仅 8K RAM),而太小而无法指向 SRAM(从 0x2000 0000 开始)。

重置处理程序也太大而不能成为相对偏移量(只有 64k 闪存),也太小而不能指向主闪存(从 0x800 0000 开始)。

如何找出正确的基地址和入口点?

PS:DIY项目的原理图和固件可以在这里找到

1个回答

我相信这些值是小端的,所以堆栈指针在 0x20000510 处,重置向量是 0x0800a905。