Jlink使用技巧之讀取STM32內部的程式
前言
上一篇Jlink系列文章介紹瞭如何使用J-Flash來下載Hex或Bin檔案到微控制器,具體可參考Jlink使用技巧之單獨下載HEX檔案到微控制器,本篇文章介紹,如何使用JFlash來讀取微控制器的程式,學習微控制器程式檔案的讀取,不是為了破解別人的程式,而是學習破解的原理,從而更好保護自己的程式不被破解,希望大家也能尊重他人的勞動成果。
JFlash的下載和安裝
首先,安裝JFlash軟體,安裝完成後,會預設安裝JLink驅動程式,主要包含以下幾個工具:
- JFlash,主要用於程式下載和讀取。
- JFlashLite,JFlash的Mini版
- JFlashSPI,用於給SPI儲存器下載程式,如W25Q128。
- JLinkGDBServer,用於第三方軟體的偵錯程式,如使用Eclipse搭建STM32開發環境時,就要使用GDB Server來進行除錯。
- JLink Command,命令操作視窗,輸入指令執行連線,擦除、下載、執行等操作。
軟體準備
- Jlink軟體,J-Flash
- Jlink偵錯程式,如Jlink V9
- 微控制器開發板,如STM32F103RET6
1.開啟JFlash
2.建立新工程
點選 File->NewProject
3.選擇晶片的型號
這裡支援很多ARM Cortex核心的晶片,選擇要讀取微控制器對應的晶片型號,我這裡選擇的是STM32F103RE系列。
4.連線晶片
如果選擇的是SWD模式,就要連線SWDIO、SWCLK、GND這三根線,連線好之後,點選Target->Connect,如果連線成功,在下面的LOG視窗會顯示連線成功。
5.讀取微控制器內的程式
重點來了!選擇Target->Manual Programming ->Read Back,一共有三個選項,用於讀取不同的Flash地址範圍。
- Selected sectors
被選擇的扇區,可以在工程配置選項Project settings->Flash,檢視哪些扇區被選擇了。
- Entire chip
整個Flash區域,一般選擇這個選項,讀取整個Flash區域的程式
- Range
手動指定讀取的Flash地址範圍。
這裡我們選擇Entire chip就可以了,讀取整個Flash區域,地址範圍:0x8000000~0x807FFFF
等幾秒鐘,就可以看到底部視窗顯示讀取成功的資訊。
6.儲存讀取到的程式
選項File-> Save data file或者是Save data file as,儲存型別根據需要選擇,建議選擇Hex格式,已經包含了地址資訊。
7.程式的驗證。
怎麼驗證讀取到的程式是正確的呢?很簡單,重新燒寫進去,看執行現象和原來的是不是一樣就行了。
具體操作方法檢視上一篇Jlink系列文章:Jlink使用技巧之單獨下載HEX檔案到微控制器
總結
既然能這麼簡單的讀取到微控制器的程式,那麼我們自己的程式應該如何保護起來呢?很顯然,我們可以對Flash設定讀保護功能,即大家說的“加密”功能,可以防止對Flash的非法訪問,這裡的加密是針對整個Flash區域的,如果設定了讀保護功能,那麼程式只能正常的從RAM中載入執行,而不能通過偵錯程式讀出來,那麼別人就不能破解了。哈哈!
具體怎麼實現呢?
這裡先介紹幾個關於Flash保護操作的幾個庫函式:
FLASH_Unlock(); //Flash解鎖
FLASH_ReadOutProtection(DISABLE); //Flash讀保護禁止
FLASH_ReadOutProtection(ENABLE); //Flash讀保護允許
這個函式在韌體庫stm32f10x_flash.h中,使用這個功能要先新增這個庫檔案。
設定讀保護:
void Set_Protect(void)
{
if(FLASH_GetReadOutProtectionStatus() != SET)
{
FLASH_Unlock();
FLASH_ReadOutProtection(ENABLE);
FLASH_Lock();
}
}
注意:
- 啟動讀保護後,就不能讀寫程式了,如使用JLink讀取程式,或者是重新下載程式。
- 所以,在下載程式之前,需要通過程式內部呼叫關閉讀保護,關閉讀保護之後,會自動清空Flash
- 另外,當第一次呼叫Set_Protect()函式啟動讀保護之後,不能再次呼叫Off_Protect()函式關閉讀保護,需要重新斷電才能關閉讀保護
關閉讀保護,在串列埠接收某個有效資料或按下某個按鍵時,呼叫關閉讀保護:
void Off_Protect(void)
{
if(FLASH_GetReadOutProtectionStatus() != RESET)
{
FLASH_Unlock();
FLASH_ReadOutProtection(DISABLE);
FLASH_Lock();
}
}
程式可以這樣實現:
int main(void)
{
/*使用者程式碼*/
if(KEY == 0) //按鍵按下
{
Off_Protect();
}
else
{
Set_Protect();
}
/*使用者程式碼*/
while(1)
{
/*使用者程式碼*/
}
}
JLink_Windows_V614b軟體下載
公眾號後臺回覆“JLINK”,可獲得JLink_Windows_V614b.exe軟體下載連結。
歷史精選文章:
- Jlink使用技巧之讀取STM32內部的程式
- Jlink使用技巧之單獨下載HEX檔案到微控制器
- Jlink使用技巧之J-Scope虛擬示波器功能
- 百度智慧手環方案開源(含原始碼,原理圖,APP,通訊協議等)
- 如何在Keil-MDK開發環境生成Bin格式檔案
- elf格式轉換為hex格式檔案的兩種方法
- 兩個HC-05藍芽模組互相繫結構成無線串列埠模組
- STM32實戰應用(一)——1602藍芽時鐘1液晶的顯示測試
- 微控制器之模組化程式設計
- 微控制器課程設計——《基於AT89S52微控制器和DS1302時鐘晶片的電子時鐘(可藍芽校準)》
- 個人部落格新增網易雲音樂Flash外掛
- 兩行程式碼搞定部落格訪問量統計
歡迎大家關注我的個人部落格
或微信掃碼關注我的公眾號