大家都知道,單片機應(yīng)用系統(tǒng)由硬件電路與控制程序兩部分組成,盡管硬件電路部分同樣凝聚了設(shè)計者的心血,也體現(xiàn)了設(shè)計者創(chuàng)造性勞動成果,但卻無密可守,惟一有保密可能的就是控制程序部分。如何完善控制程序的加密功能,防止他人破解、盜取、復(fù)制單片機應(yīng)用系統(tǒng)中的控制程序代碼成了單片機應(yīng)用系統(tǒng)開發(fā)人員和生產(chǎn)廠家保護自己知識產(chǎn)權(quán)不被侵犯的關(guān)鍵措施之一。
我們在分析傳統(tǒng)單片機控制程序軟件加密技術(shù)和硬件加密技術(shù)的基礎(chǔ)上,探索如何充分利用單片機芯片新增的硬件功能,提出了基于單片機芯片身份識別碼(即芯片惟一 ID號)、片內(nèi)RC振蕩器頻率離散性、上電標志等多種單片機控制程序的加密策略。
一、新型MCU芯片特征與傳統(tǒng)軟件加密方式的局限性
1、新型MCIJ芯片特征
近年來,單片機技術(shù)有了長足的進步,實現(xiàn)了真正意義上的單片化,主要體現(xiàn)在:支持ISP、ICP、IAP編程方式的Flash ROM存儲器已逐漸成為單片機芯片內(nèi)部程序存儲器的主流,對于MCS-51兼容芯片來說,也無須通過總線方式擴展外部程序存儲器:內(nèi)置了1一2個RC振蕩器(作看門狗計數(shù)器時鐘或系統(tǒng)主時鐘)。為保護片內(nèi)控制程序代碼的安全,除了進一步強化加密鎖定位功能外,部分廠家的MCU芯片,如STC的MCS-51兼容芯片、ST公司Cortex-M3內(nèi)核的STM32系列芯片還增加了芯片身份識別碼。
2、傳統(tǒng)軟件加密原理及其局限性
傳統(tǒng)軟件加密方式歸納起來主要有以下幾種;
?。?)指令偽裝法
指令偽裝法叫的策略是在不影響控制程序運行條件下,改變匯編語言源程序中個別指令的形態(tài)來增大反匯編代碼閱讀的難度,歸納起來主要有以下幾種方式:
a、對采用CISC指令系統(tǒng)的MCU芯片,用DB偽指令在兩模塊間插入多字節(jié)指令(雙字節(jié)或3字節(jié))的操作碼,使反匯編后插入的操作碼字節(jié)與下一模塊第一條指令機器碼組合形成新的指令(甚至?xí)^續(xù)拆分源程序中第二條指令),使反匯編后看不到真實的匯編指令。
b、將長跳轉(zhuǎn)指令中的目標地址壓入堆棧,然后用RET指令代替無條件長跳轉(zhuǎn)指令LJMP。
c、將長跳轉(zhuǎn)指令中的目標地址送DPTR,然后用散轉(zhuǎn)指令JMP @A+DPTR代替無條件長跳轉(zhuǎn)指令LJMP。
不過,以上指令偽裝方式最多只能增加反匯編程序的閱讀難度,對破解后直接復(fù)制的盜取方式?jīng)]有任何防范作用,嚴格地說指令偽裝法并不屬于軟件加密范疇。
(2)破壞單片機芯片特定硬件資源加密法
破壞單片機芯片特定硬件資源加密法洲歸納起來主要有以下幾種:
a、故意燒壞數(shù)據(jù)總線。對于MCS-51兼容芯片,程序代碼總是從數(shù)據(jù)總線(PO口)讀出,因此人為地將12V高壓引到PO口某一I/O引腳,使其下拉N溝MOS管擊穿——對地短路。
這一方法對防止片內(nèi)代碼被非法讀出是有效的,但其局限性也非常明顯:一方面無法通過總線方式擴展并行I/O口(破壞了芯片內(nèi)部數(shù)據(jù)總線接口電路);另一方面,不能再通過并行編程方式更新片內(nèi)程序代碼;三是占用了芯片I/O引腳資源。
b、破壞芯片的加密鎖定位。由于Flasb ROM擦寫次數(shù)僅為10K左右,因此在運行中通過IAP編程方式對芯片加密位進行多次擦寫,使Flash ROM不能再擦除。這種方式的潛在危險是萬一加密位擦除失效后不能再寫入,則片內(nèi)代碼就很容易被讀出;再就是該方法也不能阻止探針攻擊法。此外,軟件設(shè)計者也不能更新片內(nèi)程序代碼。
c、破壞MCS.51的EA引腳。對于MCS-51兼容芯片來說,當(dāng)EA引腳為低電平時,將從外部ROM執(zhí)行程序。于是有設(shè)計者試flj破壞E引腳,使MCS-51芯片復(fù)位后總是從片內(nèi)執(zhí)行程序,但這一方法并不能阻止通過擦除芯片加密瑣定位方式讀取片內(nèi)代碼。
?。?)總線加密法
早期MCS-51芯片內(nèi)部程序存儲器容量小,甚至沒有內(nèi)部ROM,一般均需要通過總線方式擴展外部程序存儲器,于是出現(xiàn)了所謂的總線加密法。
總線加密法主要有地址總線亂序法、數(shù)據(jù)總線亂序法,或在MCU芯片地址總線與存儲器地址總線間增加可編程芯片(如GAL、FPGA等)俐,使MCU芯片地址與存儲器地址之間形成新的映射關(guān)系。這些加密方式對采用外設(shè)程序存儲器的早期的MCS-51應(yīng)用系統(tǒng)來說也許有一定的作用,但目前幾乎所有的單片機應(yīng)用系統(tǒng)都不再采用外部程序存儲器。
經(jīng)過長期實踐,針對目前主流單片機芯片硬件特征,本文提出了基于芯片身份識別碼、片內(nèi)RC振蕩器頻率離散性、上電標志等3種實用的單片機控制程序加密方式。
二、基于芯片身份識別碼的加密方法
為提高片內(nèi)程序代碼的安全性,最近上市的某些MCU芯片,如STC公司2009年后推出MCS-51兼容芯片、ST公司的STM32系列芯片等每一芯片內(nèi)部均具有惟一的芯片ID號。因此,在控制程序中可充分利用這一功能完善控制程序代碼的保護,該加密方式的加密步驟可按圖1所示進行。
設(shè)置首次上電標志的目的是為了便于判別編程后是否開機過,第一次上電時讀出并保存芯片的ID號。為防止攻擊者通過仿真方式找到芯片ID號信息,一般不宜直接存放ID號的原碼,而是經(jīng)過相應(yīng)的加密處理后再分散存放到不同的Flash ROM存儲單元中;校驗方式也不宜采用常見、簡單的校驗規(guī)則,如和校驗等,應(yīng)盡可能采用某些特殊的檢驗方式,使攻擊者不能迅速確定校驗算法。
為防止攻擊者獲取控制程序片段中有用代碼,一旦發(fā)現(xiàn)ID號不符,最簡單辦法就是借助IAP編程方式刪除控制程序代碼,當(dāng)然也可以隨機改寫控制程序代碼中的1~2K字節(jié),如圖1所示。
三、基于片內(nèi)RC振蕩器頻率離散性的加密方法
具有惟一ID號的MCU芯片加密容易,破解成功率很低。但由于生產(chǎn)成本、專利限制等原因,許多中低檔MCU芯片,如大部分廠家的MCS-51兼容芯片、PIC系列芯片,甚至最近上市的STM8S系列芯片都沒有惟一芯片ID號功能。對于這類芯片,如果內(nèi)部含有作為看門狗計數(shù)器時鐘或喚醒時鐘的RC振蕩器,如Philips公司的P89LPC900系列MCS-51兼容芯片、STM8S系列芯片、PIC16/18系列芯片等均內(nèi)置了一定數(shù)量的RC振蕩器。設(shè)計者可充分利用RC振蕩器頻率離散性生成芯片ID號,提高片內(nèi)控制程序代碼的安全性。
1、用RC振蕩器頻率作為芯片ID號
這一加密方式的加密原理大致如下:
(1)復(fù)位后啟動MCU芯片的某一定時器測量RC振蕩器的頻率。只要定時器計數(shù)脈沖來自精度與穩(wěn)定性都很高的外部石英晶體振蕩器,則頻率測量誤差是可控的,也不會很大。
(2)考慮到RC振蕩器輸出信號頻率受環(huán)境溫度影響較大,應(yīng)考慮溫度變化、晶振頻率誤差等對測量結(jié)果的影響。例如STM8S系列MCU芯片內(nèi)部低速RC振蕩器標稱頻率為128KHz~12.5%,通過定時器TIM3測出某一特定芯片內(nèi)部RC振蕩器頻率為OxID4ED(即120 045 Hz),則可將OxOID4ED作為該芯片的ID號。大量實驗統(tǒng)計表明開機60秒后(上電延遲一定時間后測量的目的是為了等待MCU芯片內(nèi)部溫度穩(wěn)定,即盡量減小環(huán)境溫度對結(jié)果的影響)同一芯片頻率測量誤差在1%以內(nèi)(不同芯片在不同環(huán)境下的頻率誤差可能略有不同,可通過多次實驗確定。確定頻率誤差范圍的原則是同一芯片保證每次上電復(fù)位后測到的數(shù)據(jù)均在誤差允許范圍內(nèi),因此允許誤差不宜太?。涣硪环矫?,不同芯片頻率相同的可能性又要盡可能小,因此頻率誤差允許范圍也不能太大)。因此,只要上電后測到的RC振蕩器頻率與ID號相比,誤差在1%以內(nèi)即認為合法,反之視為非法。
該加密方式流程大致如圖2所示。盡管不能排除兩芯片頻率接近的情形,但如果破解后的程序代碼有50%或以上不能運行,那么盜版者就會煩惱萬分,知難而退。
采用該加密方式對以STM8S207RB單片機芯片作控制核心的某型防盜報警器的實驗統(tǒng)計結(jié)果如表l所示??梢娭灰l率誤差取1—2%之間,代碼復(fù)制后有50%以上的芯片不能正確運行。
?。?)用RC振蕩器頻率校正值作為芯片ID號
部分廠家MCU芯片,如Microchip公司的PIC16/18系列、Philips公司的P89LPC900系列等內(nèi)置的RC振蕩器有頻率校正值(保存在相應(yīng)的寄存器或片內(nèi)程序存儲器特定單元中)。在實踐中發(fā)現(xiàn)不同芯片的頻率校正值有差異。對于具有這一功能的芯片,可將RC振蕩器頻率校正值作為芯片的ID號,完善控制程序代碼的加密功能(操作流程與圖1相似)。
盡管頻率校正值一般在8位以內(nèi),但破解后的控制程序代碼有50%以上不能運行就達到目的了。該加密方式實驗統(tǒng)計結(jié)果如表2所示,可見頻率校正值長度越大,代碼復(fù)制的成功率就越低。
四、基于上電標志的加密方式
基于上電標志的加密方式可概括為“設(shè)置上電標志一檢查芯片加密狀態(tài)一檢查上電標志一隨機改寫控制程序代碼”,主要用于保護既沒有芯片惟一 ID號,也沒有片內(nèi)RC振蕩器的低檔MCU芯片的控制程序代碼不被復(fù)制。
1、加密過程
基于上電標志的加密過程如下。
?。?)在上電復(fù)位后,開中斷前,先讀出Falsh ROM狀態(tài)寄存器,確認芯片的加密狀態(tài)。
(2)如果芯片加密狀態(tài)正確,則檢查首次上電標志(為防止誤判,往往選擇具有一定特征的字符串作為首次上電標志)是否存在:如果首次上電標志不存在,則判定為第一次上電,設(shè)置首次上電標志后進入正常的運行狀態(tài)。
反之,如果芯片加密狀態(tài)不正確,可根據(jù)首次上電標志是否存在進行相應(yīng)處理:如果首次上電標志不存在,則表明芯片從未上電過,芯片未加密的原因可能是編程時漏選了加密鎖定位,應(yīng)進入IAP編程狀態(tài),對芯片進行加密操作。如果加密成功,設(shè)置了首次上電標志后,進入正常的運行狀態(tài);如果首次上電標志存在,說明芯片曾經(jīng)上電運行過,加密位狀態(tài)不正確,很可能是加密位被人為破壞,應(yīng)立即啟動某一定時器(目的是為了獲得隨機數(shù)),然后進入IAP編程狀態(tài),隨機改寫指定程序段內(nèi)數(shù)十到數(shù)百字節(jié)(不必擦除改寫字節(jié)所在扇區(qū),將待改寫字節(jié)內(nèi)的“1”變?yōu)椤?一即可)破壞應(yīng)用程序代碼的完整性,然后關(guān)閉中斷進入死循環(huán)狀態(tài)或復(fù)位退出。
該加密方法具體的加密流程如圖3所示。
這種隨機改寫程序代碼的加密方式具有很大的迷惑性;一方面,通過反匯編方式無法獲得完整的源程序;另一方面,如果被隨機改寫的代碼屬于某一非主功能模塊,則破解后的程序運行似乎正常,但它確實是一個不完整、運行后果難以預(yù)料的程序。
?。?)代碼檢查與生成
為防止不法分子,通過反匯編、跟蹤執(zhí)行方式找到并刪除隨機改寫程序段內(nèi)的指令系列,可將改寫程序代碼段內(nèi)的指令機器碼讀出,并以數(shù)表方式存放在主程序中。然后在主程序中的適當(dāng)位置檢查隨機改寫程序段代碼的有效性,一旦發(fā)現(xiàn)代碼無效,則進入IAP編程方式,重新生成改寫程序段代碼。
單片機應(yīng)用程序加密與解密技術(shù)都在進步,可以說幾乎沒有哪一種加密技術(shù)絕對安全可靠。只能在實踐中根據(jù)所選單片機芯片的硬件特征,有選擇地交叉組合使用兩種或兩種以上的加密手段,以增大解密難度,并盡可能破壞解密版代碼的完整性。但無論采用何種加密方式都應(yīng)盡量避免增加系統(tǒng)的硬件成本、占用MCU芯片的硬件資源,此外也不能明顯降低系統(tǒng)的運行效率。本文介紹的3種加密方式,盡管不能完全避免盜版者的攻擊,但多年實踐表明交叉組合使用這些加密手段確實能有效提高MCU芯片控制程序代碼的安全性,控制程序代碼被成功盜取的幾率很小,且不占用任何硬件資源,也沒有額外增加MCU應(yīng)用系統(tǒng)的硬件成本。
評論