当前位置:   article > 正文

模拟STM32 Flash数据丢失、被串改的异常情况_flash数据被篡改 csdn

flash数据被篡改 csdn

        在项目中,通常会将一些需要掉电存储的数据保存在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开始存储

  1. #define ParameterAddress (FLASH_BASE + (200 * 1024))
  2. // 200 * 1024 = 0x32000
  3. // 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.0x100-A = 校验码。

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

  1. 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
  2. Sum = 0x4BA

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

更改为后如下图

 三、将数据烧入单片机

(1)打开hex文件

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

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

写入成功界面

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/56792?site
推荐阅读
相关标签
  

闽ICP备14008679号