硬汉嵌入式论坛

 找回密码
 立即注册
查看: 17477|回复: 61
收起左侧

[STM32H7] 成功实现MDK自动生成hex文件的crc值并附加到hex文件末尾(bin也支持),然后跟STM32的硬件CRC计算值做比较

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2020-4-20 10:28:02 | 显示全部楼层 |阅读模式
通过这种方式,可以实时检查程序的完整性,防止盗取程序时对程序的修改。

也可以用来验证程序的完整性,特别是IAP升级等场合。

【准备工作】

需要一个srec_cat.exe小软件,在下面的软件包里面。
srecord-1.64-win32.zip (1.88MB)

【理论基础】

http://www.keil.com/support/docs/3806.htm

an277.pdf (428.74KB)

全部理论都在这个文档上面:



【操作步骤】
注意,我是按照我们的工程操作的,其它工程大家自行做适配,推荐将CRC值放在扇区末尾,方便程序设计和配置。

1、下载此贴里面的RTX5 BOOT例子:链接

2、将srec_cat.exe文件,放在路径\Project\MDK-ARM(AC5)

3、在原有的批处理文件CopyHex_Flash.bat,加上一行处理:

srec_cat.exe Objects\output.hex -intel -crop 0x08000000 0x0801FFFC -fill 0xFF 0x08000000 0x0801FFFC -STM32_Little_Endian 0x0801FFFC -o ..\output-crc.hex -intel

srec_cat.exe Objects\output.hex -intel                                   :以hex方式读取output.hex文件。
-crop 0x08000000 0x0801FFFC                                             : 裁剪出0x08000000 到 0x0801FFFC  的空间(即128KB的末尾字节)。
-fill 0xFF                                                                              : 未使用的空间填充0xFF。
0x08000000 0x0801FFFC -STM32_Little_Endian 0x0801FFFC   : 计算0x08000000 到 0x0801FFFC的CRC值,以小端格式存储到地址0x0801FFFC 。
..\output-crc.hex -intel                                                          : hex文件末尾带crc值的output_crc.hex文件存在上一个目录,对于我们工程即 \Project。

1.png

3、程序里面添加如下硬件CRC校验:

配置好系统时钟后,就可以调用此函数验证当前程序的完整性。

  1. /*
  2. *********************************************************************************************************
  3. *        函 数 名: BootHexCrcVeriy
  4. *        功能说明: 程序完整性校验
  5. *        形    参: 无
  6. *        返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. #define BOOT_START   0x08000000     /* boot程序首地址 */
  10. #define BOOT_LEN     0x0001FFFC     /* 程序大小 */
  11. #define BOOT_CRCADDR 0x0801FFFC     /* bin文件的CRC计算值存储的位置 */

  12. __IO uint32_t uwCRCValue = 0;
  13. __IO uint32_t uwExpectedCRCValue;

  14. void BootHexCrcVeriy(void)
  15. {
  16.         CRC_HandleTypeDef   CrcHandle;
  17.         
  18.         /* 读取bin文件的CRC */
  19.         uwExpectedCRCValue  = *(__IO uint32_t *)BOOT_CRCADDR;
  20.         
  21.         /* 初始化硬件CRC */
  22.         __HAL_RCC_CRC_CLK_ENABLE();      
  23.         
  24.         CrcHandle.Instance = CRC;
  25.         CrcHandle.Init.DefaultPolynomialUse    = DEFAULT_POLYNOMIAL_ENABLE;
  26.         CrcHandle.Init.DefaultInitValueUse     = DEFAULT_INIT_VALUE_ENABLE;
  27.         CrcHandle.Init.InputDataInversionMode  = CRC_INPUTDATA_INVERSION_NONE;
  28.         CrcHandle.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE;
  29.         CrcHandle.InputDataFormat              = CRC_INPUTDATA_FORMAT_WORDS;

  30.         if (HAL_CRC_Init(&CrcHandle) != HAL_OK)
  31.         {
  32.         Error_Handler(__FILE__, __LINE__);
  33.         }

  34.         /* 计算是否与硬件CRC一致 */
  35.         uwCRCValue = HAL_CRC_Calculate(&CrcHandle, (uint32_t *)BOOT_START, BOOT_LEN/4);

  36.         if (uwCRCValue != uwExpectedCRCValue)
  37.         {
  38.         Error_Handler(__FILE__, __LINE__);               
  39.         }
  40. }
