關(guān)峰,謝曉明
(北京化工大學信息科學與技術(shù)學院,北京100029)
ARM芯片作為嵌入式系統(tǒng)的主流芯片,已經(jīng)廣泛應(yīng)用于手機、路由器及其他工業(yè)和民用電子設(shè)備[1]。在ARM處理器得到越來越多的應(yīng)用的同時,如何防止黑客拷貝ARM內(nèi)部程序、竊取核心代碼,防止開發(fā)人員花費大量金錢和時間研發(fā)出的產(chǎn)品被非法人員一夜之間仿冒的事情發(fā)生,已成為亟待解決的問題。
保護嵌入式產(chǎn)品內(nèi)部程序不被竊取的方法,總體上有軟件加密和硬件加密兩大類。軟件加密主要有加密鎖定位、加密字節(jié)、偽指令等方法。事實上,由于存儲器中程序總體是反匯編可讀的,攻擊者借助專用設(shè)備,便可以而破解芯片內(nèi)程序,得到程序源代碼[2]。甚至不需要得到源碼,只需要得到存儲器上的二進制文件,將其復制到同型號設(shè)備中,就可以得到同樣功能的設(shè)備。硬件加密方法,往往采用專用的加密卡或加密芯片的方式,通過相應(yīng)的傳輸協(xié)議及硬件電路完成加密[3]。但是,硬件加密方案會增加設(shè)備制造的復雜度和設(shè)備成本。
本文以ARM Cortex-M3芯片為例,設(shè)計并實現(xiàn)了一種基于分散加載的ARM芯片加密方案,此方案將經(jīng)過加密的程序燒寫到存儲器上,從而完全打亂程序在存儲器上的正常順序,使其反匯編完全不可讀。以ARM芯片內(nèi)全球唯一的序列號為密鑰,確保被整片復制的程序無法正確運行在其他設(shè)備上。此方案充分利用了ARM芯片的特點,為嵌入式產(chǎn)品開發(fā)工程師提供了一種保護知識成果的方案。
在嵌入式系統(tǒng)中,其存儲系統(tǒng)常常由FLASH、ROM、RAM等存儲器組成,它們被定位于不同的物理地址范圍。為了讓軟件更好地訪問和利用這些存儲器并讓系統(tǒng)高效的運行,ARM鏈接器提供了分散加載機制。在鏈接時可以根據(jù)分散加載文件中指定的存儲器分配方案,將可執(zhí)行鏡像文件分為指定的分區(qū)并定位于指定的存儲器物理地址。當嵌入式系統(tǒng)在重新上電或復位時,首先對處理器內(nèi)部寄存器執(zhí)行初始化,然后執(zhí)行ROM存儲器的自舉代碼,根據(jù)鏈接時的存儲器分配方案,將相應(yīng)代碼和數(shù)據(jù)從加載地址復制到運行地址。這樣,定位于RAM存儲器中的代碼和數(shù)據(jù)就在RAM中執(zhí)行,而不再從ROM存儲器中執(zhí)行[4]。利用分散加載的特性,可以在加載域指定的ROM中存儲經(jīng)過加密的二進制程序,而在對應(yīng)的運行域RAM中將其還原,RAM的掉電易失性使源程序不被暴露。
ARM Cortex-M3芯片有32KB本地靜態(tài)RAM和512KB片內(nèi)FLASH[5],其地址映射如圖1所示。
圖1 ARM Cortex-M3存儲器映射
由于ARM芯片程序中有大量的公共庫程序和簡單的流程控制程序,所以不需要加密全部程序,只要加密核心代碼即可。本文把ARM程序抽象成三大部分:預(yù)處理部分、核心程序部分、其他程序部分。預(yù)處理部分最先執(zhí)行,負責與上位機軟件交互、解密加載域并寫入對應(yīng)運行域中。核心程序是芯片代碼中需要加密部分,其加載域上存儲其密文。其他程序為芯片代碼中的公共庫程序或簡單流程程序,其加載域上直接存儲其明文。本文對存儲器的規(guī)劃如表1所列,值得注意的是核心程序的運行域在RAM上。根據(jù)分散加載文件的編寫規(guī)則和表1,編寫相應(yīng)分散加載文件后,使用集成開發(fā)環(huán)境編譯并下載程序,預(yù)處理程序、核心程序、其他程序?qū)粺龑懙较鄳?yīng)加載域,并且得到三個與之對應(yīng)的二進制文件。
表1 CortexM3存儲器規(guī)劃
軟件加密的目的就是要千方百計造成機器碼的錯誤反匯編或反匯編后的程序不可讀,所以可以考慮把程序加密后再燒寫到FLASH中,達到完全打亂FLASH程序順序的作用。這樣,不法分子從FLASH中提取的程序,反匯編的結(jié)果將是完全不可分析的。被加密的程序運行前,將其解密后到復制到分散加載文件指定的位于RAM的運行域,由于RAM的掉電丟失性,正確的二進制程序?qū)⒈浑[藏。到此為止,已經(jīng)能夠阻止不法分子通過反匯編得到程序的源代碼。然而,仍然沒有防止仿制者通過非法手段整片復制芯片程序到同型號的其他芯片,從而快速生產(chǎn)出同類電子產(chǎn)品。通過對ARM芯片的分析發(fā)現(xiàn),在所有ARM芯片內(nèi)部寄存器中,都有一組128位全球唯一芯片序列號[5]。并且此序列號只能被讀取,不能被修改,可以以此序列號作為加密算法的密鑰,這樣,由于所有ARM設(shè)備的密鑰都不同,不法人員通過簡單拷貝芯片程序給其他同類型芯片,會因為密鑰不匹配,得不到正確的運行域程序,使整片復制芯片程序的竊取方法失敗。
本文的加密方案總體思想如圖2所示。首先以分散加載方式規(guī)劃存儲器,正常加載程序。然后將核心程序以ARM序列號為密鑰,加密后燒寫到分散加載文件指定的加載域上,以密文形式覆蓋原有明文。最后,在預(yù)處理程序中提取設(shè)備序列號,以此為密鑰進行解密,將得到的結(jié)果復制到分散加載文件指定的運行域中。
圖2 加密方案
在數(shù)據(jù)加密認證的過程中,選擇合適的加密算法是研發(fā)工程師首先要考慮的事情。選擇加密算法時要結(jié)合自身需求,從算法執(zhí)行速度、安全性、資源占用性等方面進行綜合考慮。對稱加密算法是常用于嵌入式設(shè)備加密的主要方法,其中廣范應(yīng)用的對稱加密算法有AES算法和DES算法。DES算法有不能對抗差分和線性密碼分析、對系統(tǒng)資源要求高等缺點[6]。2000年,美國國家標準局正式宣布AES算法為新的高級加密標準。AES優(yōu)點如下:運算速度快,對內(nèi)存要求低,高安全性等。由于AES算法可以提供128位密鑰,所以128位ARM芯片全球唯一序列號不做任何處理便可作為AES算法密鑰,本文選用AES算法作為核心程序加密算法。
根據(jù)表1的分散加載方案下載程序到存儲器芯片中后,包括核心程序在內(nèi)的所有程序在FLASH上都以明文存儲。要使核心程序不被竊取,必須對其加密處理,以密文覆蓋原有明文。在實現(xiàn)時,要設(shè)計一個簡單的上位機軟件,其與芯片中預(yù)處理程序配合完成芯片加密工作。上位機可以用MFC或C#開發(fā),筆者以MFC方式實現(xiàn)的上位機軟件界面,如圖3所示。
圖3 上位機軟件界面
上位機可以采用無線、串口、USB接口等任何方式與ARM微處理器進行通信。上位機首先判斷是否與ARM設(shè)備連接,筆者采用的方法是上位機向微處理器發(fā)送CONNECT宏命令,如果從ARM設(shè)備收到同樣的CONNECT宏命令,則可以判斷ARM設(shè)備與上位機成功連接。之后,上位機自動發(fā)送GET_SERIAL_NUMBER宏命令讓微處理器調(diào)用內(nèi)置函數(shù)讀取芯片全球唯一序列號,并將此序列號發(fā)送給上位機。選擇核心程序?qū)?yīng)的二進制文件進行加密處理,上位機會調(diào)用AES算法,以芯片全球唯一序列號為密鑰產(chǎn)生經(jīng)過加密的核心程序文件。選擇產(chǎn)生的加密核心程序文件,將分散加載文件中核心程序的加載地址和運行地址分別填入上位機軟件相應(yīng)控件。最后,上位機會把經(jīng)過加密的核心程序文件發(fā)送至ARM設(shè)備中。芯片中預(yù)處理程序接收到加密核心程序后,以在應(yīng)用編程(IAP)方式將經(jīng)過加密的核心程序覆蓋未加密核心程序的加載域。除此之外,發(fā)送加密核心程序的同時,燒寫地址(ROM_CORE_ADDR)、執(zhí)行地址(RAM_RUN_ADDR)以及核心程序代碼大小(CORE_SIZE)三個參數(shù)被一起發(fā)送給ARM設(shè)備,預(yù)處理程序解密時要使用以上三個參數(shù)。核心程序加密流程如圖4所示,執(zhí)行每一步的結(jié)果都會在上位機上得到顯示。
為使此加密方案通用性更強,將與上位機通信的程序和解密程序全部放到預(yù)處理程序部分,只要在ARM程序的起始部分添加預(yù)處理程序,所有ARM系列微處理器都可以應(yīng)用此加密方案。預(yù)處理程序執(zhí)行時,首先檢測ARM設(shè)備是否與上位機相連,如果相連,執(zhí)行與上位機交互相關(guān)程序,如上文提到的接收核心程序密文,以IAP方式覆蓋核心程序加載域明文、ARM序列號發(fā)送等。如果ARM設(shè)備沒有與上位機連接,進行運行域解密工作,首先調(diào)用ARM芯片提供的API提取內(nèi)部全球唯一序列號(SERIAL_NUMBER),然后以此為密鑰,對核心程序加載域(ROM_CORE_ADDR)上的程序執(zhí)行AES解密,最后將結(jié)果復制到核心程序運行域(RAM_RUN_ADDR)。關(guān)鍵程序描述如下:
圖4 核心程序加密流程
采用迭代的方法,每次從核心代碼加載域提取128位,將其解密后復制到核心代碼運行域,迭代的次數(shù)由核心程序代碼大小決定。無論要解密的核心程序有多大,此方案只需32字節(jié)的額外存儲空間。另外,應(yīng)用ARM處理器特有的32位指令集,可以大幅加快AES解密算法的執(zhí)行速度。將解密后的核心程序復制到相應(yīng)運行域后,就可以跳轉(zhuǎn)出預(yù)處理程序,執(zhí)行正常的功能程序。運行時解密過程如圖5所示。
對嵌入式軟件而言,沒有辦法做到絕對的保密,只能采取合適的加密技術(shù)盡量提高解密成本,只要能使剽竊者望而卻步,就是成功的加密方法[7]。本文提出的基于分散加載的ARM芯片軟件加密方法大大增加了剽竊者破解系統(tǒng)的難度和成本,會使剽竊者感到得不償失而放棄解密,從而有效地保護開發(fā)者的勞動成果。
圖5 運行時解密過程
本文提出的加密方案較高安全性主要體現(xiàn)在:芯片內(nèi)部序列號的全球唯一性,以及以此序列號為密鑰,應(yīng)用高強度加密算法進行加密后存儲器核心程序反匯編完全不可讀。首先,即使黑客通過非法手段將整個芯片程序復制到另一個同型號的芯片中,由于兩個芯片內(nèi)的全球唯一序列號不同,運行過程中解密得到的程序完全不可運行。其次,即使黑客通過專業(yè)手段,從芯片中得到了程序的二進制文件,由于存儲器上核心代碼已經(jīng)經(jīng)過了AES加密,此文件經(jīng)過反匯編是完全不可讀的。
本文提出的基于分散加載的ARM芯片軟件加密方案安全易用,克服了其他軟件加密方法不能同時防止代碼拷貝和代碼竊取的不足,避免了外擴硬件加密芯片和加密電路給系統(tǒng)帶來的高成本和復雜性。筆者已經(jīng)將該方案應(yīng)用于自身開發(fā)的產(chǎn)品中,運行效果良好。本文提出加密方案,可以應(yīng)用于ARM系列所有芯片,在不影響芯片內(nèi)部程序整體功能的情況下,為從事嵌入式產(chǎn)品開發(fā)的技術(shù)人員提供了一種保護知識成果的有效途徑。
[1] 黃一平,農(nóng)麗萍,蘇檢德,等.ARM微控制器代碼非法復制技術(shù)研究與應(yīng)用[J] .計算機工程與科學,2011,33(12):17-20.
[2] 李國華.單片機破解方法及加密策略[J] .科技創(chuàng)新導報,2005(5):83-84.
[3] 徐亮.嵌入式加密卡設(shè)計[D] .大連:大連海事大學,2009.
[4] 夏爽.ARM處理器的分散加載及特殊應(yīng)用研究[J] .單片機與嵌入式系統(tǒng)應(yīng)用,2009(4):36-39.
[5] NXP Semiconductors.LPC17xx user manual Rev.2,2010.
[6] 師攀攀.基于多核的AES算法的并行化與實現(xiàn)[D] .鄭州:鄭州大學,2012.
[7] 賈金玲.單片機應(yīng)用系統(tǒng)的加密技術(shù)研究[J] .四川理工學院學報,2005,18(3):8-11.