MCU程序加密保護(一)閃存讀寫保護法 加密與解密

MCU(微控制器單元)的加密方法可以從硬件、軟件和通信協議三個層面來理解。以下是常見的MCU加密手段,按類型分類說明:

針對目前 STM32 系列微控制器在程序加密保護方面手段單一、保護效果有限的問題,本文介紹并分析了四種常用的程序保護方法:

  1. 閃存讀寫保護

  2. 芯片唯一 ID 驗證

  3. 外接加密芯片

  4. 引導程序加密(Bootloader 加密)

實際在 STM32 開發板上的測試表明,合理組合多種保護機制,能顯著增強芯片程序與數據的安全性,有效防止閃存程序被讀取、拷貝或篡改,為嵌入式系統提供更可靠的安全保障。?

1 閃存讀寫保護法

STM32 微控制器提供了閃存讀寫保護的功能,

用來防止對閃存的非法訪問。 閃存讀寫保護功能概述:

讀保護(RDP)

  • 通過修改 Option Bytes 中的 RDP 位來啟用。

  • 啟用后,Flash 只能被內部正常執行的程序讀取,無法通過 JTAG/SWD 調試接口或從 RAM 啟動的程序讀取。

  • 解除讀保護會觸發整片 Flash 擦除,防止逆向工程與調試工具破解。

  • 以 STM32L1 系列為例,RDP 分為 3 個等級,不同等級對應不同的安全強度。

等級描述
0無保護(默認)。可以通過 JTAG/SWD 或從 RAM 啟動的程序任意讀取 Flash。
1Flash 受保護,防止由調試器(JTAG/SWD)直接讀取,也不能通過在 RAM 中加載執行程序來讀取。
解除 Level 1 保護將觸發全片擦除。
2最嚴格保護——禁用所有調試功能。
一旦設為 Level 2,不可復原,需謹慎使用。

寫保護(WRP)

  • 通過在 Option Bytes 中設置 WRP 位來啟用。

  • 啟用后,對被保護頁的任何寫或擦除操作都會被硬件阻止,并在狀態寄存器中產生錯誤標志。

  • 可以防止惡意修改中斷向量表或關鍵代碼區域。

優缺點對比:

優點

由硬件層面直接提供,成本為零,易于配置。

能有效防止通過調試接口的非法讀寫

缺點

單一的讀/寫保護難以抵抗高級物理攻擊或側信道分析。

需要與軟件層面的校驗(如 CRC、HASH)或更高級的加密方法(如外部加密芯片、Bootloader 加密)組合,才能構建更完善的防護體系。

實施的方法如下,下面以 STM32G4 系列為例,分別介紹如何通過 ST-Link/CubeProgrammer 工具以及 運行時(HAL)編程 兩種方式來啟用 Flash 的讀寫保護(RDP 和 WRP)。

方法一:通過 STM32CubeProgrammer 界面設置

打開 CubeProgrammer

啟動 STM32CubeProgrammer,選擇 “ST-Link” 連接。

讀取當前 Option Bytes

在左側菜單選擇 “Option Bytes”

點擊 “Read”,查看當前 RDP(Read Protection)和 WRP(Write Protection) 配置。

配置讀保護(RDP)

“Read protection” 下拉框中選擇:

Level 0:無保護

Level 1:Flash 只允許內部執行讀取

Level 2:全部調試接口禁用(不可逆)

推薦一般項目選 Level 1

配置寫保護(WRP)

“Write protection” 區域,勾選你要保護的 Flash 扇區(Page)。

比如要保護第 0~3 扇區,就勾選對應頁號。

寫入并重啟

點擊 “Apply”,CubeProgrammer 會提示需要復位芯片以生效。

確認后,設備重啟,Option Bytes 即更新完畢。

方法二:在用戶代碼中動態配置(HAL 庫示例)

如果希望在程序首次運行時,或通過 Bootloader 進行保護設置,可以在固件內部調用 HAL API 來修改 Option Bytes。