复制代码


4、添加MDK自动执行批处理文件:

7.png

5、下载程序,这步比较关键,我们要单独下载生成的output_crc.hex文件,我这里直接使用jlink lite下载的,简单易用:

1.png
使用我们TOOL脱机烧录也可以:
image.png


6、完整的测试程序,可以在V7板子上面测试:

RTX5 BOOT CRC(V1.1).7z (1.95 MB)


最后大家可以尽情的发挥想象,怎么玩都行,可以有很多玩法。


核心就是软件计算的CRC和STM32的硬件CRC数值一样即可


【后续】

在原来程序的基础上再添加一个生成的output_crc.hex文件转换为bin文件。

1、在路径 \Project\MDK-ARM(AC5) 里面添加了文件hex2bin.exe
2、在批处理文件CopyHex_Flash.bat里面添加 hex2bin ..\output-crc.hex

通过这两部就可以完成,完整代码如下:

RTX5 BOOT CRC BIN(V1.1).7z (1.99 MB)
回复

使用道具 举报

7

主题

21

回帖

42

积分

新手上路

积分
42
发表于 2020-4-20 11:50:06 | 显示全部楼层
你说的思路好像不好实现,CRC放在最后面,是执行不过去的,所以增加不增加意义不到,做加密其实就是用UID做比较好。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-4-20 12:34:29 | 显示全部楼层
barryzxy 发表于 2020-4-20 11:50
你说的思路好像不好实现,CRC放在最后面,是执行不过去的,所以增加不增加意义不到,做加密其实就是用UID做 ...

已经实现了。
回复

使用道具 举报

6

主题

636

回帖

654

积分

金牌会员

积分
654
QQ
发表于 2020-4-20 13:16:06 | 显示全部楼层
嗯 期待硬汉分析思路
回复

使用道具 举报

27

主题

272

回帖

353

积分

高级会员

积分
353
发表于 2020-4-20 14:22:09 | 显示全部楼层
mark 下
回复

使用道具 举报

1

主题

94

回帖

97

积分

初级会员

积分
97
发表于 2020-4-20 14:42:14 | 显示全部楼层
我是在BIN程序的末尾加CRC校验,然后网络升级程序中做完整性校验,防止升级程序在拷贝和传输过程中数据异常造成硬件变砖。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-4-20 18:32:22 | 显示全部楼层
整理完毕。
回复

使用道具 举报

9

主题

103

回帖

130

积分

初级会员

积分
130
发表于 2020-4-20 21:32:49 | 显示全部楼层
一般都会计算一个CRC加到BIN后面,运行程序时Bootloader都会计算FLASH中的CRC值 和保存的CRC 如果不相等就会一直停在Bootloader中等待升级
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-4-20 21:57:03 | 显示全部楼层
hexenzhou 发表于 2020-4-20 14:42
我是在BIN程序的末尾加CRC校验,然后网络升级程序中做完整性校验,防止升级程序在拷贝和传输过程中数据异常 ...

好的,这就把bin文件末尾附加CRC的设置工程添加到楼主位。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-4-20 21:57:38 | 显示全部楼层
xy201207 发表于 2020-4-20 21:32
一般都会计算一个CRC加到BIN后面,运行程序时Bootloader都会计算FLASH中的CRC值 和保存的CRC 如果不相等就 ...

好的,这就把bin文件末尾附加CRC的设置工程添加到楼主位。
回复

使用道具 举报

4

主题

61

回帖

73

积分

初级会员

积分
73
QQ
发表于 2020-4-21 08:32:58 | 显示全部楼层
barryzxy 发表于 2020-4-20 11:50
你说的思路好像不好实现,CRC放在最后面,是执行不过去的,所以增加不增加意义不到,做加密其实就是用UID做 ...

UID是肯定要用的,但只用UID是很容易被破解者绕过去的,这个时候再结合CRC对代码的校验就能识别出来程序有没有被动过。当然只在代码结尾增加CRC校验也有点过于明显,可以在代码内多处增加CRC校验码互相验证以进一步提高破解者的破解难度。
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2020-4-21 08:54:13 | 显示全部楼层
stm32自带的读写保护不好吗? 为什么要这么复杂呢。。。。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-4-21 09:07:11 | 显示全部楼层
caicaptain2 发表于 2020-4-21 08:54
stm32自带的读写保护不好吗? 为什么要这么复杂呢。。。。。

