1. 程式人生 > >Jlink使用技巧之讀取STM32內部的程式

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”,可獲得JLink_Windows_V614b.exe軟體下載連結。


歷史精選文章:


歡迎大家關注我的個人部落格

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