劉建
(東莞理工學(xué)校,廣東東莞 523000)
控制流分析是一種特殊的分析技術(shù),通常用于對程序的控制流結(jié)構(gòu)進(jìn)行靜態(tài)結(jié)構(gòu)分析。隨著軟件功能的增加,算法結(jié)構(gòu)也變得越來越復(fù)雜,程序員們開始在程序語言中使用越來越多的分支語句[1]。為了能夠提高程序執(zhí)行的效率,通過控制流分析將這些程序編譯為相對較為簡單的語言,以便程序員們能夠更好地利用和處理這些程序語言。但是這種能夠?qū)⑺谐绦蛘Z言變得簡單易懂的分析方法使得軟件失去了程序語言對自身算法結(jié)構(gòu)的保護(hù)能力,很多黑客利用控制流分析能夠輕易地對軟件程序的安全構(gòu)成威脅,因此需要對程序的控制流分析進(jìn)行防御機(jī)制的構(gòu)建。
在以往的算法設(shè)計中,文獻(xiàn)[2]通過蝙蝠優(yōu)化算法對程序語言的流程結(jié)構(gòu)進(jìn)行了混淆計算,將其變?yōu)椴灰妆豢刂屏鞣治龅恼Z言結(jié)構(gòu)。文獻(xiàn)[3]通過計算混淆、聚合混淆的方式反推控制流分析的結(jié)構(gòu),降低了程序被控制流分析的概率,提高了算法結(jié)構(gòu)的安全性[2-3]。本文結(jié)合以上文獻(xiàn)設(shè)計了Python程序的混淆算法,用于低于控制流分析。
混沌映射能夠使Python程序具備更高的初值敏感性,并提高算法的運算速率,但是其結(jié)構(gòu)較為簡單,很容易成為控制流分析的解析缺口,因此在設(shè)計混淆算法時需要首先需要對其進(jìn)行加密處理。通過混沌映射的定義式,能夠得知混沌映射的隨機(jī)性位置信息:
式(1)中,A1表示混沌系統(tǒng)隨機(jī)過程中的初始位置參數(shù),An表示混沌系統(tǒng)隨機(jī)后的第n個節(jié)點的位置參數(shù);δ表示初始混沌系數(shù),其取值范圍為[1,4],且均為常數(shù)。隨著δ的系數(shù)值越來越接近最大值,其隨機(jī)位置信息的計算越復(fù)雜,經(jīng)過迭代計算后的實數(shù)序列就越來越收斂,直至完全變?yōu)橐粋€實數(shù)項[4]。在實驗過程中,可以將An取值為0.5,并將迭代次數(shù)固定在300,然后通過二項分布簡化其計算過程,實現(xiàn)更優(yōu)化的計算方法。通常而言,在迭代30次以后,混沌映射對于Python程序的加密能力就會越來越低,直至沒有效果。
不透明謂詞是一種能夠在到達(dá)應(yīng)用程序某個節(jié)點之前就明確知道其結(jié)果的構(gòu)造詞。當(dāng)所有不透明謂詞均為T時,該不透明謂詞就為永久的不透明謂詞;反之,若有意向不透明謂詞的結(jié)果為F時,該不透明謂詞就為半永久性不透明謂詞;若所有不透明謂詞均為F時,該算法結(jié)構(gòu)為陷門不透明謂詞[5]。本文基于混沌映射構(gòu)造不透明謂詞的數(shù)據(jù)結(jié)構(gòu),并插入永遠(yuǎn)為真的不透明謂詞,可以通過如下程序:
如圖1所示,在插入不透明謂詞時,需要假設(shè)所有程序語句全部為真,并使用if-else的語句作為條件表達(dá)式,假設(shè)程序確實為真,則進(jìn)行到下一項,若程序其中一項為假,則跳過該項程序語句[6]。
圖1 不透明謂詞插入程序Fig.1 Opaque predicate insertion program
在使用混淆語句抵御控制流分析時,可以通過給定的混淆路徑將所有文件夾中的Python全部遍歷,若存在子文件夾,可以將子文件夾中的語句也搜索一遍。通過case條件語句封裝所有變量賦值函數(shù),解決變量賦值不受控制地暴露在外的問題[7]。通過上文中的布局混淆、控制混淆來插入不透明謂詞,以此調(diào)整控制流分析的閱讀和理解順序,加深控制流分析解析算法的難度。將所有函數(shù)分為若干個大小不一的函數(shù)塊,并結(jié)合上文中的不透明謂詞插入算法,將每一個函數(shù)塊中的不透明謂詞全部插入到控制流閱讀流程中,并將這些過程壓縮在同一個文件夾中,放置在相應(yīng)的位置。若最后階段所有的Python都沒有明顯的bug程序錯誤,則可以表示針對該控制流分析的混淆算法設(shè)計成功,但是一旦目錄是發(fā)生改變,則表示該混淆算法沒有成功抵御控制流分析程序的解譯。
本實驗主要用于測試上文中設(shè)計的程序混淆算法是否能夠抵御控制流的分析作用,并將其與傳統(tǒng)的兩種算法進(jìn)行比較,通過抵御靜態(tài)攻擊安全性、抵御動態(tài)攻擊安全性來判斷其算法結(jié)構(gòu)對于控制流分析的抵抗能力[8]。使用Python作為實驗平臺的編程語言,將Intel(R)CPU 2340@2.45Hz作為CPU處理器,其運行內(nèi)存為4GB,儲存空間大小為600G。首先編寫一段流程較為復(fù)雜的算法語言,使用文中的混淆算法與現(xiàn)有的兩種混淆算法分別對其進(jìn)行改造優(yōu)化,然后使用控制流分析分別在靜態(tài)環(huán)境以及動態(tài)環(huán)境下攻擊該算法程序。通過程序混淆前后的圈復(fù)雜度判斷該算法的混淆力度。
為了得到更具科學(xué)性的實驗結(jié)果,將上述實驗流程重復(fù)5 次,每一次都使用不同的算法程序,分別對其進(jìn)行混淆與控制流分析。使用公式計算混淆前與混淆后的圈復(fù)雜度百分比:
式(2)中,α表示混淆前與混淆后的圈復(fù)雜度百分比;M表示混淆前的圈復(fù)雜度;N表示混淆后的圈復(fù)雜度。根據(jù)上述實驗步驟與計算公式得到的實驗結(jié)果如表1所示。
表1 程序混淆前后圈復(fù)雜度Tab.1 Cycle complexity before and after program confusion
如表1所示,在程序混淆前后的圈復(fù)雜度計算中,通過五次實驗?zāi)軌虻玫交煜芭c混淆后的復(fù)雜度參數(shù),混淆后的圈復(fù)雜度普遍高于混淆前的圈復(fù)雜度,且文中算法測得的百分比均低于常規(guī)的兩種算法。由此可知,本文基于Python程序的混淆算法在抵御控制流分析的過程中擁有較常規(guī)算法更強(qiáng)的防御能力,能夠更好地抵御控制流分析的解析。
本文對混沌映射進(jìn)行了優(yōu)化處理,并構(gòu)造插入了不透明謂詞條件,極大地加強(qiáng)了Python程序中混淆算法對控制流分析的抵御能力。通過實驗計算了Python程序混淆前后的圈復(fù)雜度,并通過百分比的計算明確了相較于傳統(tǒng)的兩種算法,文中算法具備更強(qiáng)的防御能力。