这个的主要目的还是程序的完整性测试。

回复

使用道具 举报

4

主题

61

回帖

73

积分

初级会员

积分
73
QQ
发表于 2020-4-21 09:14:16 | 显示全部楼层
caicaptain2 发表于 2020-4-21 08:54
stm32自带的读写保护不好吗? 为什么要这么复杂呢。。。。。

自带的读写保护很容易被破解的哟
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2020-4-21 09:32:50 | 显示全部楼层
偶尔也很菜 发表于 2020-4-21 09:14
自带的读写保护很容易被破解的哟

st作为芯片行业的大佬之一,技术水平不会这么差劲吧?  
感觉读保护很好啊,强制读就会刷新flash,不会泄露代码,也不会成为死片子
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-4-21 09:49:48 | 显示全部楼层
caicaptain2 发表于 2020-4-21 09:32
st作为芯片行业的大佬之一,技术水平不会这么差劲吧?  
感觉读保护很好啊,强制读就会刷新flash,不会 ...

读保护防不了物理攻击,这就是为什么ARM力推M35P,不断推进物联网安全。

这里有个普及贴:

【硬核】EW2020上展示让芯片跳过安全启动进入while(1)
http://www.armbbs.cn/forum.php?m ... 6631&fromuid=58
(出处: 硬汉嵌入式论坛)


回复

使用道具 举报

16

主题

148

回帖

196

积分

初级会员

积分
196
发表于 2020-4-21 10:00:54 | 显示全部楼层
eric2013 发表于 2020-4-21 09:49
读保护防不了物理攻击,这就是为什么ARM力推M35P,不断推进物联网安全。

这里有个普及贴:

硬汉兄 有没有加密的专题介绍哈
回复

使用道具 举报

23

主题

1403

回帖

1472

积分

至尊会员

积分
1472
发表于 2020-4-21 10:01:28 | 显示全部楼层
Mark,以备不时之需
代码不规范,亲人两行泪!
回复

使用道具 举报

0

主题

0

回帖

0

积分

新手上路

积分
0
发表于 2020-4-25 21:12:05 | 显示全部楼层
st作为芯片行业的大佬之一,技术水平不会这么差劲吧?
感觉读保护很好啊,强制读就会刷新flash,不会泄露代码,也不会成为死片子
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2020-4-26 22:49:21 | 显示全部楼层
对于保持应用程序完整性这个CRC校验够用了
回复

使用道具 举报

1

主题

24

回帖

27

积分

新手上路

积分
27
发表于 2020-4-28 13:26:12 | 显示全部楼层
楼主,ST官方有相关内容啊,你直接搜ClassB,里面有做认证这个必备的,提供了相关源代码
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-4-28 13:36:35 | 显示全部楼层
nzk123 发表于 2020-4-28 13:26
楼主,ST官方有相关内容啊,你直接搜ClassB,里面有做认证这个必备的,提供了相关源代码

谢谢,自力更生,效果更好。
回复

使用道具 举报

10

主题

19

回帖

49

积分

初级会员

积分
49
发表于 2020-4-28 19:42:31 | 显示全部楼层
xy201207 发表于 2020-4-20 21:32
一般都会计算一个CRC加到BIN后面,运行程序时Bootloader都会计算FLASH中的CRC值 和保存的CRC 如果不相等就 ...

请问一下boot怎么获取应用程序的crc和应用程序的长度?因为应用可以升级,boot一般不升级,如果应用大小变了那么crc和应用的长度肯定也会变,不能把这两个值存储到boot代码里。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-4-28 20:37:16 | 显示全部楼层
nextstation 发表于 2020-4-28 19:42
请问一下boot怎么获取应用程序的crc和应用程序的长度?因为应用可以升级,boot一般不升级,如果应用大小 ...

boot都是远程获取,或者本地存储设备获取的,很容易就获取大小了。
回复

使用道具 举报

0

主题

68

回帖

68

积分

初级会员