/*** @brief  啟用 RDP Level1 并對指定扇區啟用寫保護* @note   必須在系統啟動早期執行,且芯片復位后才生效*/
void Protect_Flash(void)
{HAL_FLASH_Unlock();HAL_FLASH_OB_Unlock();/* 1) 讀保護 → Level1 */FLASH_OBProgramInitTypeDef OBInit = {0};OBInit.OptionType = OPTIONBYTE_RDP;OBInit.RDPLevel   = OB_RDP_LEVEL_1;if (HAL_FLASHEx_OBProgram(&OBInit) != HAL_OK) {/* 錯誤處理 */}/* 2) 寫保護 → 保護第 0~15 KB(頁 0~15) */memset(&OBInit, 0, sizeof(OBInit));OBInit.OptionType = OPTIONBYTE_WRP;OBInit.WRPState   = OB_WRPSTATE_ENABLE;OBInit.WRPPage    = OB_WRP_PAGES0TO3   | OB_WRP_PAGES4TO7   | OB_WRP_PAGES8TO11  | OB_WRP_PAGES12TO15;if (HAL_FLASHEx_OBProgram(&OBInit) != HAL_OK) {/* 錯誤處理 */}HAL_FLASH_OB_Lock();HAL_FLASH_Lock();//    /* 復位生效 */
//    NVIC_SystemReset();
}

?其次你會發現程序也燒寫不進去。此時目標也達成。

我們說了加密,那如何解密呢?問題在于每次切換RDPLevel 1到0的過程中的時候,會將flash的內容全部擦除。因此這是解密的難點之一。

我們引入思考點一,針對閃存讀寫保護法這類內容也就是寄存器置位,如果你要切換RDP1到RDP0?的過程伴隨著一個問題,STM32 上的 Read-Out Protection(RDP)并不是真正的“加密”,而是一種硬件級的“只讀保護”機制——它保證 任何 試圖“解開”這層保護的操作(也就是把 RDP 從 Level 1 降回 Level 0),都會觸發一次整片 Flash 的 不可逆擦除,從而根本不可能在芯片上恢復出原來的固件!!!

一旦啟用 RDP Level 1,就不可能在器件內“解密”或“讀取” Flash 內容;任何試圖取消保護的行為都會把所有數據抹掉。

為什么不能“解密”現有固件???

STM32 的 RDP 設計上就是「不可逆保護」:降級就擦除。

Flash 中的代碼以明文形式存儲,Option Bytes 保護只是阻止「直接」訪問,但并不做真實的加密。

一旦需要「訪問明文」,只能通過內部執行(CPU 跳轉),而不是通過調試器或外部讀口。

因此問題點來了!!!我們要做的是,在啟用了 RDP Level 1 以后,所有基于 JTAG/SWD外部調試器 的直接讀 Flash 操作都會被阻止——硬件層面上不可能再通過外部工具把 Flash 整片“拷”出來。不過,RDP Level 1 并不影響 MCU 自身程序對 Flash 的正常讀取;換句話說,你只要在芯片內跑一段用戶代碼,通過 UART/CAN/USB 等總線把 Flash 內容“轉發”出去,就能獲得完整的二進制鏡像。

首先我們要將程序運行在SRAM中,根據自己的芯片主控觀察大小,筆者這邊是20KB的如下所示:

因此我們的環境在keil,如何配置呢,跟著筆者一步一步來吧。

第一步就是新建立一個模板了 如上所示,我們進行切換。

其次就是宏定義了,加上下述內容!

這邊就是改配置內容了

接下來就是這個內容的更改了,配置文件具體如何寫如下所示:

LR_IROM1 0x20000000 0x00005000  {    ; Total 20KB SRAM regionER_IROM1 0x20000000 0x00003000  {  ; Code section: 12KB*.o (RESET, +First)*(InRoot$$Sections).ANY (+RO).ANY (+XO)}RW_IRAM1 0x20003000 0x00002000  {  ; Data section: 8KB.ANY (+RW +ZI)}
}

其次就是這個仿真器命令文件了,如下所示:

具體內容如下所示:

/***********************************************************/
/* Debug_RAM.ini: Initialization File for Debugging from Internal RAM         */
/******************************************************/
/* This file is part of the uVision/ARM development tools.                    */
/* Copyright (c) 2005-2014 Keil Software. All rights reserved.                */
/* This software may only be used under the terms of a valid, current,        */
/* end user licence from KEIL for a compatible version of KEIL software       */
/*development tools. Nothing else gives you the right to use this software  */
/***************************************************/FUNC void Setup (void) {
SP = _RDWORD(0x20000000); // 設置棧指針SP,把0x20000000地址中的內容賦值到SP。
PC = _RDWORD(0x20000004); // 設置程序指針PC,把0x20000004地址中的內容賦值到PC。
_WDWORD(0xE000ED08, 0x20000000);  // Setup Vector Table Offset Register
}LOAD %L INCREMENTAL                    // 下載axf文件到RAM
Setup();                           //調用上面定義的setup函數設置運行環境//g, main   //跳轉到main函數,本示例調試時不需要從main函數執行,注釋掉了,程序從啟動代碼開始執行

