本發(fā)明涉及計(jì)算機(jī)軟件系統(tǒng)安全領(lǐng)域,特別涉及一種生成隨機(jī)布局程序的方法及裝置。
背景技術(shù):
當(dāng)前,計(jì)算機(jī)系統(tǒng)中越來越多的使用開源軟件,這在降低計(jì)算機(jī)系統(tǒng)軟件成本的同時(shí),也引入了很多安全隱患。
軟件系統(tǒng)都有缺陷,但開源軟件的缺陷更容易成為安全漏洞,其原因在于,攻擊者可以通過開放的源代碼了解到程序的關(guān)鍵邏輯和內(nèi)存布局,從程序邏輯上,攻擊者可以獲得緩沖區(qū)溢出等漏洞的攻擊點(diǎn),再根據(jù)已知的內(nèi)存布局,攻擊者就能夠通過偽造數(shù)據(jù)來控制被攻擊的系統(tǒng)。圖1是現(xiàn)有技術(shù)提供的未進(jìn)行布局隨機(jī)化的編譯過程示意圖,如圖1所示,代碼中的變量和函數(shù)相對(duì)分布被原樣體現(xiàn)在了生成的程序中,容易受到攻擊。
修復(fù)所有漏洞是不現(xiàn)實(shí)的,但是通過將程序的內(nèi)存布局進(jìn)行隨機(jī)化,可以阻斷許多危險(xiǎn)的攻擊,并大大增加其余攻擊的難度。
目前常見的內(nèi)存布局隨機(jī)化方法是通過加載器來實(shí)現(xiàn)的基地址隨機(jī)化,這種方法雖然實(shí)現(xiàn)簡(jiǎn)單,但是由于程序內(nèi)部的相對(duì)內(nèi)存布局固定,難以對(duì)緩沖區(qū)溢出等危險(xiǎn)攻擊進(jìn)行有效的阻斷。
另外,對(duì)應(yīng)用程序加密或進(jìn)行代碼混淆也可以提供一定的安全防護(hù),但是這類技術(shù)通常具有較大的性能開銷,并且在程序故障時(shí)存在難以調(diào)試和定位的問題。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的在于提供一種生成隨機(jī)布局程序的方法及裝置,能更好地解決當(dāng)前隨機(jī)化布局程序抗攻擊能力差和性能開銷大的問題。
根據(jù)本發(fā)明的一個(gè)方面,提供了一種生成隨機(jī)布局程序的方法,包括:
對(duì)于需要進(jìn)行隨機(jī)布局的程序,生成用來對(duì)所述程序進(jìn)行隨機(jī)布局的隨機(jī)數(shù);
構(gòu)建所述程序的函數(shù)信息塊和/或變量信息塊;
利用所生成的隨機(jī)數(shù),對(duì)所述函數(shù)信息塊和/或所述變量信息塊的位置進(jìn)行調(diào)整,形成隨機(jī)布局程序。
優(yōu)選地,通過以下步驟構(gòu)建所述程序的函數(shù)信息塊:
按照所述程序的輸入順序,從所述程序中依次獲取函數(shù),并將所獲取的每個(gè)函數(shù)作為一個(gè)函數(shù)信息塊進(jìn)行緩存。
優(yōu)選地,通過以下步驟對(duì)所述函數(shù)信息塊的位置進(jìn)行調(diào)整:
為所緩存的每個(gè)函數(shù)信息塊獲取一個(gè)隨機(jī)數(shù),并按照隨機(jī)數(shù)的大小,對(duì)每個(gè)函數(shù)信息塊的位置進(jìn)行排序。
優(yōu)選地,通過以下步驟構(gòu)建所述程序的變量信息塊:
按照所述程序的輸入順序,從所述程序中依次獲取全局變量,并將所獲取的每個(gè)全局變量作為一個(gè)全局變量信息塊進(jìn)行緩存。
優(yōu)選地,通過以下步驟對(duì)所述變量信息塊的位置進(jìn)行調(diào)整:
為所緩存的每個(gè)變量信息塊獲取一個(gè)隨機(jī)數(shù),并按照隨機(jī)數(shù)的大小,對(duì)每個(gè)變量信息塊的位置進(jìn)行排序。
根據(jù)本發(fā)明的另一方面,提供了一種生成隨機(jī)布局程序的裝置,包括:
隨機(jī)數(shù)生成模塊,用于對(duì)于需要進(jìn)行隨機(jī)布局的程序,生成用來對(duì)所述程序進(jìn)行隨機(jī)布局的隨機(jī)數(shù);
輸入模塊,用于構(gòu)建所述程序的函數(shù)信息塊和/或變量信息塊;
排序模塊,用于利用所生成的隨機(jī)數(shù),對(duì)所述函數(shù)信息塊和/或變量信息塊的位置進(jìn)行調(diào)整。
優(yōu)選地,所述輸入模塊按照所述程序的輸入順序,從所述程序中依次獲取函數(shù),并將所獲取的每個(gè)函數(shù)作為一個(gè)函數(shù)信息塊進(jìn)行緩存。
優(yōu)選地,所述排序模塊為所緩存的每個(gè)函數(shù)信息塊獲取一個(gè)隨機(jī)數(shù),并按照隨機(jī)數(shù)的大小,對(duì)每個(gè)函數(shù)信息塊的位置進(jìn)行排序。
優(yōu)選地,所述輸入模塊按照所述程序的輸入順序,從所述程序中依次獲取變量,并將所獲取的每個(gè)變量作為一個(gè)變量信息塊進(jìn)行緩存。
優(yōu)選地,所述排序模塊為所緩存的每個(gè)變量信息塊獲取一個(gè)隨機(jī)數(shù),并按照隨機(jī)數(shù)的大小,對(duì)每個(gè)變量信息塊的位置進(jìn)行排序。
與現(xiàn)有技術(shù)相比較,本發(fā)明的有益效果在于:
本發(fā)明通過將程序中的函數(shù)和/或變量按照隨機(jī)數(shù)進(jìn)行排序輸出,使程序擁有不同的內(nèi)存布局,以較小的時(shí)空性能代價(jià),大大增強(qiáng)軟件系統(tǒng)的抗攻擊能力。
附圖說明
圖1是現(xiàn)有技術(shù)提供的未進(jìn)行布局隨機(jī)化的編譯過程示意圖;
圖2是本發(fā)明實(shí)施例提供的生成隨機(jī)布局程序的方法流程圖;
圖3是本發(fā)明實(shí)施例提供的進(jìn)行布局隨機(jī)化的編譯過程示意圖;
圖4是本發(fā)明實(shí)施例提供的生成隨機(jī)布局程序的裝置的內(nèi)部模塊示意圖;
圖5是將圖4所示裝置嵌入到編譯器中實(shí)現(xiàn)時(shí)的工作示意圖;
圖6是可實(shí)施本發(fā)明的其他位點(diǎn)示意圖(源代碼級(jí),匯編前,匯編中)。
具體實(shí)施方式
以下結(jié)合附圖對(duì)本發(fā)明的優(yōu)選實(shí)施例進(jìn)行詳細(xì)說明,應(yīng)當(dāng)理解,以下所說明的優(yōu)選實(shí)施例僅用于說明和解釋本發(fā)明,并不用于限定本發(fā)明。
圖2是本發(fā)明實(shí)施例提供的生成隨機(jī)布局程序的方法流程圖,如圖2所示,步驟包括:
步驟S101:對(duì)于需要進(jìn)行隨機(jī)布局的程序,生成用來對(duì)所述程序進(jìn)行隨機(jī)布局的隨機(jī)數(shù)。
步驟S102:構(gòu)建所述程序的函數(shù)信息塊和/或變量信息塊。
具體地說,按照所述程序的輸入順序,從所述程序中依次獲取函數(shù),并將所獲取的每個(gè)函數(shù)作為一個(gè)函數(shù)信息塊進(jìn)行緩存;和/或按照所述程序的輸入順序,從所述程序中依次獲取全局變量,并將所獲取的每個(gè)全局變量作為一個(gè)全局變量信息塊進(jìn)行緩存。
步驟S103:利用所生成的隨機(jī)數(shù),對(duì)所述函數(shù)信息塊和/或所述變量信息塊的位置進(jìn)行調(diào)整,形成隨機(jī)布局程序。
具體地說,為所緩存的每個(gè)函數(shù)信息塊獲取一個(gè)隨機(jī)數(shù),并按照隨機(jī)數(shù)的大 小,對(duì)每個(gè)函數(shù)信息塊的位置進(jìn)行排序;和/或?yàn)樗彺娴拿總€(gè)變量信息塊獲取一個(gè)隨機(jī)數(shù),并按照隨機(jī)數(shù)的大小,對(duì)每個(gè)變量信息塊的位置進(jìn)行排序。
在程序編譯期間,可以在編譯器中采用本發(fā)明所述的方法,圖3是本發(fā)明實(shí)施例提供的進(jìn)行布局隨機(jī)化的編譯過程示意圖,如圖3所示,在編譯器輸出匯編文件之前,利用布局隨機(jī)化裝置(即生成隨機(jī)布局程序的裝置)進(jìn)行布局隨機(jī)化處理后,變量和函數(shù)的相對(duì)位置關(guān)系發(fā)生了變化,根據(jù)源代碼無法猜測(cè)出程序運(yùn)行時(shí)的變量和函數(shù)布局,從而提高了軟件系統(tǒng)的抗攻擊能力。
所述變量可以是全局變量。
圖4是本發(fā)明實(shí)施例提供的生成隨機(jī)布局程序的裝置的內(nèi)部模塊示意圖,如圖4所示,包括隨機(jī)數(shù)生成模塊10、輸入模塊20、排序模塊30、輸出模塊40。
隨機(jī)數(shù)生成模塊10用于對(duì)需要進(jìn)行隨機(jī)布局的程序,生成用來對(duì)所述程序進(jìn)行隨機(jī)布局的隨機(jī)數(shù)。也就是說,隨機(jī)數(shù)生成模塊10負(fù)責(zé)生成無規(guī)律的隨機(jī)數(shù),實(shí)現(xiàn)方式包括但不限于使用純軟件方法生成隨機(jī)數(shù),根據(jù)隨機(jī)事件(例如中斷數(shù)、網(wǎng)絡(luò)通信信息)軟件生成隨機(jī)數(shù),直接讀取特定硬件提供的隨機(jī)數(shù)等。
輸入模塊20用于構(gòu)建所述程序的函數(shù)信息塊和/或變量信息塊。具體地說,輸入模塊20接收外部順序輸入的函數(shù)和/或變量,對(duì)于需要隨機(jī)化布局的函數(shù),輸入模塊20按照輸入順序,從所述程序中依次獲取函數(shù),并將所獲取的每個(gè)函數(shù)作為一個(gè)函數(shù)信息塊進(jìn)行緩存;對(duì)于需要隨機(jī)化布局的變量,例如全局變量,輸入模塊20按照外部輸入所述程序的順序,從所述程序中依次獲取變量,并將所獲取的每個(gè)變量作為一個(gè)變量信息塊進(jìn)行緩存。
排序模塊30用于利用所生成的隨機(jī)數(shù),對(duì)所述函數(shù)信息塊和/或變量信息塊的位置進(jìn)行調(diào)整,形成隨機(jī)布局程序。所述隨機(jī)布局程序包含排序后的函數(shù)信息塊和/或變量信息塊。具體地說,對(duì)于需要隨機(jī)化布局的函數(shù),排序模塊30讀取輸入模塊20緩存的函數(shù)信息塊(即關(guān)于函數(shù)的順序分塊數(shù)據(jù)),并為所緩存的每個(gè)函數(shù)信息塊獲取一個(gè)隨機(jī)數(shù),然后按照隨機(jī)數(shù)的大小,對(duì)每個(gè)函數(shù)信息塊的位置進(jìn)行排序,并輸出排序后的函數(shù)信息塊;對(duì)于需要隨機(jī)化布局的變量,例如全局變量,排序模塊30讀取輸入模塊20緩存的變量信息塊(即關(guān)于變量的順序分塊數(shù)據(jù)),并為所緩存的每個(gè)變量信息塊獲取一個(gè)隨機(jī)數(shù),然后按照隨機(jī)數(shù)的大小,對(duì)每個(gè)變量信息塊的位置進(jìn)行排序,并輸出排序后的變量信息塊。
輸出模塊40用于輸出所述隨機(jī)布局程序,即按照隨機(jī)順序輸出函數(shù)和/或變量。
圖5是將圖4所示裝置嵌入到編譯器中實(shí)現(xiàn)時(shí)的工作示意圖,如圖5所示,所述裝置的工作流程如下:
步驟1:在編譯器內(nèi)部的匯編文件輸出之前,插入對(duì)輸入模塊20的調(diào)用。
步驟2:輸入模塊20判斷是否需要進(jìn)行隨機(jī)化布局,若判斷不需要進(jìn)行隨機(jī)化布局處理,則返回并進(jìn)行匯編文件輸出,若判斷需要進(jìn)行隨機(jī)化布局處理,則對(duì)需要隨機(jī)化布局的函數(shù)信息和/或全局變量信息依次進(jìn)行分塊緩存,對(duì)其余信息不做處理。
步驟3:在編譯器完成單個(gè)源文件的全部編譯動(dòng)作后,調(diào)用排序模塊30。
步驟4:排序模塊30根據(jù)隨機(jī)數(shù)生成模塊10的輸出,為每一個(gè)被緩存的信息塊獲取一個(gè)對(duì)應(yīng)的隨機(jī)數(shù)。
步驟5:在所有信息塊都獲得對(duì)應(yīng)的隨機(jī)數(shù)后,排序模塊30依據(jù)信息塊的隨機(jī)數(shù)大小對(duì)信息塊進(jìn)行重新排序。完成排序后,排序模塊30將重排后的信息塊順序傳遞給輸出模塊40。
步驟6:輸出模塊40順序?qū)⑿畔K的內(nèi)容寫入?yún)R編文件中。
上述信息塊包括函數(shù)信息塊和/或(全局)變量信息塊。
優(yōu)選在編譯器內(nèi)部實(shí)施的原因是,此時(shí)本發(fā)明所述裝置可以獲得最為完整的代碼信息,保證變形過程的正確性,同時(shí),可以與其他代碼保護(hù)技術(shù)同時(shí)實(shí)施,進(jìn)一步增強(qiáng)抗攻擊能力,并且可以保證輸出程序的調(diào)試信息正確。
通過新增的定制編譯流程,本發(fā)明能夠使得編譯器每次編譯生成的程序擁有不同的內(nèi)存布局(包括但不限于函數(shù)和全局變量),以較小的時(shí)空性能代價(jià),大大增強(qiáng)軟件系統(tǒng)的抗攻擊能力。
綜上,本發(fā)明提供的方法具體包括:
1、在編譯流程中加入如圖4所示裝置,修改函數(shù)編譯后的輸出順序,將原有的按源代碼順序輸出改為隨機(jī)順序輸出。具體地說,在進(jìn)行編譯時(shí),從隨機(jī)數(shù)生成模塊10中為每一個(gè)函數(shù)取得一個(gè)隨機(jī)數(shù)。按照函數(shù)對(duì)應(yīng)的隨機(jī)數(shù)大小,排定函數(shù)輸出的順序。排列函數(shù)的實(shí)施方式包括但不限于:在實(shí)際編譯前,調(diào)整輸入到實(shí)際編譯流程的函數(shù)順序;在實(shí)際編譯后,調(diào)整函數(shù)輸出到文件的順序。
2、在編譯流程中加入如圖4所示的裝置,將原有的全局變量布局從按源代碼順序改為隨機(jī)順序。具體地說,在進(jìn)行編譯時(shí),從隨機(jī)數(shù)生成模塊10中為每一個(gè)全局變量取得一個(gè)隨機(jī)數(shù)。按照全局變量對(duì)應(yīng)的隨機(jī)數(shù)大小,排定變量的相對(duì)順序。排列變量的實(shí)施方式包括但不限于:在實(shí)際編譯前,調(diào)整進(jìn)入編譯流程的變量順序;在實(shí)際編譯后,調(diào)整變量輸出到文件的順序。
圖6是可實(shí)施本發(fā)明的其他位點(diǎn)示意圖,如圖6所示,本發(fā)明在程序編譯階段,除了在編譯器中生成隨機(jī)布局程序,還可以在其它多個(gè)位點(diǎn)生成隨機(jī)布局程序,例如在源代碼預(yù)編譯時(shí),在源代碼級(jí)進(jìn)行程序的內(nèi)存布局隨機(jī)化調(diào)整;在匯編代碼輸入?yún)R編器前,針對(duì)匯編文件進(jìn)行內(nèi)存布局隨機(jī)化調(diào)整;在匯編器內(nèi)部進(jìn)行內(nèi)存布局隨機(jī)化調(diào)整等等。
在其他位點(diǎn)實(shí)施的裝置也都具有類似的組成結(jié)構(gòu)和工作原理,其核心邏輯包括分塊緩存輸入的順序數(shù)據(jù),為每一個(gè)分塊(即信息塊)獲得對(duì)應(yīng)的隨機(jī)數(shù),利用該隨機(jī)數(shù)對(duì)分塊數(shù)據(jù)進(jìn)行排序,最后輸出排序后的數(shù)據(jù)。
盡管上文對(duì)本發(fā)明進(jìn)行了詳細(xì)說明,但是本發(fā)明不限于此,本技術(shù)領(lǐng)域技術(shù)人員可以根據(jù)本發(fā)明的原理進(jìn)行各種修改。因此,凡按照本發(fā)明原理所作的修改,都應(yīng)當(dāng)理解為落入本發(fā)明的保護(hù)范圍。