积分
68
发表于 2020-8-5 08:56:37 | 显示全部楼层
我也做了一个,我是直接的在生成的raw.bin最后增加4B的CRC校验。
1,fromelf --bin --output raw.bin "#L"
2.srec_cat.exe raw.bin -Binary -crop 0 %indexdx%  -crc32-l-e %indexdx%  -o gps_bass.bin -Binary
回复

使用道具 举报

19

主题

76

回帖

133

积分

初级会员

积分
133
发表于 2021-8-20 15:01:55 | 显示全部楼层
本帖最后由 blueice1108 于 2021-8-20 15:47 编辑

16K flash最後四個byte 放CRC32
怎算出來和BIN檔的不一樣
ROM_SIZEinWORDS=4
     for(index = 0; index < (uint32_t)ROM_SIZEinWORDS; index++)
     {
        CRC->DR = __REV(*((uint32_t *)0x8008000 + index));
     }
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-8-21 09:10:31 | 显示全部楼层
blueice1108 发表于 2021-8-20 15:01
16K flash最後四個byte 放CRC32
怎算出來和BIN檔的不一樣
ROM_SIZEinWORDS=4

你这个仅计算了个__REV?
回复

使用道具 举报

3

主题

58

回帖

67

积分

初级会员

积分
67
发表于 2021-11-7 21:57:42 | 显示全部楼层
wander 发表于 2020-8-5 08:56
我也做了一个,我是直接的在生成的raw.bin最后增加4B的CRC校验。
1,fromelf --bin --output raw.bin "#L" ...

你这个好,这样可以在传输时减少不必要的浪费
回复

使用道具 举报

3

主题

58

回帖

67

积分

初级会员

积分
67
发表于 2021-11-13 08:54:58 | 显示全部楼层
Keil获取固件末尾的方法:
  1. extern int Image$ER_IROM1$Base;
  2. extern int Image$ER_IROM1$Limit;
  3. extern int Image$ER_IROM1$Length;
  4. extern int Image$ER_IROM1$RO$Length;
  5. extern int Image$RW_IRAM1$RW$Length;


  6. uint32_t Base = (uint32_t)&Image$ER_IROM1$Base;
  7. uint32_t Limit = (uint32_t)&Image$ER_IROM1$Limit;
  8. uint32_t Length = (uint32_t)&Image$ER_IROM1$Length;
  9. uint32_t RO_Length = (uint32_t)&Image$ER_IROM1$RO$Length;
  10. uint32_t RW_Length = (uint32_t)&Image$RW_IRAM1$RW$Length;


  11. /**
  12. * @brief   CRC32校验函数。
  13. * @details 校验结果和PC端一致。适用于不能4字节对齐的数据长度。
  14. * @param   hcrc    句柄,为hcrc应用封装的结构体变量。
  15. * @param   pBuffer 指针,指向被校验数据。
  16. * @param   Length  长度,被校验数据的字节数。
  17. * @retval  CRC32校验结果,与PC端常用结果一致。
  18. */
  19. uint32_t my_CRC(CRC_HandleTypeDef *hcrc,uint8_t *pBuffer,uint32_t Length)
  20. {
  21.   uint32_t index;
  22.   uint32_t temp = 0U;
  23.   hcrc->State = HAL_CRC_STATE_BUSY;
  24.   __HAL_CRC_DR_RESET(hcrc);
  25.   //-可以4字节对齐的部分,使用硬件CRC计算-begin-
  26.   index = Length>>2;
  27.   while(index--)
  28.   {
  29.     hcrc->Instance->DR = __RBIT(*(uint32_t *)pBuffer);
  30.     pBuffer+=4;
  31.   }
  32.   temp = __RBIT(hcrc->Instance->DR);
  33.   //-4字节对齐后多余的字节,最后用软件加入计算-begin-
  34.     index = Length & 0x03;
  35.     while(index--)
  36.     {
  37.       temp ^= (uint32_t)*pBuffer;
  38.       for(uint8_t i = 0;i < 8;i++)
  39.       {
  40.           if (temp & 0x01)
  41.             temp = (temp>>1)^0xedb88320;//0xedb88320是多项式0x04c11db7按位反转后的值
  42.           else
  43.             temp >>= 1;
  44.       }
  45.       pBuffer++;
  46.     }
  47.   hcrc->State = HAL_CRC_STATE_READY;
  48.   return temp^=0xffffffff;
  49. }

  50. __IO uint32_t uwCRCValue = 0;
  51. __IO uint32_t uwExpectedCRCValue;

  52. void BootHexCrcVeriy(void)
  53. {
  54.     CRC_HandleTypeDef   CrcHandle;
  55.     uint32_t CRC_Addr,size;
  56.    
  57.     /* 读取bin文件的CRC */
  58.     CRC_Addr = Limit + RW_Length;
  59.     printf("CRC_Addr:0x%X\r\n",CRC_Addr);
  60.     if(CRC_Addr%32)
  61.         CRC_Addr = (CRC_Addr + 31) / 32 * 32;
  62.     printf("CRC_Addr align 32:0x%X\r\n",CRC_Addr);
  63.     uwExpectedCRCValue  = *(__IO uint32_t *)(CRC_Addr);
  64.     printf("uwExpectedCRCValue:0x%X\r\n",uwExpectedCRCValue);
  65.    
  66.     /* 初始化硬件CRC */
  67.     __HAL_RCC_CRC_CLK_ENABLE();
  68.     CrcHandle.Instance = CRC;

  69.     if (HAL_CRC_Init(&CrcHandle) != HAL_OK)
  70.     {
  71.         printf("CRC init error\r\n");
  72.     }

  73.     /* 计算是否与硬件CRC一致 */
  74.     size = CRC_Addr - Base;
  75.     printf("size:%d\r\n",size);
  76.     uwCRCValue = my_CRC(&CrcHandle, (uint8_t *)Base,size);
  77.     printf("uwCRCValue:0x%X\r\n",uwCRCValue);
  78.    
  79.     if (uwCRCValue != uwExpectedCRCValue)
  80.     {
  81.         printf("CRC error\r\n");
  82.     }
  83. }
