類(lèi)分裂的代碼混淆技術(shù)論文
時(shí)間:2022-09-17 05:41:00
導(dǎo)語(yǔ):類(lèi)分裂的代碼混淆技術(shù)論文一文來(lái)源于網(wǎng)友上傳,不代表本站觀點(diǎn),若需要原創(chuàng)文章可咨詢(xún)客服老師,歡迎參考。
摘要包含有大部分或全部源碼信息的軟件發(fā)行版本的普及,比如易被反編譯成源碼的Java字節(jié)代碼,增加了軟件被惡意逆向工程攻擊的可能。文章介紹了面向?qū)ο笳Z(yǔ)言的類(lèi)分裂混淆方法,同時(shí)也給出了混淆技術(shù)的定義、分類(lèi)和評(píng)判標(biāo)準(zhǔn)。
關(guān)鍵詞逆向工程;代碼混淆;軟件保護(hù);類(lèi)分裂
1引言
計(jì)算機(jī)軟件的安全一直是軟件企業(yè)和相關(guān)研究領(lǐng)域的關(guān)注重點(diǎn),當(dāng)前存在的軟件保護(hù)技術(shù)分別有硬件輔助保護(hù)、序列號(hào)保護(hù)、加密保護(hù)、服務(wù)器認(rèn)證、防篡改以及代碼混淆等。隨著JAVA語(yǔ)言、逆向工程的迅速發(fā)展和普遍運(yùn)用以及惡意主機(jī)對(duì)軟件的逆向分析等突出安全問(wèn)題的不斷涌現(xiàn),使得代碼混淆,這一新的保護(hù)軟件安全的技術(shù)正越來(lái)越受到人們的重視。
2代碼混淆的定義和分類(lèi)
2.1代碼混淆定義
給定一個(gè)程序P、策略T,經(jīng)過(guò)混淆變換后得到程序P''''(見(jiàn)圖1)。此過(guò)程稱(chēng)之為混淆變換,如果對(duì)程序進(jìn)行一種功能保持的變換,變換后的程序擁有和原始程序相同的功能。更確切的說(shuō)法應(yīng)該包含以下兩個(gè)條件:①如果P出錯(cuò)終止或終止失敗,P''''不一定終止。②P和P''''在正常終止情況下,P''''必須產(chǎn)生與P相同的輸出。
所不同的是經(jīng)過(guò)轉(zhuǎn)換的P''''相較P更難于被靜態(tài)分析等逆向工程方法攻擊,即使被反編譯,生成的程序也難以被人閱讀和理解。
圖1代碼混淆
2.2代碼混淆分類(lèi)
根據(jù)混淆對(duì)象和對(duì)其進(jìn)行操作的差別,可將代碼混淆技術(shù)分為布局(layout)混淆、控制(control)混淆、數(shù)據(jù)(data)混淆、預(yù)防(preventive)混淆等幾種。
(1)外形混淆。該類(lèi)混淆主要包括對(duì)程序中的變量名、常量名、類(lèi)名、方法名稱(chēng)等標(biāo)識(shí)符作詞法上的變換改名和刪除程序中與執(zhí)行無(wú)關(guān)的調(diào)試信息、注釋、源碼格式等。
(2)控制混淆。該類(lèi)混淆的目的是使得攻擊者對(duì)程序的控制流難以理解。主要包括打亂某段代碼本身邏輯關(guān)系的聚集混淆(AggregationTransformation)、把相關(guān)語(yǔ)句分散到程序不同位置并實(shí)現(xiàn)某項(xiàng)功能的次序混淆(OrderingTransformation)和隱藏真實(shí)執(zhí)行路徑的執(zhí)行混淆(ComputationTransformation)等。
(3)數(shù)據(jù)混淆。數(shù)據(jù)混淆的對(duì)象是程序中的數(shù)據(jù)域。它可細(xì)分為相關(guān)數(shù)據(jù)的儲(chǔ)存(Storage)與編碼(Encoding)方式的混淆、組合和拆分?jǐn)?shù)據(jù)的聚集(Aggregation)混淆、位序重計(jì)的次序(Ordering)混淆等。
(4)預(yù)防混淆。與前述混淆類(lèi)型針對(duì)惡意用戶(hù)不同,預(yù)防混淆主要利用一些專(zhuān)用反編譯器的設(shè)計(jì)缺陷,以使這些反編譯器難以反向還原混淆之后的代碼。例如,反編譯器mocha對(duì)于Return后面的指令不進(jìn)行反編譯,Hosemocha就是專(zhuān)門(mén)針對(duì)此缺陷,故意將代碼放在Return語(yǔ)句后面,從而使反編譯失效。
2.3類(lèi)分裂
介紹完代碼混淆的分類(lèi)后,接下來(lái)我將就面向?qū)ο笳Z(yǔ)言中的一種混淆技術(shù):類(lèi)分裂(classsplitting)進(jìn)行說(shuō)明。首先對(duì)類(lèi)分裂進(jìn)行定義:類(lèi)分裂是將一個(gè)初始(原)類(lèi)用兩個(gè)或兩個(gè)以上的類(lèi)來(lái)替換的混淆方法。對(duì)類(lèi)分裂進(jìn)行敘述前,我們規(guī)定以下相關(guān)使用術(shù)語(yǔ)的意義:
P:JAVA程序
Classes(P):P中一般類(lèi)的集合
Interfaces(P):P中接口類(lèi)的集合
ct:Class或Interface中的任意類(lèi)
Methods(ct):ct中的成員函數(shù)的集合
Field(ct):ct中的成員變量的集合
注:Methods(ct),F(xiàn)ield(ct)不包括從父類(lèi)繼承的成員函數(shù)和成員變量,而只包括:①當(dāng)前定義類(lèi)中新定義的成員函數(shù)和成員變量。②當(dāng)前定義類(lèi)所覆蓋的其父類(lèi)的成員函數(shù)。
依賴(lài)(depends)關(guān)系的定義:
m,nMethods(ct),如果存在m調(diào)用n,則(m,n)∈depends
andm∈Methods(ct),f∈Field(ct),如果存在m使用了f,則
(m,f)∈depends
為了便于用例的書(shū)寫(xiě),特做說(shuō)明,圖2左列和右列的符號(hào)實(shí)際上表示同一類(lèi)。
分裂函數(shù)usplit代表了這么一個(gè)分裂過(guò)程:原來(lái)的類(lèi)的成員(成員函數(shù)或成員變量)被拆分到某個(gè)或是兩個(gè)新類(lèi)中。
分裂函數(shù)的選擇必須考慮到成員函數(shù)之間或成員函數(shù)和成員變量之間的依賴(lài)關(guān)系,這是決定分裂函數(shù)是否有效的重要標(biāo)準(zhǔn)。下面的程序中,初始程序中的類(lèi)Ct不能被分為混淆后的程序中兩個(gè)毫無(wú)繼承關(guān)系的新類(lèi),而應(yīng)分裂為具有繼承關(guān)系的類(lèi)ct,1和ct,2??梢允褂昧硪环N表達(dá)方式描述:初始程序中類(lèi)Ct的m2成員函數(shù)調(diào)用了m3成員函數(shù),因此我們不能將m2作為ct,1的成員函數(shù),m3作為ct,2的成員函數(shù),而ct,1和ct,2兩者間無(wú)繼承關(guān)系。而應(yīng)將m2作為子類(lèi)ct,2的成員函數(shù),m3作為父類(lèi)ct,1的成員函數(shù)。且成員函數(shù)m3不需要修改,m3依舊調(diào)用m2。
如果出現(xiàn)這種情況:由于初始程序中的類(lèi)設(shè)計(jì)本身存在缺陷,導(dǎo)致該類(lèi)實(shí)際等同于多個(gè)類(lèi)的組合。在此前提下,可以將初始類(lèi)分裂為毫無(wú)繼承關(guān)系的兩個(gè)或兩個(gè)以上新類(lèi)。
將類(lèi)分裂為具有繼承關(guān)系的新類(lèi)的方法產(chǎn)生了大量有效的分裂函數(shù),這是因?yàn)檫@種分裂方法的約束條件非常簡(jiǎn)單且只具有惟一的限制:成員函數(shù)和成員函數(shù)所使用到的成員變量必須在同一類(lèi)中定義,而這個(gè)類(lèi)必須是定義成員函數(shù)的類(lèi)。用公式表述如下:
m∈Methods(ct):
ifct,1∈usplit(m),then
n∈Methods(ct)):depends(m,n)→ct,1∈usplit(n)and
f∈Fields(ct)):depends(m,f)→ct,1∈usplit(f)
原則的體現(xiàn)如同下面所示類(lèi)分裂混淆例子所示:成員函數(shù)m3調(diào)用了成員函數(shù)m4,因此將m3和m4定義為類(lèi)ct,1的成員函數(shù)。由于分裂函數(shù)usplit將m4函數(shù)分配給了類(lèi)ct,2,類(lèi)ct,1的成員函數(shù)m4其實(shí)只是一個(gè)虛假的程序段(函數(shù)),它使惡意逆向工程人員以為調(diào)用的是ct,1的成員函數(shù)m4。但實(shí)際情況是:程序運(yùn)行期間ct,1的成員函數(shù)m4將不會(huì)被調(diào)用,它將被ct,2的m4成員函數(shù)所覆蓋。同時(shí),類(lèi)ct,1中構(gòu)造函數(shù)用到的成員變量i,d都在類(lèi)ct,1定義,類(lèi)ct,2中構(gòu)造函數(shù)用到的成員變量o則在類(lèi)ct,2定義。
接著,當(dāng)新類(lèi)產(chǎn)生后,必須要對(duì)原有的類(lèi)型聲明進(jìn)行替換,主要包括:
3代碼混淆的評(píng)判指標(biāo)
程序混淆效果通常從強(qiáng)度(potency)、耐受性(resilience)、開(kāi)銷(xiāo)(cost)、隱蔽性(stealth)等4個(gè)方面來(lái)評(píng)估:
(1)強(qiáng)度。指混淆變換后的程序相對(duì)原始的程序?qū)阂庥脩?hù)理解程序造成的困難程度或復(fù)雜度。
(2)耐受性。指混淆變換后的程序?qū)κ褂米詣?dòng)去混淆工具進(jìn)行攻擊的抵抗度。其抵抗度大小與前述標(biāo)準(zhǔn)之一的強(qiáng)度的大小無(wú)直接聯(lián)系,甚至可能出現(xiàn)某些強(qiáng)度很高的混淆變換對(duì)自動(dòng)去混淆工具的抵抗能力卻很差的情況。
(3)開(kāi)銷(xiāo)。指經(jīng)過(guò)混淆變換后的程序在執(zhí)行時(shí)由變換所帶來(lái)的額外的執(zhí)行時(shí)間和所需存儲(chǔ)空間的開(kāi)銷(xiāo)。
(4)隱蔽性。耐受性好的混淆變換不容易被自動(dòng)去混淆工具所去除,但卻可能很容易被攻擊者的人工分析識(shí)破。特別是,如果一種變換所引入的代碼和原始程序有較大的差異性,就會(huì)輕易地被攻擊者識(shí)破,因此應(yīng)盡力使用與原代碼相近的語(yǔ)法結(jié)構(gòu)等來(lái)加強(qiáng)隱蔽性。
4結(jié)語(yǔ)
代碼混淆的目的是防止對(duì)軟件的逆向分析,從而有效保護(hù)軟件知識(shí)產(chǎn)權(quán)。它通過(guò)改變程序本身,使其轉(zhuǎn)換為極難理解和分析的新程序,最終讓惡意攻擊者在必須耗費(fèi)其所不能承受的代價(jià)(時(shí)間或其它方面)面前,放棄對(duì)軟件的分析來(lái)實(shí)現(xiàn)。但代碼混淆技術(shù)作為一種新的軟件保護(hù)方法,在理論基礎(chǔ)、技術(shù)成熟度等方面依舊存在許多不足,這也將是代碼混淆技術(shù)下一步要解決的問(wèn)題。
參考文獻(xiàn)
[1]C.Collberg,C.Thomborson,andD.Low.ATaxonomyofObfuscatingTransformations.TechnicalReport148,July1997
[2]C.S.CollbergandC.Thomborson.Watermarking,Tamper-Proofing,andObfuscation-ToolsforSoftwareProtection.IEEETransactiononSoftwareEngineering,28(8):735-746,Aug,2002
[3]H.ChangandM.Atallah.Protectingsoftwarecodebyguards.InProceedingoftheACMWorkshoponSecurityandPrivacyinDigitalRightsManagements,pages160-175,Nov.2001
[4]C.Wang.ASecurityArchitectureforSurvivabilityMechanisms.PhDthesis,UniversityofVirginia,SchoolofEngineeringandAppliedScience,October2000
[5]MikhailSosonkin,GlebNaumovichandNasirMemon.Obfuscationofdesignintentinobject-orientedapplications.DepartmentofComputerandInformationSciencePolytechnicUniversity2003
[6]羅宏,蔣劍琴,曾慶凱.用于軟件保護(hù)的代碼混淆技術(shù).計(jì)算機(jī)工程,第32卷第11期,2006.7
[7]宋亞奇.基于代碼混淆的軟件保護(hù)技術(shù)研究.碩士論文,西北工業(yè)大學(xué),2005.6