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