复制代码


输出bin文件:fromelf --bin -o app.bin !L
.bat添加CRC:
  1. for /f %%i in ('dir /b .\app.bin') do (
  2. set indexdx=%%~zi
  3. )
  4. ECHO %indexdx%
  5. srec_cat.exe app.bin -Binary -crop 0 %indexdx%  -crc32-l-e %indexdx%  -o app_xxx.bin -Binary
复制代码

打印输出如下():
ER_IROM1_Base  :0x8000000
ER_IROM1_Limit :0x8018CB0
ER_IROM1_Length:0x18CB0
ER_IROM1_RO_Length:0x18CB0
RW_IRAM1_RW_Length:0x140
CRC_Addr:0x8018DF0
CRC_Addr align 32:0x8018E00
uwExpectedCRCValue:0x82141BA
size:101888
uwCRCValue:0x82141BA

这里面隐藏的一个功能是,keil会自动将生成的执行文件(hex、bin)自动32字节对齐
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-11-13 08:59:13 | 显示全部楼层
ruboss 发表于 2021-11-13 08:54
Keil获取固件末尾的方法:

谢谢分享。
回复

使用道具 举报

3

主题

58

回帖

67

积分

初级会员

积分
67
发表于 2021-11-13 09:41:36 | 显示全部楼层
本帖最后由 ruboss 于 2021-11-13 09:50 编辑

上传我的测试工程,基于V6开发板。网页上传固件到0x08080000,程序里边对比CRC32
硬件CRC32实现非4字节对齐的实现参考了网友的:硬件CRC32 评论区第一个
bin文件追加CRC32参考的上面24楼的。
在此表示感谢!

另外还有个不完美的地方,不能添加多个Target,实现不同Target编译时自动生成不同名的bin文件,
这个问题的根源应该还是计算是在.bat批处理里面做的,如果能直接在After Build里面调用srec_cat就可以,
但是固件大小我不知道怎么获取。

V6-upload.rar

784.85 KB, 下载次数: 101

评分

参与人数 1金币 +100 收起 理由
eric2013 + 100 很给力!

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-11-14 08:31:55 | 显示全部楼层
ruboss 发表于 2021-11-13 09:41
上传我的测试工程,基于V6开发板。网页上传固件到0x08080000,程序里边对比CRC32
硬件CRC32实现非4字节对 ...

改进的已经很方便了
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2021-12-3 22:25:52 | 显示全部楼层
ruboss 发表于 2021-11-13 09:41
上传我的测试工程,基于V6开发板。网页上传固件到0x08080000,程序里边对比CRC32
硬件CRC32实现非4字节对 ...

