解析STM32 Flash数据丢失和串改异常情况的模拟情景

        在项目中,通常会将一些需要掉电存储的数据保存在flash中,但在某些情况下存储的数据会被莫名其妙的修改或者丢失,但这种情况又很难复现。为了模拟这种情况,我们可以读出Flash数据,修改某个值以后再下载进去,不需要动程序程序部分。以下内容分为三个部分,第一是读取Flash数据,第二是修改Flash数据,第三是修改后的数据下载回单片机。

一、读取Flash数据

借助的工具是SEGGER J-Flash

硬件工具是Jlink SWD

(1)打开SEGGER J-Flash工具,点击Options选项,选择Project Settings,打开界面后,选择SWD模式,如下图所示。

(2)MCU选择你当前用的型号,最后点击确认。如下图所示。

(3)连接单片机。

(4)读取Flash数据,根据程序设定的存储页数计算出地址,就得到了要读取的范围,举例:

STM32F103VCT6的1Page是1024字节,我程序设定从第200Page开始存储

#define ParameterAddress        (FLASH_BASE + (200 * 1024))	
// 200 * 1024 = 0x32000	
// 0x08000000 + 0x32000 = 0x08032000

 所以计算出来的地址是0x08032000

按下图打开界面

 输入地址,读取长度是0x1000字节

读取成功界面如下

 (5)Flash数据另存为Hex文件。

注意保存为Hex

二、修改Flash数据

打开Hex文件,下图红色框中的就是存储的数据

红色框的最后一个字节是字节校验码,Hex文件的格式解析可以参考下面链接

Hex文件格式

STM32 Hex文件格式解析

程序中设定了每个数据都是32bit存储,并且是地址+数据的方式存储,以红色框第一行的程序举例

地址0x20002437,值是0x000000C8

地址0x20002837,值是0x00320032

地址0x20002C37,值是0x000007D0

地址0x20003037,值是0x000007D0

最后一个E2是校验码。

假设我现在将0x000000C8修改为0x00000064,需要重新计算校验码,校验码计算方式是

1.将这一行的所有的字节(16进制)相加求和,得到sum

2.取sum的低8bit,得到A

3.0×100-A = 校验码。

那么修改后的校验码计算过程:

Sum = 20+20+00+00+24+37+00+20+64+00+00+00+28+37+00+20+32+00+32+00+2C+37+00+20+D0+07+00+00+30+37+00+20+D0+07+00+00 = 4BA

即Sum = 0x4BA

 取低8位为0xBA,则校验码为0x100-0xBA = 0x46

更改为后如下图

 三、将数据烧入单片机

(1)打开hex文件

如下图所示,hex文件带地址,下图红色框的地址默认为读取的起始地址,能够加载hex文件进来,说明校验码正确,校验码错误是不能加载hex文件的,小红色框的0x64表明修改成功

 (2)写入单片机flash,请确保Jlink连接着单片机

写入成功界面

         最后可以通过别的手段检测到Flash中的这个数据已经被篡改了。

        其实这个读取功能还可以用于读取别人下载进单片机中程序,读取地址从0x08000000开始,然后将其下载到另外的单片机中,实现的功能是一样的。

物联沃分享整理
物联沃-IOTWORD物联网 » 解析STM32 Flash数据丢失和串改异常情况的模拟情景

发表评论