成功實現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文件,放在路徑\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。



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、在路徑 \Project\MDK-ARM(AC5) 里面添加了文件hex2bin.exe
2、在批處理文件CopyHex_Flash.bat里面添加 hex2bin ..\output-crc.hex

通過這兩部就可以完成,完整代碼如下:

RTX5 BOOT CRC BIN.rar (3.19MB)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM