關峰,謝曉明
(北京化工大學信息科學與技術學院,北京100029)
ARM芯片作為嵌入式系統的主流芯片,已經廣泛應用于手機、路由器及其他工業和民用電子設備[1]。在ARM處理器得到越來越多的應用的同時,如何防止黑客拷貝ARM內部程序、竊取核心代碼,防止開發人員花費大量金錢和時間研發出的產品被非法人員一夜之間仿冒的事情發生,已成為亟待解決的問題。
保護嵌入式產品內部程序不被竊取的方法,總體上有軟件加密和硬件加密兩大類。軟件加密主要有加密鎖定位、加密字節、偽指令等方法。事實上,由于存儲器中程序總體是反匯編可讀的,攻擊者借助專用設備,便可以而破解芯片內程序,得到程序源代碼[2]。甚至不需要得到源碼,只需要得到存儲器上的二進制文件,將其復制到同型號設備中,就可以得到同樣功能的設備。硬件加密方法,往往采用專用的加密卡或加密芯片的方式,通過相應的傳輸協議及硬件電路完成加密[3]。但是,硬件加密方案會增加設備制造的復雜度和設備成本。
本文以ARM Cortex-M3芯片為例,設計并實現了一種基于分散加載的ARM芯片加密方案,此方案將經過加密的程序燒寫到存儲器上,從而完全打亂程序在存儲器上的正常順序,使其反匯編完全不可讀。以ARM芯片內全球唯一的序列號為密鑰,確保被整片復制的程序無法正確運行在其他設備上。此方案充分利用了ARM芯片的特點,為嵌入式產品開發工程師提供了一種保護知識成果的方案。
在嵌入式系統中,其存儲系統常常由FLASH、ROM、RAM等存儲器組成,它們被定位于不同的物理地址范圍。為了讓軟件更好地訪問和利用這些存儲器并讓系統高效的運行,ARM鏈接器提供了分散加載機制。在鏈接時可以根據分散加載文件中指定的存儲器分配方案,將可執行鏡像文件分為指定的分區并定位于指定的存儲器物理地址。當嵌入式系統在重新上電或復位時,首先對處理器內部寄存器執行初始化,然后執行ROM存儲器的自舉代碼,根據鏈接時的存儲器分配方案,將相應代碼和數據從加載地址復制到運行地址。這樣,定位于RAM存儲器中的代碼和數據就在RAM中執行,而不再從ROM存儲器中執行[4]。利用分散加載的特性,可以在加載域指定的ROM中存儲經過加密的二進制程序,而在對應的運行域RAM中將其還原,RAM的掉電易失性使源程序不被暴露。
ARM Cortex-M3芯片有32KB本地靜態RAM和512KB片內FLASH[5],其地址映射如圖1所示。

圖1 ARM Cortex-M3存儲器映射
由于ARM芯片程序中有大量的公共庫程序和簡單的流程控制程序,所以不需要加密全部程序,只要加密核心代碼即可。本文把ARM程序抽象成三大部分:預處理部分、核心程序部分、其他程序部分。預處理部分最先執行,負責與上位機軟件交互、解密加載域并寫入對應運行域中。核心程序是芯片代碼中需要加密部分,其加載域上存儲其密文。其他程序為芯片代碼中的公共庫程序或簡單流程程序,其加載域上直接存儲其明文。本文對存儲器的規劃如表1所列,值得注意的是核心程序的運行域在RAM上。根據分散加載文件的編寫規則和表1,編寫相應分散加載文件后,使用集成開發環境編譯并下載程序,預處理程序、核心程序、其他程序將會被燒寫到相應加載域,并且得到三個與之對應的二進制文件。

表1 CortexM3存儲器規劃
軟件加密的目的就是要千方百計造成機器碼的錯誤反匯編或反匯編后的程序不可讀,所以可以考慮把程序加密后再燒寫到FLASH中,達到完全打亂FLASH程序順序的作用。這樣,不法分子從FLASH中提取的程序,反匯編的結果將是完全不可分析的。被加密的程序運行前,將其解密后到復制到分散加載文件指定的位于RAM的運行域,由于RAM的掉電丟失性,正確的二進制程序將被隱藏。到此為止,已經能夠阻止不法分子通過反匯編得到程序的源代碼。然而,仍然沒有防止仿制者通過非法手段整片復制芯片程序到同型號的其他芯片,從而快速生產出同類電子產品。通過對ARM芯片的分析發現,在所有ARM芯片內部寄存器中,都有一組128位全球唯一芯片序列號[5]。并且此序列號只能被讀取,不能被修改,可以以此序列號作為加密算法的密鑰,這樣,由于所有ARM設備的密鑰都不同,不法人員通過簡單拷貝芯片程序給其他同類型芯片,會因為密鑰不匹配,得不到正確的運行域程序,使整片復制芯片程序的竊取方法失敗。
本文的加密方案總體思想如圖2所示。首先以分散加載方式規劃存儲器,正常加載程序。然后將核心程序以ARM序列號為密鑰,加密后燒寫到分散加載文件指定的加載域上,以密文形式覆蓋原有明文。最后,在預處理程序中提取設備序列號,以此為密鑰進行解密,將得到的結果復制到分散加載文件指定的運行域中。