最后就是debug處了。

之后進入調試你會發現程序在SRAM的運行處。觀察匯編代碼。

因此,程序成功在SRAM處運行。

都要重新點擊“Debug”按鈕下載SRAM程序,再全速運行才能正常查看輸出。

接著就是寫拷貝flash的內容到SRAM處通過UART轉發出來。

這是原本的程序地址所示如下了。

如下是通過SRAM來拷貝Flash轉發到uart的內容

void dump_flash_via_uart(void)
{char hex_str[8];for (uint32_t addr = FLASH_START_ADDR; addr < (FLASH_START_ADDR + FLASH_SIZE_BYTES); addr++) {uint8_t byte = *(volatile uint8_t*)addr;sprintf(hex_str, "%02X ", byte);  // 格式化成十六進制字符串HAL_UART_Transmit(&huart1, (uint8_t*)hex_str, strlen(hex_str), HAL_MAX_DELAY);}const char* end_msg = "\r\n[FLASH DUMP DONE]\r\n";HAL_UART_Transmit(&huart1, (uint8_t*)end_msg, strlen(end_msg), HAL_MAX_DELAY);
}
含義十六進制值小端轉換(實際值)
初始棧地址 MSPF8 04 00 200x200004F8 ?
Reset_Handler05 01 00 080x08000105 ?
NMI_Handler?5B 13 00 080x0800135B ?
HardFault_Handler?C9 11 00 080x080011C9 ?

這些值完全一致!

但是在WDP與DRP設置了之后。。

📌 根本原因:

? 你能正常讀取 Flash,是因為:

  • STM32 默認 RDP 是 Level 0(無保護)

  • 此時,即便運行在 SRAM,也能直接訪問 0x08000000 地址處的 Flash 內容;

? 設置 RDP Level 1 后:

  • Cortex-M3 核心(STM32F1)硬件禁止訪問 Flash 內容

  • 這是芯片的硬件安全特性,即使代碼跑在 SRAM,依然無法讀取 Flash 數據,目的就是為了防止“SRAM 下載程序+讀取 Flash 代碼”這種逆向手段;

因此上述破解方案無效,無法再從芯片內部獲取任何 Flash 數據了,數據已經從訪問層面徹底封鎖。如果想切回回0,flash內容也會全部擦除!

方法原理是否可行備注
芯片解封/酸蝕 + 顯微探測打開芯片封裝,用電子顯微鏡直接讀 Flash 電荷狀態??理論可行需要實驗室級別設備、極高技術
功耗分析(側信道攻擊)用高精度設備分析芯片運行時功耗波動,推測程序數據理論可行,但難度極高適用于破解算法或加密密鑰,不適合整段程序恢復
激光/聚焦掃描干擾用激光打干擾點,欺騙 Flash 控制器讀取受保護數據??高端實驗室可能可行用于芯片逆向取證等高價值目標
IC 解封 + Flash 直接讀出拆解裸片,對 Flash 數字結構逐位掃描??有可能,但需要芯片內部結構圖這屬于“物理攻擊”范疇

?? 這些都需要 IC 物理逆向實驗室、百萬級設備成本,不具備民用可行性。

手段原理應用場景
X-Ray(X 射線掃描)非破壞式探測芯片內部結構,識別 layout,理論可判斷 Flash 存儲逆向分析芯片、找 ROM Mask
開蓋 + 紫外線(UV)曝光對芯片裸露的 silicon 層曝光,激發電荷或使 EEPROM 狀態改變用于清除 EEPROM 或恢復舊鎖定狀態

補充:

STM32 跟一些 MCU(比如 AVR、ESP32)那種通過 熔絲(fuse)位 永久寫死不同。

STM32 的 Option Bytes 是可擦除/可重寫的 Flash 區域

只不過 RDP Level 2 一旦寫入,就不可降級、無法還原;

RDP Level 1 還可以通過 全芯片擦除 恢復成 Level 0(但數據沒了)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81297.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81297.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81297.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

汽車裝配又又又升級,ethernetip轉profinet進階躍遷指南

1. 場景描述&#xff1a;汽車裝配線中&#xff0c;使用EtherNet/IP協議的機器人與使用PROFINET協議的PLC進行數據交互。 2. 連接設備&#xff1a;EtherNet/IP機器人控制器&#xff08;如ABB、FANUC&#xff09;與PROFINET PLC&#xff08;如西門子S7-1500&#xff09;。 3. 連…

RFID系統:技術解析與應用全景

一、技術架構與運行邏輯 RFID&#xff08;Radio Frequency Identification&#xff09;系統通過無線電波實現非接觸式數據交互&#xff0c;其核心由三部分組成&#xff1a; 電子標簽&#xff08;Tag&#xff09;&#xff1a; 無源標簽&#xff1a;依賴讀寫器電磁場供電&…

25、DeepSeek-R1論文筆記

DeepSeek-R1論文筆記 1、研究背景與核心目標2、核心模型與技術路線3、蒸餾技術與小模型優化4、訓練過程簡介5、COT思維鏈&#xff08;Chain of Thought&#xff09;6、強化學習算法&#xff08;GRPO&#xff09;7、冷啟動**1. 冷啟動的目的****2. 冷啟動的實現步驟****3. 冷啟動…

開源項目實戰學習之YOLO11:12.2 ultralytics-models-sam-decoders.py源碼分析

?? 點擊關注不迷路 ?? 點擊關注不迷路 ?? 另外,前些天發現了一個巨牛的AI人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。感興趣的可以點擊相關跳轉鏈接。 點擊跳轉到網站。 ultralytics-models-sam 1.sam-modules-decoders.pyblocks.py: 定義模型中的各…

Raft 協議:分布式一致性算法的核心思想

引言 在分布式系統中&#xff0c;數據一致性是核心挑戰。Raft 協議作為一種易于理解的一致性算法&#xff0c;被廣泛應用于 etcd、Consul 等系統中。 一、Raft 核心概念 1.1 角色與任期&#xff08;Term&#xff09; ? 領導者&#xff08;Leader&#xff09;&#xff1a;處…

基于DWT的音頻水印算法

基于離散小波變換&#xff08;DWT&#xff09;的音頻水印算法是一種結合信號處理與信息隱藏的技術&#xff0c;旨在將版權信息或標識隱蔽地嵌入音頻信號中&#xff0c;同時保證不可感知性和魯棒性。以下是該算法的核心步驟及關鍵技術點&#xff1a; ?1. 算法基本原理? ?DWT…

低空經濟發展現狀與前景

低空經濟發展現狀與前景 一、低空經濟的定義與范疇 低空經濟是以民用有人駕駛和無人駕駛航空器為主體&#xff0c;以載人、載貨及其他作業等多場景低空飛行活動為牽引&#xff0c;輻射帶動商業活動或公共服務領域融合發展的一種綜合性新經濟形態。其涵蓋的低空空域通常為距離…

售前工作.工作流程和工具

第一部分 售前解決方案及技術建議書的制作 售前解決方案編寫的標準操作步驟SOP: 售前解決方案寫作方法_嗶哩嗶哩_bilibili 第二部分 投標過程關鍵活動--商務標技術方案 1. 按項目管理--售前銷售項目立項 銷售活動和銷售線索的跟蹤流程和工具 1&#xff09;拿到標書&#xff…

DeerFlow試用

github拉取代碼 配置.env和conf.yaml 注意設置大模型的url和模型名稱、api_key 先啟動根目錄下的server&#xff0c;端口如果有沖突直接在default變量賦值時修改&#xff1b; 再啟動前端&#xff0c;先build再run dev&#xff1b; 根據前端完成時的地址訪問界面&#xff1…

python + streamlink 下載 vimeo 短視頻

1. 起因&#xff0c; 目的: 看到一個視頻&#xff0c;很喜歡&#xff0c;想下載。https://player.vimeo.com/video/937787642 2. 先看效果 能下載。 3. 過程: 因為我自己沒頭緒。先看一下別人的例子&#xff0c; 問一下 ai 或是 google問了幾個來回&#xff0c;原來是流式…

JavaScript【6】事件

1.概述&#xff1a; 在 JavaScript 中&#xff0c;事件&#xff08;Event&#xff09;是瀏覽器或 DOM&#xff08;文檔對象模型&#xff09;與 JavaScript 代碼之間交互的一種機制。它代表了在瀏覽器環境中發生的特定行為或者動作&#xff0c;比如用戶點擊鼠標、敲擊鍵盤、頁面…

【Java ee初階】HTTP(2)

一、HTTP的方法 方法 說明 支持的HTTP協議版本 GET 獲取資源 1.0、1.1 POST 傳輸實體主體 1.0、1.1 PUT 傳輸文件 1.0、1.1 HEAD 獲得報文首部 1.0、1.1 DELETE 刪除文件 1.0、1.1 OPTIONS 詢問支持的方法 1.1 TRACE 追蹤路徑 1.1 CONNECT 要求用隧道…

文件名是 ?E:\20250512_191204.mp4, EV軟件錄屏,未保存直接關機損壞, 如何修復?

去github上下載untrunc 工具就能修復 https://github.com/anthwlock/untrunc/releases 如果訪問不了 本機的 hosts文件設置 140.82.112.3 github.com 199.232.69.194 github.global.ssl.fastly.net 就能訪問了 實在不行&#xff0c;從這里下載&#xff0c;傳上去了 https://do…

騰訊 CodeBuddy 殺入 AI 編程賽道,能否撼動海外工具霸主地位?

在 AI 編程助手領域&#xff0c;海外的 Cursor 等工具風頭正勁&#xff0c;如今騰訊帶著 CodeBuddy 隆重登場&#xff0c;國產 AI 編程助手能否借其之力崛起&#xff1f;讓我們一探究竟。 官網&#xff1a; 騰訊云代碼助手 CodeBuddy - AI 時代的智能編程伙伴 實戰安裝教程 …

PySide6 GUI 學習筆記——常用類及控件使用方法(常用類顏色常量QColorConstants)

文章目錄 一、概述二、顏色常量表標準 Qt 顏色SVG 顏色&#xff08;部分&#xff09; 三、Python 代碼示例四、代碼說明五、版本兼容性六、延伸閱讀 一、概述 QColorConstants 是 Qt for Python 提供的一個預定義顏色常量集合&#xff0c;包含標準Qt顏色和SVG規范顏色。這些常…

MATLAB 自然語言處理入門教程

文章目錄 前言環境配置一、MATLAB NLP 工具箱概述二、核心功能與 API1. 文本數據準備2. 特征提取3. 文本分類&#xff08;傳統機器學習&#xff09;4. 深度學習文本分類&#xff08;LSTM&#xff09; 三、實戰案例&#xff1a;情感分析四、高級應用1. 命名實體識別&#xff08;…

C++ deque雙端隊列、deque對象創建、deque賦值操作

在deque中&#xff0c;front()是頭部元素&#xff0c;back()指的是尾部元素。begin()是指向頭部的迭代器&#xff0c;end()是指向尾部的下一個元素的迭代器。 push_front 頭部進行插入 pop_front 尾部進行刪除 push_back 尾部進行插入 pop_back 尾部進行刪除 deque如果同時…

java每日精進 5.15【分頁實現】

1. 什么是對象轉換和數據翻譯&#xff1f; 對象轉換 對象轉換是指將一種類型的對象&#xff08;如數據庫實體 UserDO&#xff09;轉換為另一種類型的對象&#xff08;如前端響應對象 UserVO 或服務層 DTO&#xff09;。例如&#xff0c;一個 UserDO 包含用戶 ID、姓名和部門 …

什么是API接口?API接口的核心價值

隨著互聯網技術的蓬勃發展&#xff0c;API 接口作為不同應用程序之間的關鍵紐帶&#xff0c;其重要性愈發凸顯。本文將從專業視角&#xff0c;深入剖析 API 接口的分類、原理、請求方式以及安全機制等核心要素&#xff0c;助力讀者全面理解這一數字化基礎設施。 一、API 接口及…

Linux_ELF文件

目錄 前言&#xff1a; 一、ELF文件的類型 二、ELF文件的組成格式 1. ELF頭部(ELF Header) 2. 節頭表(Section Header Table) 3. 程序頭表(Program Header Table) 4. 節(Sections)與段(Segments) 三、ELF文件從形成到加載輪廓 1、ELF可執行文件形成過程 2、 可執行文…