你好!请问通过怎么修改 (uint32_t)&Image$RW_IRAM1$RW$Length 来获取压缩后的RW Data大小?原来的是获取Grand Totals里的RW Data
1.png
回复

使用道具 举报

3

主题

14

回帖

23

积分

新手上路

积分
23
发表于 2022-1-5 10:03:55 | 显示全部楼层
厉害,学习了
回复

使用道具 举报

19

主题

150

回帖

207

积分

高级会员

积分
207
发表于 2022-2-24 10:06:05 | 显示全部楼层
ruboss 发表于 2021-11-13 09:41
上传我的测试工程,基于V6开发板。网页上传固件到0x08080000,程序里边对比CRC32
硬件CRC32实现非4字节对 ...

我靠 屌炸天。
回复

使用道具 举报

3

主题

58

回帖

67

积分

初级会员

积分
67
发表于 2022-4-9 17:06:45 | 显示全部楼层
Amyth 发表于 2021-12-3 22:25
你好!请问通过怎么修改 (uint32_t)&Image$RW_IRAM1$RW$Length 来获取压缩后的RW Data大小?原来的是获取 ...

上面说的方法如果RW是经过压缩后的,就不准了,我也是刚发现。
网上搜了以下,有一个解决的帖子:https://www.sohu.com/a/431321566_505803
主要思路是利用了“Region$$Table$$Base”,打开map文件能搜到。
“Region$$Table$$Base”这个地址开始的第5个字,就是Total ROM Size (Code + RO Data + RW Data)

[C] 纯文本查看 复制代码
extern uint32_t Region$$Table$$Base;

typedef struct 
{
    uint32_t addr_Code_RO_Limit;        //Code + RO
    uint32_t addr_RAM_Base;             //RAM基址
    uint32_t addr_RW_Length;            //RW长度
    uint32_t addr_func;                 //C库c_w.l中的dczerorl函数,见map文件
    uint32_t addr_Image_Limit;          //Code + RO + 压缩的RW初值,减去flash基址可得到代码大小
    uint32_t addr_ZI_Base;              //ZI基址
    uint32_t addr_ZI_Length;            //ZI长度
    uint32_t addr_func2;                //C库c_w.l中的handler_zi函数,应是清零ZI用
}RegionTable_t;

region = (RegionTable_t*)(uint32_t)&Region$$Table$$Base;

addr = region->addr_Image_Limit;

回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2022-4-16 15:35:13 | 显示全部楼层
本帖最后由 fuluoce 于 2022-4-16 15:52 编辑

大神 你好
为啥要校验BOOT的bin呢  不是应该校验APP的bin吗?

请教一个问题:
在boot代码里,跳转app之前  我想校验一下app代码的完整性,我应该怎么做呢
如果app区域是自己通过上位机写入的   自己加上crc校验就可以,
如果是通过keil下载的axf文件呢?
或者说有办法区分app区域是bin文件  还是axf文件,或者hex文件也行。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2022-4-17 11:37:53 | 显示全部楼层
fuluoce 发表于 2022-4-16 15:35
大神 你好
为啥要校验BOOT的bin呢  不是应该校验APP的bin吗?

我这个就是校验APP的,你要校验boot也没问题。通用的玩法。
回复

使用道具 举报

1

主题

22

回帖

25

积分

新手上路

886064641534128530

积分
25
发表于 2022-6-10 15:49:21 | 显示全部楼层
wander 发表于 2020-8-5 08:56
我也做了一个,我是直接的在生成的raw.bin最后增加4B的CRC校验。
1,fromelf --bin --output raw.bin "#L" ...

1 你也可以具体的解说一下,以便大家都可以用。你和楼主的其它都一样,只是这个批处理不同吗?
2 都是添加在镜像文件的末尾。加在向量表的4个空闲DCD位置也可以吧?如果将CRC存在这个位置?如何校验?此时应该是从CRC字节存的位置到镜像的末尾吧?QQ2730122869或微信michael-mrzhang期待与你交流
回复

使用道具 举报

4

主题

166

回帖

178

积分

初级会员

积分
178
发表于 2022-6-13 17:36:26 | 显示全部楼层
h743的FLASH的2M的CRC也是可以的吧,就是flash全部用的话
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-28 06:24 , Processed in 0.334173 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表