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


    通过这种方式,可以实时检查程序的完整性,防止盗取程序时对程序的修改。

    也可以用来验证程序的完整性,特别是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文件,放在路径ProjectMDK-ARM(AC5)

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

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

    srec_cat.exe Objectsoutput.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。



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

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

    /*
    *********************************************************************************************************
    *        函 数 名: BootHexCrcVeriy
    *        功能说明: 程序完整性校验
    *        形    参: 无
    *        返 回 值: 无
    *********************************************************************************************************
    */
    #define BOOT_START   0x08000000     /* boot程序首地址 */
    #define BOOT_LEN     0x0001FFFC     /* 程序大小 */
    #define BOOT_CRCADDR 0x0801FFFC     /* bin文件的CRC计算值存储的位置 */
    
    __IO uint32_t uwCRCValue = 0;
    __IO uint32_t uwExpectedCRCValue;
    
    void BootHexCrcVeriy(void)
    {
            CRC_HandleTypeDef   CrcHandle;
            
            /* 读取bin文件的CRC */
            uwExpectedCRCValue  = *(__IO uint32_t *)BOOT_CRCADDR;
            
            /* 初始化硬件CRC */
            __HAL_RCC_CRC_CLK_ENABLE();      
            
            CrcHandle.Instance = CRC;
            CrcHandle.Init.DefaultPolynomialUse    = DEFAULT_POLYNOMIAL_ENABLE;
            CrcHandle.Init.DefaultInitValueUse     = DEFAULT_INIT_VALUE_ENABLE;
            CrcHandle.Init.InputDataInversionMode  = CRC_INPUTDATA_INVERSION_NONE;
            CrcHandle.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE;
            CrcHandle.InputDataFormat              = CRC_INPUTDATA_FORMAT_WORDS;
    
            if (HAL_CRC_Init(&CrcHandle) != HAL_OK)
            {
            Error_Handler(__FILE__, __LINE__);
            }
    
            /* 计算是否与硬件CRC一致 */
            uwCRCValue = HAL_CRC_Calculate(&CrcHandle, (uint32_t *)BOOT_START, BOOT_LEN/4);
    
            if (uwCRCValue != uwExpectedCRCValue)
            {
            Error_Handler(__FILE__, __LINE__);               
            }
    }

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



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




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

    RTX5 BOOT CRC.rar (3.16MB)


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


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


    【后续】

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

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

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

    RTX5 BOOT CRC BIN.rar (3.19MB)

  • 相关阅读:
    分部视图
    linq的几个方法
    如何让服务器支持mp4文件下载和sqlserver将表生成为sql语句方法
    在asp.net mvc中导出Excel文件
    Linq2EF操作中的两个小问题
    JSON到底是什么?
    连接跟踪(conntrack):原理、应用及 Linux 内核实现 转载
    没有安全,没有隐私
    互联网发展到今天,我们要做的,是用机器解决人类解决不了的问题。在这个意义上,比起人工智能,机器智能这个词更加准确。
    今天,世界各国城市的可持续发展面临很大挑战,这些挑战也带来了一个难得的机遇,就是利用机器智能解决城市发展过程中许多重要的问题,如交通治理。同时这也是像机器智能这样的新一代技术快速发展的机遇,这正是我全身心推动城市大脑的原因
  • 原文地址:https://www.cnblogs.com/armfly/p/12765692.html
Copyright © 2020-2023  润新知