圖2 加密方案
在數據加密認證的過程中,選擇合適的加密算法是研發工程師首先要考慮的事情。選擇加密算法時要結合自身需求,從算法執行速度、安全性、資源占用性等方面進行綜合考慮。對稱加密算法是常用于嵌入式設備加密的主要方法,其中廣范應用的對稱加密算法有AES算法和DES算法。DES算法有不能對抗差分和線性密碼分析、對系統資源要求高等缺點[6]。2000年,美國國家標準局正式宣布AES算法為新的高級加密標準。AES優點如下:運算速度快,對內存要求低,高安全性等。由于AES算法可以提供128位密鑰,所以128位ARM芯片全球唯一序列號不做任何處理便可作為AES算法密鑰,本文選用AES算法作為核心程序加密算法。
根據表1的分散加載方案下載程序到存儲器芯片中后,包括核心程序在內的所有程序在FLASH上都以明文存儲。要使核心程序不被竊取,必須對其加密處理,以密文覆蓋原有明文。在實現時,要設計一個簡單的上位機軟件,其與芯片中預處理程序配合完成芯片加密工作。上位機可以用MFC或C#開發,筆者以MFC方式實現的上位機軟件界面,如圖3所示。

圖3 上位機軟件界面
上位機可以采用無線、串口、USB接口等任何方式與ARM微處理器進行通信。上位機首先判斷是否與ARM設備連接,筆者采用的方法是上位機向微處理器發送CONNECT宏命令,如果從ARM設備收到同樣的CONNECT宏命令,則可以判斷ARM設備與上位機成功連接。之后,上位機自動發送GET_SERIAL_NUMBER宏命令讓微處理器調用內置函數讀取芯片全球唯一序列號,并將此序列號發送給上位機。選擇核心程序對應的二進制文件進行加密處理,上位機會調用AES算法,以芯片全球唯一序列號為密鑰產生經過加密的核心程序文件。選擇產生的加密核心程序文件,將分散加載文件中核心程序的加載地址和運行地址分別填入上位機軟件相應控件。最后,上位機會把經過加密的核心程序文件發送至ARM設備中。芯片中預處理程序接收到加密核心程序后,以在應用編程(IAP)方式將經過加密的核心程序覆蓋未加密核心程序的加載域。除此之外,發送加密核心程序的同時,燒寫地址(ROM_CORE_ADDR)、執行地址(RAM_RUN_ADDR)以及核心程序代碼大小(CORE_SIZE)三個參數被一起發送給ARM設備,預處理程序解密時要使用以上三個參數。核心程序加密流程如圖4所示,執行每一步的結果都會在上位機上得到顯示。
為使此加密方案通用性更強,將與上位機通信的程序和解密程序全部放到預處理程序部分,只要在ARM程序的起始部分添加預處理程序,所有ARM系列微處理器都可以應用此加密方案。預處理程序執行時,首先檢測ARM設備是否與上位機相連,如果相連,執行與上位機交互相關程序,如上文提到的接收核心程序密文,以IAP方式覆蓋核心程序加載域明文、ARM序列號發送等。如果ARM設備沒有與上位機連接,進行運行域解密工作,首先調用ARM芯片提供的API提取內部全球唯一序列號(SERIAL_NUMBER),然后以此為密鑰,對核心程序加載域(ROM_CORE_ADDR)上的程序執行AES解密,最后將結果復制到核心程序運行域(RAM_RUN_ADDR)。關鍵程序描述如下:

圖4 核心程序加密流程

采用迭代的方法,每次從核心代碼加載域提取128位,將其解密后復制到核心代碼運行域,迭代的次數由核心程序代碼大小決定。無論要解密的核心程序有多大,此方案只需32字節的額外存儲空間。另外,應用ARM處理器特有的32位指令集,可以大幅加快AES解密算法的執行速度。將解密后的核心程序復制到相應運行域后,就可以跳轉出預處理程序,執行正常的功能程序。運行時解密過程如圖5所示。
對嵌入式軟件而言,沒有辦法做到絕對的保密,只能采取合適的加密技術盡量提高解密成本,只要能使剽竊者望而卻步,就是成功的加密方法[7]。本文提出的基于分散加載的ARM芯片軟件加密方法大大增加了剽竊者破解系統的難度和成本,會使剽竊者感到得不償失而放棄解密,從而有效地保護開發者的勞動成果。

圖5 運行時解密過程
本文提出的加密方案較高安全性主要體現在:芯片內部序列號的全球唯一性,以及以此序列號為密鑰,應用高強度加密算法進行加密后存儲器核心程序反匯編完全不可讀。首先,即使黑客通過非法手段將整個芯片程序復制到另一個同型號的芯片中,由于兩個芯片內的全球唯一序列號不同,運行過程中解密得到的程序完全不可運行。其次,即使黑客通過專業手段,從芯片中得到了程序的二進制文件,由于存儲器上核心代碼已經經過了AES加密,此文件經過反匯編是完全不可讀的。
本文提出的基于分散加載的ARM芯片軟件加密方案安全易用,克服了其他軟件加密方法不能同時防止代碼拷貝和代碼竊取的不足,避免了外擴硬件加密芯片和加密電路給系統帶來的高成本和復雜性。筆者已經將該方案應用于自身開發的產品中,運行效果良好。本文提出加密方案,可以應用于ARM系列所有芯片,在不影響芯片內部程序整體功能的情況下,為從事嵌入式產品開發的技術人員提供了一種保護知識成果的有效途徑。
[1] 黃一平,農麗萍,蘇檢德,等.ARM微控制器代碼非法復制技術研究與應用[J] .計算機工程與科學,2011,33(12):17-20.
[2] 李國華.單片機破解方法及加密策略[J] .科技創新導報,2005(5):83-84.
[3] 徐亮.嵌入式加密卡設計[D] .大連:大連海事大學,2009.
[4] 夏爽.ARM處理器的分散加載及特殊應用研究[J] .單片機與嵌入式系統應用,2009(4):36-39.
[5] NXP Semiconductors.LPC17xx user manual Rev.2,2010.
[6] 師攀攀.基于多核的AES算法的并行化與實現[D] .鄭州:鄭州大學,2012.
[7] 賈金玲.單片機應用系統的加密技術研究[J] .四川理工學院學報,2005,18(3):8-11.