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_Windows_V614b.exe
歷史精選文章:
Jlink使用技巧之合并燒寫文件
Jlink使用技巧之燒寫SPI Flash存儲芯片
Jlink使用技巧之虛擬串口功能
Jlink使用技巧之讀取STM32內部的程序
Jlink使用技巧之單獨下載HEX文件到單片機
Jlink使用技巧之J-Scope虛擬示波器功能
百度智能手環方案開源(含源碼,原理圖,APP,通信協議等)
如何在Keil-MDK開發環境生成Bin格式文件
elf格式轉換為hex格式文件的兩種方法
兩個HC-05藍牙模塊互相綁定構成無線串口模塊
STM32實戰應用(一)——1602藍牙時鐘1液晶的顯示測試
單片機之模塊化編程
單片機課程設計——《基于AT89S52單片機和DS1302時鐘芯片的電子時鐘(可藍牙校準)》
個人博客添加網易云音樂Flash插件
兩行代碼搞定博客訪問量統計
歡迎大家關注我的個人博客
或微信掃碼關注我的公眾號
總結
以上是生活随笔為你收集整理的Jlink使用技巧之读取STM32内部的程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 士不可不弘毅(士不可以不弘毅的意思)
- 下一篇: 图片反色