論微控制器程式韌體保護的重要性和方法

2021-10-04 17:19:02 字數 2590 閱讀 3916

防止抄襲和抄襲本身本來就是一對對立的陣營,正如細菌和抗生素一樣,我們抵抗細菌的手段在不斷更新,細菌也沒閒著啊,在忙著進化。隨著開發成本的提高,電子產品抄板市場也變得很大,罈子裡有人說深圳解密拷貝出stm32韌體只需要五千元,不知道是不是真的。

大致總結了一下目前很多網友和工程師朋友都提到的方法

1、使用j-flash燒錄完程式點secure chip設定保護。

2、**裡對flash加鎖。

3、**裡對映jtag和swd相關的引腳為別的功能,甚至直接從物理上剪斷除錯引腳或者燒毀除錯口

4、使用微控制器唯一id號進行判斷,相當於繫結硬體,再高階點的做法是利用id加密,密文儲存到乙個位置,程式中再解密出來和明文的id號比較。

5、對程式全部或者關鍵位置進行crc校驗。

6、自己開發具有bin檔案加解密的上位機公升級或燒錄程式,或者使用專用的加解密燒錄器,這個辦法主要是針對需要外發bin檔案給客戶進行公升級的情況。

再說破解:先表明乙個觀點,我覺得這也是幾乎所有同行的共識,就是世上沒有不能破解的,只是時間與成本的問題。

針對以上保護方法闡述一下可能的破解方法:

首先第一類讀出程式類:

1、對於第1點、第3點:據說有漏洞可以解除限制,你讓我讀不出來是吧,好,據說有非常有效的讀出辦法,那就是磨開晶元給儲存器拍照,然後用專門的識圖軟體讀出各個位置的0和1。我想說當初想到這個的真是個狠人。

2、對於第2點:就更簡單了,你以為**起作用了,jtag口不能用了,你想少了,本人親測可以利用微控制器復位間隙進入swd模式可以讀韌體,猜想原因可能是微控制器內部還有一段不可擦寫的bootloader在執行,這個空檔swd還是可用的。

第二類就是讀出資料以後:

3、對於第4點:我在下面已經說的很明白了,像判斷語句,死迴圈,用明文進行判斷比較之類的太容易看出來位置了,破解者可以方便的定位到這個位置,然後修改bin檔案,跳過這裡。

4、對於第5點:對程式校驗可以知道程式是否被修改過,這個安全性可能稍微高些,但是如果校驗演算法簡單,別人修改了程式以後,同樣的方法可以把正確的校驗值填充好。

5、對於非聯網產品,不具備ota能力,需要客戶自己公升級bin檔案這種情況沒有辦法,我們總不可能叫客戶從全國各地郵寄回來公升級。這種情況下破解者知道了加密原理也是容易破解的,最好使用非常規的加密方式或者有更好的手段。

1、盡可能的綜合上面提到的所有方法對最終發布的韌體進行保護,增加破解的難度,當然也可以根據代價或者方便維護性進行選擇,多多益善,尤其是對於軟體高附加值的產品,比如你的軟體具有行業先進性,先進的某些演算法或者資料。

1、在程式**中植入混淆一段公司的logo,最好經過aes加密的或者經過特殊編碼的,比如base64,放到某個大的陣列裡,這個陣列會被程式裡用到,但是裡面又混淆了這些看似無關的資料。為什麼要這麼做呢,這樣太有用了,到時候你要說別人盜版你的韌體,你得有證據啊,可以當著專門的鑑定機構的面,大大方方的還原這個logo。

2、不要在判斷程式合法性的關鍵**上使用立即數或者直接能看出來的字串,比如以下程式,另外大家都知道微控制器的唯一id號存放在什麼位址,這個位址也不要用立即數,用各種混淆的方法計算得到這個數,加減乘除,按位操作,最好讓自己看著**摸不著頭腦,更不要說看著二進位制的破解者了。

if( 0xfe != flag)

//改進以後

unsigned char temp = 0;

unsigned char temp1 = get_value(addr1 + addr2); //混淆位址

unsigned char temp2 = get_value(addr4 - addr5); //混淆位址

unsigned char flag = get_value(addr3 * 2); //混淆位址

temp = temp1*2 + temp2 + 1; //混淆值

if( temp != flag) //其實用if這種方式也不太好,最好有更加精巧的判斷方式,比如a?b:c這樣的

if( 0 == strcmp(str , "hello"))

//改進

//把hello這個字串進行md5校驗存放,並且最好分開存在不同地方,用的時候再ram中拼接而成

3、不要在乙個地方對韌體合法性進行驗證,而且驗證不通過最好不要用while(1)之類的停止程式執行,因為破解者也容易找出這個位置,最好是讓程式繼續執行,但是引數不對,或者胡亂執行。

4、如果裝置會上網,或者裝置會不定期的上網,這個就好辦了,第一:網路資料可以直接用加密演算法或者直接使用mbedtls加密,就算抓到資料也不知道是啥,最好是動態秘鑰,隔一段時間變更,具體可以參考hotp和totp演算法,再此不多講。第二:伺服器最好能通過唯一id號對裝置進行資料庫匹配,拒絕未登記過的裝置。

5、真正的高手是設定一段門檻,讓程式似乎是破解了,似乎又沒被破解,讓你千辛萬苦歷經磨難終於讀出了韌體,燒錄進新的微控制器,居然可以執行,並且執行的好好的,還做了老化都沒問題,滿心以為終於可以了ok量產吧,大批量出貨,結果發現過了半個月或者乙個月,機關發作了,潘多拉的盒子關不住了,陸陸續續客戶都來退貨了,說產品不穩定,不可靠,然後你忙著出差解決問題,退款,結果有人找上門說你侵犯了智財權,並提供了你產品****的證據。其實都是預設的陷阱,等著你鑽進去套牢。

論部落格和程式設計的重要性

第一篇部落格,想了好久,不知道該寫些什麼。不止乙個人跟我說過,部落格很重要,對以後很有幫助。將你遇到的知識發到部落格上,不僅可以幫助你歸納總結,還可以幫助到別人,何樂而不為。前幾天我發現了 神奇的效果。在沒 有實訓之前,我一直都很為編寫 是為了寫題的,但是後來我想明白了,還可以做很多程式,比如 小遊...

程式猿 論學習方式的重要性

大家都知道,做我們開發這行的,最核心的競爭力就是學習能力。技術一直在變化,框架一直在更新,學還是不學。不學,你會落伍,學,太累了,根本學不過來。學習只要找對了方法,也沒那麼累。最好的學習方式那就是興趣驅使你去學習,但這種幾乎很少,還有一種就是群體學習,就是大家一起學習,有問題一起討論,這樣的方式學起...

微控制器和PC機之間的連線程式

pc計算機與微控制器串列埠通訊源程式下面是乙個微控制器與pc機通訊的程式,pc機程式用c語言來編寫,微控制器程式用組合語言來編寫1.pc機程式設計pc採用toubrc進行編寫。程式如下 include defineport0x3f8 利用串列埠1進行通訊 intch 15 main charc cl...