余祥 李強 何海洋
指揮信息系統(tǒng)是以軍事科學(xué)為基礎(chǔ),以軍事指揮體系為構(gòu)建框架,以指揮控制人員為核心,以提高指揮控制效能為目標,采用計算機技術(shù)、信息技術(shù)等,將各種指揮控制手段與指揮人員有機地結(jié)合起來,實現(xiàn)指揮信息的采集、收集、傳遞、處理和顯示,實現(xiàn)指揮決策的科學(xué)化的人–機系統(tǒng)[1].指揮信息系統(tǒng)軟件的安全與否關(guān)乎整個指揮信息系統(tǒng)的安全,以至于整個指揮決策的成敗.指揮信息系統(tǒng)軟件一旦被破解,將給指揮機構(gòu)帶來巨大損失.因此,對指揮信息系統(tǒng)軟件采取一定的保護措施,防止或延遲敵方對被保護軟件的攻擊,是非常迫切的研究課題.軟件保護技術(shù)就是為了防止非法用戶通過逆向工程、篡改、反編譯等技術(shù)來非法使用軟件、敏感數(shù)據(jù)及軟件版權(quán)等,而對軟件采取的多種保護技術(shù)的綜合技術(shù)[2].軟件保護技術(shù)對軟件安全的作用日益突出,逐漸成為軟件安全性的最后一道防線.
目前,對軟件的惡意攻擊主要通過3種方式:逆向分析(Reserve Analysis)、代碼篡改(Code Tamper)和軟件盜版(Software Piracy)[3].針對上述攻擊方式,許多軟件保護技術(shù)被提出用于保護軟件的安全,典型的技術(shù)包括以下幾種:
混淆技術(shù):將原始程序P轉(zhuǎn)換成新的程序P’.P與P’相比具有相同的外部行為,并且代碼安全性能更強[4].攻擊者將P’恢復(fù)成P所耗費的時間多于將P轉(zhuǎn)換成P’的時間.
防篡改技術(shù):通過檢查軟件程序是否被非法修改,檢測篡改后,軟件中的防篡改算法會執(zhí)行相應(yīng)的反制措施.防篡改技術(shù)主要有兩種實現(xiàn)策略,一是采取相應(yīng)機制增加篡改程序的難度,提高篡改者攻擊程序的成本;二是檢測篡改事件并采取應(yīng)對措施[5],比如,導(dǎo)致程序非正常運行等.
軟件水印技術(shù):通常分為水印(watermark)和指紋(fingerprint)兩個方面.兩者統(tǒng)稱為軟件水印,即不被感知地嵌入在軟件中的一段具有標識意義的信息[5].在必要的時候,可以從軟件中提取出這些特定的標識信息證明軟件的版權(quán)或是追溯軟件非法擴散的途徑.
基于硬件的保護技術(shù):通過一些可信硬件給數(shù)據(jù)、代碼或可執(zhí)行文件提供一個安全的環(huán)境,使被保護的軟件免于被逆向分析,不被篡改,或阻止代碼剽竊事件的發(fā)生[4].目前最常用的方法就是將加密鎖與軟件進行綁定并一起發(fā)布.
隨著軟件攻擊技術(shù)的快速發(fā)展,單純利用一種軟件保護技術(shù)已難以實現(xiàn)軟件的有效保護,為此,本文將混淆技術(shù)與加密鎖保護技術(shù)相結(jié)合,提出一種基于加密鎖的指揮信息系統(tǒng)軟件保護的方法,將軟件關(guān)鍵代碼進行隔離,并替換為加密鎖中虛擬機執(zhí)行系統(tǒng)中的指令在加密鎖中執(zhí)行,同時利用加密鎖對軟件關(guān)鍵數(shù)據(jù)進行加密并定時校驗,有效確保軟件安全.
加密鎖是為了防止軟件非法使用與程序進行綁定的硬件設(shè)備,其設(shè)計思想是:如果一個程序只是一大堆比特的話,復(fù)制它是很容易的一件事情,但是復(fù)制物理設(shè)備的難度就會大許多,成本也會非常高.要想讓程序運行,加密鎖就必須插在用戶的計算機上,這使得程序能夠周期地檢查它,確保正確的加密鎖一直被連在機器上面.程序會不斷地檢查加密鎖,如果沒有收到正確響應(yīng)的話,就會停止運行或使用其它方式懲罰用戶,基于加密鎖的軟件保護的原理流程圖如1所示.
圖1 基于加密鎖的軟件保護原理流程圖
本文在設(shè)計軟件保護方法時,考慮到指揮信息系統(tǒng)軟件的重要性,通過加密鎖進行內(nèi)嵌加密和代碼隔離的方法來保護軟件,同時在程序中調(diào)用加密鎖時,采用一定的代碼混淆技術(shù)進一步提高破解的難度,提高軟件的安全行.
軟件保護后的運行流程如圖2所示.軟件運行時,檢查加密鎖的插入狀態(tài),確認加密鎖插入后,獲取加密鎖的序列號并從加密鎖中讀取存儲的密鑰,在軟件中進行校驗,檢查加密鎖是否和軟件、計算機是一一對應(yīng)的關(guān)系,通過校驗后,軟件設(shè)置定時器(一般在5s以內(nèi))繼續(xù)正常運行,在運行到代碼隔離的部分時調(diào)用加密鎖執(zhí)行隔離的關(guān)鍵算法并將結(jié)果返回給軟件以繼續(xù)運行,定時器觸發(fā)后,繼續(xù)檢查加密鎖的有效性校驗,通過則繼續(xù)運行,否則提示用戶插入正確的加密鎖并重試,直至通過校驗或用戶放棄校驗退出軟件.
內(nèi)嵌加密需要有軟件的源程序,通過在源程序中調(diào)用加密鎖API函數(shù)檢查加密鎖有效性的方式保護軟件.這種加密方式靈活性好,隱蔽性高,加密強度較高.然而要最大程度發(fā)揮其保護能力,需要取決于具體的實施過程.
通過內(nèi)嵌加密將軟件、計算機和加密鎖進行一一綁定,確保每臺運行指揮信息系統(tǒng)軟件的機器只能在連接對應(yīng)的加密鎖的情況下才能正常運行軟件.通過獲取計算機硬件特征信息(如CPU序列號、硬盤序列號或網(wǎng)卡MAC地址等)計算得出機器特征碼,并將此特征碼通過加密算法(如MD5算法或RSA算法)加密后存儲在加密鎖中作為密鑰,同時考慮到加密鎖自身具有全球唯一的序列號,在軟件中寫入加密鎖序列號的校驗代碼,使加密鎖與軟件進行一一綁定.如此相當于在加密鎖中存儲了2個密鑰,一個是計算機的硬件特征信息,一個是加密鎖全球唯一序列號,通過加密鎖序列號的校驗和計算機硬件特征信息的校驗,有效防止了一個加密鎖在多臺計算機上使用和一套軟件在多臺計算機使用的問題,進一步提高了軟件的安全性.
內(nèi)嵌加密中調(diào)用函數(shù)庫的程度決定了被保護軟件的整體安全水平.內(nèi)嵌加密可以調(diào)用加密鎖廠商提供的API函數(shù),并嵌入到軟件代碼中,也可以根據(jù)驅(qū)動程序自己編寫對應(yīng)的調(diào)用函數(shù).例如調(diào)用API函數(shù)庫中的加解密函數(shù)對軟件源代碼中的部分數(shù)據(jù)實時進行加解密,示例如下.
圖2 軟件保護后運行流程圖
另外,也可以利用加密鎖中的存儲區(qū)進行數(shù)據(jù)驗證.在加密鎖中存儲運行計算機的硬件特征信息,并在運行過程中進行校驗,校驗不通過則軟件停止運行.校驗可以在源代碼的多處進行,這樣與鎖的交互會增多,更體現(xiàn)加密鎖的效果.計算機的硬件特征信息可以在軟件發(fā)布前通過加密鎖廠商提供的工具寫入加密鎖,也可以在軟件第1次運行時通過軟件寫入加密鎖,校驗示例如下.
代碼隔離最初是T Maude等人于1984年提出來的[6],是指從目標程序中“切分”出關(guān)鍵代碼片段,通過隱藏程序解釋執(zhí)行過程到硬件中的一種軟件保護方法.通過代碼隔離即將軟件中最重要的算法移植到加密鎖內(nèi),可以將軟件與加密鎖捆綁為一個整體,從而有效地保護軟件.由于代碼隔離后對軟件運行的速度會有一定的影響,因此,隔離的代碼應(yīng)該是軟件中的關(guān)鍵算法,這是整個加密方案的基礎(chǔ),且隔離的代碼算法的復(fù)雜度對加密強度有著決定性的影響.代碼隔離原理示意圖如3所示.
圖3 代碼隔離原理示意圖
具體步驟如下:
1)將預(yù)移植到鎖內(nèi)的代碼寫成加密鎖可執(zhí)行的編譯語言代碼;
2)使用加密鎖對應(yīng)的編譯器編譯改寫后的代碼,并將編譯生成的文件通過工具寫入到加密鎖中;
3)在軟件源代碼中調(diào)用已寫入加密鎖中的算法.
不同的加密鎖對軟件的加密強度有影響,相同的加密鎖使用不同的處理方式也會使軟件的加密強度產(chǎn)生很大的差別.對調(diào)用加密鎖的代碼進行一定的混淆處理可以有效地提高軟件的加密強度,增加破解的難度或延遲破解的時間.通過增加迷惑語句,同時根據(jù)加密鎖本身的特點使用一些編程技巧可以有效增加軟件攻擊者分析軟件調(diào)用加密鎖的難度,使程序難于理解.
1)減少出錯提示信息:將出錯信息不直接顯示給用戶,而是通過間接的方式呈現(xiàn)出來.因為這些提示信息很可能導(dǎo)致攻擊者直接深入到軟件保護的核心.例如,當發(fā)現(xiàn)到軟件遭受攻擊后,先不給出提示信息,而是在設(shè)置一個定時器并進行一定的標記,定時器觸發(fā)后使軟件停止工作,或者假裝軟件正常運行,但實際上卻在數(shù)據(jù)中增加了無用信息.例如:
2)加入復(fù)雜的循環(huán)和死循環(huán),增加軟件攻擊者分析程序執(zhí)行順序和結(jié)構(gòu)的難度,讓軟件攻擊者難以跟蹤,發(fā)現(xiàn)加密點.例如:
3)隨機地效驗和讀寫加密鎖.使軟件攻擊者難以理解程序的結(jié)構(gòu)和執(zhí)行規(guī)律.隨機性是軟件加密的重要思想,通過隨機性打亂軟件的慣性處理流程,可以有效增加程序的復(fù)雜度,增加逆向分析軟件和復(fù)制或模擬加密鎖的難度.例如:
4)把調(diào)用加密鎖和判斷程序是否繼續(xù)執(zhí)行的語句分開,即得到調(diào)用加密鎖的返回值后不立即對程序執(zhí)行狀態(tài)進行判斷,而是在二者之間加入一段其他無關(guān)的代碼.
5)加入無用的讀寫,效驗加密鎖的語句或其他無效代碼.
6)在加密鎖內(nèi)寫入讀出無效數(shù)據(jù).
單一的軟件保護技術(shù)容易被攻擊者所破解,通過多種保護技術(shù)結(jié)合共同保護軟件可以有效地提高攻擊者的攻擊代價,而以軟件為載體和以硬件為載體相結(jié)合的方法能夠在性能和成本上達到一個最佳的平衡.本文提出的基于加密鎖的指揮信息系統(tǒng)軟件保護方法,將機器碼加密和代碼隔離相結(jié)合,能有效提高軟件攻擊者的攻擊代價,提高軟件的安全性.該方法已在多個項目軟件中得到了使用,自去年初以來軟件運行良好,沒有發(fā)現(xiàn)軟件非法擴散或被攻擊的情況,證明本方法在保護軟件安全方面起到了積極作用.
指揮信息系統(tǒng)軟件保護不僅僅是一個技術(shù)問題,而且關(guān)系到指揮控制能否通暢以及最終作戰(zhàn)效能的發(fā)揮,其最終的解決不僅需要依靠技術(shù)手段,更需要嚴格的法規(guī)制度來保障.