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

打開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


歷史精選文章:


歡迎大家關注我的個人博客

或微信掃碼關注我的公眾號


免責聲明!

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



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