新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于STM32F103的ID號對應(yīng)用程序的保護方法

        基于STM32F103的ID號對應(yīng)用程序的保護方法

        作者: 時間:2018-08-01 來源:網(wǎng)絡(luò) 收藏

        本文引用地址:http://www.104case.com/article/201808/384805.htm

        由于現(xiàn)在市場激烈競爭、混亂的市場機制及已失去的市場道德,迫使在產(chǎn)品設(shè)計時,必需要考慮到對產(chǎn)品的保護,以防產(chǎn)品的技術(shù)被第三方所用。無論是從硬件方面來保護,還是從軟件方面來保護,都無法保證產(chǎn)品100%的安全。由于嵌入式系統(tǒng)的特點就是軟件、硬件相結(jié)合,才具有實際的意義,失去任何一個平臺都是廢品一堆,因此將系統(tǒng)的軟件、硬件結(jié)合起來對產(chǎn)品進行加密保護,可靠性會大大地增加。STM32F103系列ARM處理器芯片就內(nèi)置了唯一的96位ID號,同時也有以后備電池為電源的SRAM,還有入侵檢測(打開機殼等)功能,以提供這方面的應(yīng)用需求。

        因此可以有幾種產(chǎn)品保護的方法:

        1、 將ID號寫入內(nèi)部Flash貯存器

        如使用方法,基本思路為:程序首次運行,則檢測ID號存貯區(qū)的Flash的數(shù)據(jù),以判斷是否需要將該系統(tǒng)的CPU的ID號更新到Flash中。當(dāng)以后系統(tǒng)再重新啟動時,就直接讀取Flash中的ID號并與本機CPU的ID號進行比較。但有一點是,該存貯區(qū)的數(shù)據(jù)不能單一化存貯,最好是與系統(tǒng)校正、系統(tǒng)設(shè)置、系統(tǒng)參數(shù)等數(shù)據(jù)混合存放在一起,這時,系統(tǒng)離開這組數(shù)據(jù),也就不會運行了。該數(shù)據(jù)在出廠時由工廠指定寫入。這樣一來,就算讀出CPU中的程序代碼,反編譯后,也不清楚這組數(shù)據(jù)的目的,從而起到對應(yīng)用代碼的保護作用。

        2、 將ID號寫入SRAM,并配合電池電源及入侵檢測

        該方法可能相對復(fù)雜一些。基本思路為:程序首次運行后,設(shè)置好后備電源保護的RAM區(qū),并讀出CPU的ID號存貯起來,同時在應(yīng)用程序中設(shè)置入侵檢測功能。在系統(tǒng)正常運行的情況下,RAM中的ID號始終都能與本機的ID號一致,如有侵入,則可觸發(fā)相應(yīng)的中斷,刪除RAM中的ID號,但不要清除系統(tǒng)中運行狀態(tài),從而引導(dǎo)應(yīng)用程序進入錯誤的運行狀態(tài),或觸發(fā)系統(tǒng)內(nèi)核刪除代碼進行“自殺”,以保證系統(tǒng)軟件的安全。

        對于上述的兩種方法中,如何判定系統(tǒng)為第一次啟動,只能根據(jù)各自的思路來作為一個準(zhǔn)則,非常規(guī)的方法,應(yīng)該會相對好一些。而這種應(yīng)用運態(tài)讀入ID號的方法,不同的CPU有不同的校驗,所以破解CPU的ID號也就失去了任何意義了。

        應(yīng)用的例子:智能液位控制器

        應(yīng)用的是第一種方法:在Flash區(qū)域,我開了一個扇區(qū),用來存貯我的標(biāo)識符(廠家標(biāo)識符)、系統(tǒng)參數(shù)、CPU-ID、系統(tǒng)是否是第一次運行、自定義數(shù)據(jù)的CRC代碼。我的代碼程序有兩部份,一部份是應(yīng)用程序,第二部份是除上述系統(tǒng)參數(shù)及CPU-ID以外的數(shù)據(jù),而系統(tǒng)首次運行標(biāo)識是一組特定字符。系統(tǒng)運行時,首先判斷廠家標(biāo)識符,接著判斷系統(tǒng)是否是首次運行,如不是,更新CPU-ID,啟始化系統(tǒng)運行參數(shù),最后破壞掉系統(tǒng)首次運行標(biāo)識數(shù)據(jù),并將新的數(shù)據(jù)存貯起來。這之后系統(tǒng)再次運行,則在這一區(qū)域就多了很多數(shù)據(jù)(不看代碼,我自己也不知道這些數(shù)據(jù)是些什么東西),每次啟動,系統(tǒng)都會校驗CPU-ID,從面每一個系統(tǒng),在每一臺設(shè)備上都有一個唯一的標(biāo)識符。

        可能的破解分析:

        1、 如有人直接抄板后,讀出CPU程序后,只寫第一部份數(shù)據(jù),不寫入第二部份數(shù)據(jù),則系統(tǒng)無法識別廠家標(biāo)識符,則系統(tǒng)不運行。

        2、 如有人直接抄板后,讀出CPU全部程序數(shù)據(jù),則第二部份數(shù)據(jù)對于新的系統(tǒng)無效,程序不會正常運行

        3、 如有人想分析第二部份數(shù)據(jù),也不會有任何結(jié)果。因為離開原來的系統(tǒng),數(shù)據(jù)無任何意義。

        4、 由于CPU-ID號是無法再重新更改的,CPU-ID無法進行復(fù)制而使其一致。

        以上的方法,僅是個人的一些思維方式而已,是否有效,還需要各位提出各自的意見,來整改修繕以達到較好的一種效果。對于如何更有效的對產(chǎn)品進行保護,相信不同的人、不同的應(yīng)用,會有不同的處理方法。沒有絕對的保護,只有更多的方法,以萬變應(yīng)萬變了。

        讀取STM32F103的ID號的代碼如下:

        /*

        功能描述: 讀取STM32F103 CPU序列號

        輸入?yún)?shù):無

        輸出參數(shù):返回STM32處理器96位長度的序列號

        聯(lián)合嵌入式中心提供:http://www.uectr.com

        */

        void Get_SerialNum(unsigned int* SerialID)

        {

        SerialID[0] = *(unsigned int*)(0x1FFFF7E8);

        SerialID[1] = *(unsigned int*)(0x1FFFF7EC);

        SerialID[2] = *(unsigned int*)(0x1FFFF7F0);

        }

        //使用方法:

        u32 Device_Serial[3];//用以存貯96位ID號

        Get_SerialNum(Device_Serial);//讀取ID號



        關(guān)鍵詞: 單片機 程序保護

        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 锡林浩特市| 武平县| 滁州市| 富宁县| 鹰潭市| 平湖市| 桦川县| 楚雄市| 红安县| 合阳县| 晋中市| 信阳市| 江津市| 宜兰县| 定西市| 北安市| 阜阳市| 静安区| 重庆市| 合山市| 长沙县| 临泉县| 昌乐县| 铁岭市| 山阴县| 梅河口市| 胶南市| 虎林市| 东乡县| 仙居县| 天祝| 博罗县| 寿阳县| 通山县| 马公市| 日照市| 竹北市| 建湖县| 成武县| 岳池县| 兰坪|