專利名稱::用于代碼迷惑的方法及設(shè)備的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明總地涉及軟件,并且具體地涉及迷惑的(obfuscated)軟件。
背景技術(shù):
:本部分旨在向讀者介紹可能與在下文描述和/或請求保護(hù)的本發(fā)明的各個方面有關(guān)的技術(shù)的各個方面。相信該討論有助于向讀者提供背景信息以促進(jìn)對本發(fā)明各個方面的更好的理解。相應(yīng)地,應(yīng)當(dāng)理解的是要鑒于以上來閱讀這些說明,而不是將其承認(rèn)為現(xiàn)有技術(shù)。在“ObfuscationofExecutableCodetoImproveResistancetoStaticDisassembly,,中,第10屆ACMConferenceofComputerandCommunicationsSecurity(CCS),第290-299頁,2003年10月,Linn與Debray建議使用兩個主要技術(shù)來擾亂(confuse)反匯編器。第一個技術(shù)是插入在正常運行時間執(zhí)行期間不可抵達(dá)的地方插入的垃圾代碼字節(jié)。第二種技術(shù)使用分支函數(shù)(branchfunction)以更改規(guī)則的例程調(diào)用。稍微簡化一些,分支函數(shù)依賴函數(shù)的值(諸如關(guān)于調(diào)用指令的位置的散列(hash)值)來確定目標(biāo)。在運行時間處,可容易地從堆棧頂部確定該位置。另外,分支函數(shù)也通過偏移量更改返回地址,這使得利用垃圾代碼來填充介入空間(intervenespace)成為可能。在“Proceedingsofthe13thUSENIXSecuritySymposium”0004年8月9日-13日,美國加利福尼亞州圣地亞哥)中,Kruegel等人提出了一種解決方案以克服Lirm與Debray提出的迷惑方案。作者觀察到Lirm與Debray的分支函數(shù)本質(zhì)上是一種例程,其地址在作為輸入?yún)?shù)而在堆棧頂部傳遞的調(diào)用指令之后。于是,分支函數(shù)不依賴于動態(tài)輸入,由于其輸出依賴于單一輸入?yún)?shù)并且在二進(jìn)制初始化的數(shù)據(jù)段中呈現(xiàn)一些靜態(tài)查找表格,因此可以模擬分支函數(shù)。從而可計算偏移量,這使得反匯編器能夠跳過垃圾代碼并從下一有效指令繼續(xù)。本領(lǐng)域技術(shù)人員將認(rèn)識到,需要一種可對抗Kruegel等人提供的反匯編技術(shù)的迷惑方法。在US2006/0253687中,Jakubowski與Jacob提出了一種代碼迷惑方法,除了別的以外,其中使用分支函數(shù)以決定跳轉(zhuǎn)到什么指令。與Lirm與Debray的差別是,Jakubowski與Jacob的方法使用了采取動態(tài)輸入的函數(shù),這使得即便靜態(tài)地對代碼進(jìn)行反匯編不是不可能的,但也是非常困難的。C.Collberg^Ai"DynamicPath-BasedSoftwareWatermarking"4(ACMSigplanNotices,ACMAssociationforComputingMachinery,美國,紐約州,紐約市,XP009084970)中提出了一種類似的解決方案。他們的解決方案采用了嵌套分支函數(shù),其中由于“最內(nèi)部的”函數(shù)使用返回地址的散列法以生成新的返回地址,所以該“最內(nèi)部的”函數(shù)是動態(tài)的。作為現(xiàn)有技術(shù),US2008/0148061提出了另一類似解決方案,其中,通過調(diào)用訪問數(shù)據(jù)表格的入口的完整性函數(shù)(integrityfunction)代替了跳轉(zhuǎn),并且對入口的值進(jìn)行散列以確定返回地址。本發(fā)明提供對于Lirm與Debray的方法的改進(jìn),該改進(jìn)同時作為其它現(xiàn)有技術(shù)方法的替代物。如果可以使用多個方法(有利地,對其進(jìn)行組合),則代碼迷惑變得更加有效,本領(lǐng)域技術(shù)人員將認(rèn)識到存在對這樣一種可替換解決方案的需要。
發(fā)明內(nèi)容在第一方面,本發(fā)明針對一種用于迷惑編譯的計算機(jī)代碼的方法,所述編譯的計算機(jī)代碼包括以多個基本塊組織的計算機(jī)代碼指令。利用具有至少一個參數(shù)的函數(shù)調(diào)用來替換第一基本塊中的跳轉(zhuǎn)指令,其中該函數(shù)調(diào)用在執(zhí)行時依賴于該參數(shù)確定要執(zhí)行的下一函數(shù)的地址。向編譯的計算機(jī)代碼插入向參數(shù)分配值的指令,所述參數(shù)的值使得由函數(shù)調(diào)用所確定的地址與被替換的跳轉(zhuǎn)指令的目的地地址對應(yīng)。將該分配指令插入至與第一基本塊不同的并意圖在第一基本塊之前執(zhí)行的第二基本塊中的計算機(jī)代碼中。在第一優(yōu)選實施例中,跳轉(zhuǎn)函數(shù)為無條件跳轉(zhuǎn)函數(shù)。在第二優(yōu)選實施例中,在之前的包括有條件跳轉(zhuǎn)指令的第三基本塊與第一基本塊之間的執(zhí)行路徑中選擇第二基本塊。使用用于編譯的計算機(jī)代碼的控制流程圖中的信息來選擇第二基本塊是有利的。在第二方面中,本發(fā)明針對用于迷惑編譯的計算機(jī)代碼的設(shè)備,所述編譯的計算機(jī)代碼包括以多個基本塊組織的計算機(jī)代碼指令。該設(shè)備包括替換單元,適配為以具有至少一個參數(shù)的函數(shù)調(diào)用來替換在第一基本塊中的跳轉(zhuǎn)指令,其中該執(zhí)行的函數(shù)調(diào)用依賴于該參數(shù)來確定要執(zhí)行的下一函數(shù)的地址;插入單元,適配為向編譯的計算機(jī)代碼中插入向該參數(shù)分配值的指令,該值使得由該函數(shù)調(diào)用所確定的地址與被替換的跳轉(zhuǎn)指令的目的地地址對應(yīng);以及發(fā)現(xiàn)單元,適配為發(fā)現(xiàn)該插入單元向其中插入分配指令的、與第一基本塊不同的并且意圖在第一基本塊之前執(zhí)行的第二基本塊。在第一優(yōu)選實施例中,該替換單元被適配為替換無條件的跳轉(zhuǎn)函數(shù)。在第二優(yōu)選實施例中,該發(fā)現(xiàn)單元被適配為發(fā)現(xiàn)之前的包括有條件跳轉(zhuǎn)指令的第三基本塊與第一基本塊之間的執(zhí)行路徑中的第二基本塊。該發(fā)現(xiàn)單元適配為使用用于編譯的計算機(jī)代碼的控制流程圖中的信息來發(fā)現(xiàn)第二基本塊是有利的。在第三優(yōu)選實施例中,在至少一個處理器中實施該替換單元、插入單元、以及發(fā)現(xiàn)單元?,F(xiàn)在將通過非限制性示例的方式,參照附圖來描述本發(fā)明的優(yōu)選特征,其中,圖1圖示了現(xiàn)有技術(shù)的編譯軟件的處理;圖2圖示了根據(jù)現(xiàn)有技術(shù)的迷惑后的代碼;圖3圖示了根據(jù)本發(fā)明優(yōu)選實施例的迷惑后的代碼;圖4圖示了根據(jù)本發(fā)明優(yōu)選實施例的代碼迷惑的方法;以及圖5圖示了根據(jù)本發(fā)明優(yōu)選實施例的用于代碼迷惑的設(shè)備。在附圖中,所表示的塊僅僅是功能性的實體,其不一定與物理上單獨的實體對應(yīng)。這些功能性的實體可實施為硬件、軟件、或軟件與硬件的組合;再者,可在一個或多個集成電路中實施它們。具體實施例方式圖1圖示了現(xiàn)有技術(shù)編譯軟件的處理。該例程的一些基本知識將有助于對下文描述的理解。編譯經(jīng)由大量中間步驟將源代碼Iio翻譯成機(jī)器代碼150,在此期間生成了語法樹120,控制流程圖130以及匯編代碼140。本發(fā)明主要構(gòu)思在于,使用比Lirm與Debray所使用的那些更加安全的分支函數(shù)調(diào)用。如已經(jīng)討論的,可以相當(dāng)容易地模擬他們的分支函數(shù)。盡管Jakubowski與Jacob通過使分支函數(shù)動態(tài)化而使得分支函數(shù)安全,但仍然可以計算出分支函數(shù)。本解決方案以不同的方式使得分支函數(shù)安全,如下文將要詳細(xì)描述的。為了易于認(rèn)識到本發(fā)明的解決方案,首先在圖2中圖示現(xiàn)有技術(shù)迷惑方案。遵循控制流程圖,程序代碼200被劃分為大量基本塊210-270?;緣K可以被認(rèn)為是一組要被順序執(zhí)行的指令;同樣地,其利用至另一基本塊的跳轉(zhuǎn)函數(shù)而結(jié)束。例如,基本塊210包括三條指令11,12,以及有條件跳轉(zhuǎn)“Ifcondjump”。執(zhí)行全部三條指令,并且依賴于該有條件跳轉(zhuǎn),然后以在基本塊220中的指令14或在基本塊250中的指令117而繼續(xù)該執(zhí)行。存在通過所圖示的代碼部分的三種可能的執(zhí)行路徑(該數(shù)字指代基本塊)-A:210-220-240-260-B:210-220-230-260-C:210-250-270?;緣K260與270的每一個包括跳轉(zhuǎn)函數(shù)(JumpOl與Jump@2),以及部分代碼指令i25與i28(由小寫字母i:s指示)。盡管可以使用一個或多個完整的指令(entireinstruction)(除了部分代碼指令之外或者替代部分代碼指令),但有利地是使用部分指令,這是因為該部分指令將反匯編器欺騙為將至少部分之后“真正的”指令曲解為函數(shù)參數(shù)??筛鶕?jù)Lirm與Debray的解決方案(即,依賴于堆棧上的地址)或Jakubowski與Jacob的解決方案(即,在其值在運行時間確定并且難以進(jìn)行逆向工程的復(fù)雜的函數(shù))中的任一個來實施這兩個跳轉(zhuǎn)函數(shù)。圖3圖示根據(jù)本發(fā)明優(yōu)選實施例的迷惑方案。除了將要在下文中描述的一些更改之外,程序代碼300與圖2中的程序代碼200相同。仍然存在七個基本塊310-370,并且基本塊310與320分別與基本塊210與220相同。然而,在基本塊360與370中,已經(jīng)利用對以參數(shù)a作為輸入的函數(shù)進(jìn)行調(diào)用來取代圖2的跳轉(zhuǎn)函數(shù)-Jumplgl與Jump@2。在正確的參數(shù)的情況下,該函數(shù)調(diào)用確定在程序流程中要執(zhí)行的下一個指令的地址;換言之,在正確的參數(shù)值的情況下,該函數(shù)調(diào)用如同所替換的跳轉(zhuǎn)函數(shù)那樣工作,但是在不正確的參數(shù)值的情況下,則不能。優(yōu)選地,在這一點獲得正確的參數(shù)值。本發(fā)明突出之處在于使用控制流程圖以使得參數(shù)a的計算安全。這是通過在與包括函數(shù)調(diào)用的基本塊不同的基本塊中插入向參數(shù)a分配某個值的指令來完成的。例如,執(zhí)行路徑A,(310-320-340-360)在基本塊;340中向參數(shù)a分配值(a=y),基本塊340與包括函數(shù)調(diào)用的基本塊360不同。類似地,執(zhí)行路徑B,(310-320-330-360)在基本塊330(也與基本塊360不同)中分配參數(shù)值(a=y),而執(zhí)行路徑C’(310-350-370)在與具有函數(shù)調(diào)用的基本塊370不同的基本塊350中分配參數(shù)值(a=ζ)。本領(lǐng)域技術(shù)人員將注意到,對于位于基本塊360中的跳轉(zhuǎn)的執(zhí)行路徑(A’與B’),參數(shù)值是相同的(a=y)。這是優(yōu)選的,但是所述值也可能是不同的。本領(lǐng)域技術(shù)人員將認(rèn)識到,可能已經(jīng)在對于兩個執(zhí)行路徑是公共的但是與執(zhí)行路徑C’不同的基本塊320中為這兩個執(zhí)行路徑分配了參數(shù)值。本領(lǐng)域技術(shù)人員將認(rèn)識到對于分配參數(shù)值以及對于函數(shù)調(diào)用可能有大量的變型。首先,可能具有多個不同的函數(shù)調(diào)用,其中每一個具有不同的參數(shù)。其次,也可以在對于不止一個執(zhí)行路徑公共的基本塊中分配參數(shù)值;例如,執(zhí)行路徑A’與B’可在公共基本塊320(其不是執(zhí)行路徑C’的一部分)中分配參數(shù)值。第三,在函數(shù)調(diào)用之前,可以不止一次地向參數(shù)分配值;例如,第一次分配可將第一個值給予參數(shù),而第二次分配可修改該值,例如通過向其增加一。第四,分配可依賴于多個因素,并可包括諸如散列函數(shù)之類的函數(shù)。本領(lǐng)域技術(shù)人員還將意識到在沒有訪問控制流程圖的情況下,很難對作為結(jié)果的機(jī)器代碼進(jìn)行逆向工程,這是因為很難發(fā)現(xiàn)在哪里分配參數(shù)。應(yīng)該注意的是,通常不向控制流程圖提供包括機(jī)器代碼的二進(jìn)制數(shù)。同時,也將要認(rèn)識到難以從機(jī)器代碼中生成控制流程圖,這是因為,由于不在靜態(tài)代碼中出現(xiàn),而是在執(zhí)行期間計算出跳轉(zhuǎn)的地址,所以難以獲得跳轉(zhuǎn)的地址。圖4圖示了根據(jù)本發(fā)明優(yōu)選實施例的代碼迷惑的方法。在步驟410中以在基本塊x(例如,圖3中基本塊360)中的函數(shù)調(diào)用來替換跳轉(zhuǎn)。在步驟420中,使用控制流程圖(CFG)從塊X開始回溯(backtrack)以發(fā)現(xiàn)至少部分通向該塊的可能的執(zhí)行路徑。如上文描述的,在圖3中存在兩條從基本塊310通向基本塊360的執(zhí)行路徑執(zhí)行路徑A,(310-320-340-360)以及執(zhí)行路徑B,(310-320-330-360)。在步驟430中,在至少一條(可能為多條或全部)已發(fā)現(xiàn)的執(zhí)行路徑中選擇基本塊Y?;緣KY優(yōu)選地對于該執(zhí)行路徑是唯一的,但也可能基本塊Y由多條執(zhí)行路徑共享。在執(zhí)行路徑中存在多個用于基本塊Y的候選項的情況下,優(yōu)選地使用遠(yuǎn)離基本塊χ的一個。繼續(xù)該示例,用于兩個執(zhí)行路徑的基本塊Y的候選項為A,=310-320-340和B,:310-320_330。如果期望基本塊Y對于執(zhí)行路徑是唯一的,則這僅給A’留下基本塊340而給B’留下基本塊330。然而,如已經(jīng)提及的,可能在對兩個執(zhí)行路徑公共的例如基本塊320中分配參數(shù),并且也可能在基本塊330與340中的任一個或這兩者中修改或改變參數(shù)值。在步驟440中,在基本塊Y中插入?yún)?shù)分配。繼續(xù)該示例,在兩個執(zhí)行路徑A’和B,中分配參數(shù),基本塊340中"a=y”,以及基本塊330中"a=y”。圖5圖示了根據(jù)本發(fā)明優(yōu)選實施例用于代碼迷惑的設(shè)備。設(shè)備500包括至少一個處理器(在此,“處理器”)510;存儲器空間520;至少一個用于與其它設(shè)備通信的通信單元(1/0)530;以及用于用戶交互的用戶接口(UI)MO。優(yōu)選地在處理器510中實施,設(shè)備500包括用于以函數(shù)調(diào)用替換跳轉(zhuǎn)的單元550(大致與步驟410對應(yīng));用于發(fā)現(xiàn)執(zhí)行路徑的單元560(大致與步驟420對應(yīng));用于發(fā)現(xiàn)候選基本塊的單元570(大致與步驟430對應(yīng));以及用于插入?yún)?shù)分配的單元(大致與步驟440對應(yīng))。設(shè)備500優(yōu)選地還包括(未示出)用于取得源代碼并且生成語法樹120、CFG130、匯編代碼140以及機(jī)器代碼150的單元。圖5還圖示了用于存儲使用根據(jù)本發(fā)明優(yōu)選實施例的方法而迷惑的編譯的計算機(jī)代碼的計算機(jī)程序載體590,例如CD-ROM或用于存儲計算機(jī)代碼的任何其它合適的載體。由此將認(rèn)識到本發(fā)明使得對抗至少靜態(tài)的反匯編的代碼迷惑成為可能??梢元毩⒌鼗蛟谌魏芜m當(dāng)組合中提供本描述中以及(在適當(dāng)?shù)那闆r下的)權(quán)利要求以及附圖中公開的每個特征。被描述為在硬件中實施的特征也可在軟件中實施,反之亦然。在可應(yīng)用的情況下,可以將連接實施為無線連接或有線連接,不一定為直接或?qū)S玫倪B接。出現(xiàn)在權(quán)利要求中的參考標(biāo)號僅僅是說明性的并且應(yīng)該對權(quán)利要求的范圍沒有限制影響。權(quán)利要求1.一種用于迷惑編譯的計算機(jī)代碼(300)的方法,所述編譯的計算機(jī)代碼(300)包括以多個基本塊(310-370)組織的計算機(jī)代碼指令,該方法包括如下步驟-以具有至少一個參數(shù)的函數(shù)調(diào)用來替換(410)第一基本塊(360;370)中的跳轉(zhuǎn)指令,其中所述函數(shù)調(diào)用在執(zhí)行時依賴于所述參數(shù)來確定要執(zhí)行的下一函數(shù)的地址;-向所述編譯的計算機(jī)代碼(300)插入(440)向所述參數(shù)分配值的指令,所述值使得由所述函數(shù)調(diào)用確定的地址與被替換的跳轉(zhuǎn)指令的目的地地址對應(yīng);其特征在于,將分配指令插入至與所述第一基本塊(360;370)不同的并意圖要在第一基本塊之前執(zhí)行的第二基本塊(320-350)中的計算機(jī)代碼。2.如權(quán)利要求1所述的方法,其中所述跳轉(zhuǎn)函數(shù)為無條件跳轉(zhuǎn)函數(shù)。3.如權(quán)利要求1所述的方法,進(jìn)一步包括如下步驟在之前的包括有條件跳轉(zhuǎn)指令的第三基本塊(310-340)與所述第一基本塊(360;370)之間的執(zhí)行路徑中選擇(430)第二基本塊(320-350)。4.如權(quán)利要求3所述的方法,其中,使用用于編譯的計算機(jī)代碼的控制流程圖中的信息來選擇第二基本塊(320-350)。5.一種用于迷惑編譯的計算機(jī)代碼(300)的設(shè)備(500),所述編譯的計算機(jī)代碼(300)包括以多個基本塊(310-370)組織的計算機(jī)代碼指令,該設(shè)備(500)包括-替換單元(550),適配為以具有至少一個參數(shù)的函數(shù)調(diào)用來替換第一基本塊(360;370)中的跳轉(zhuǎn)指令,其中所述函數(shù)調(diào)用在執(zhí)行時依賴于所述參數(shù)來確定要執(zhí)行的下一函數(shù)的地址;-插入單元(580),適配為向所述編譯的計算機(jī)代碼(300)插入向該參數(shù)分配值的指令,所述值使得由所述函數(shù)調(diào)用確定的地址與被替換的跳轉(zhuǎn)指令的目的地地址對應(yīng);所述設(shè)備特征在于,其進(jìn)一步包括發(fā)現(xiàn)單元(570),適配為發(fā)現(xiàn)該插入單元(580)向其中插入分配指令的、與第一基本塊(360;370)不同的并且意圖要在第一基本塊之前執(zhí)行的第二基本塊(320-350)。6.如權(quán)利要求5所述的設(shè)備,其中所述替換單元(550)適配為替換無條件跳轉(zhuǎn)函數(shù)。7.如權(quán)利要求5所述的設(shè)備,其中所述發(fā)現(xiàn)單元(570)適配為在之前的包括有條件跳轉(zhuǎn)指令的第三基本塊(310-340)與所述第一基本塊(360;370)之間的執(zhí)行路徑中發(fā)現(xiàn)第二基本塊(320-350)。8.如權(quán)利要求7所述的設(shè)備,其中所述發(fā)現(xiàn)單元(570)適配為使用用于編譯的計算機(jī)代碼的控制流程圖中的信息來發(fā)現(xiàn)第二基本塊(320-350)9.如權(quán)利要求5所述的設(shè)備,其中,在至少一個處理器(510)中實施所述替換單元(550),所述插入單元(580),以及所述發(fā)現(xiàn)單元(570)。全文摘要通過利用具有至少一個參數(shù)的函數(shù)調(diào)用來替換(410)第一基本塊(360;370)中的跳轉(zhuǎn)指令,來迷惑包括以多個基本塊(310-370)組織的計算機(jī)代碼指令的編譯的計算機(jī)代碼(300),其中,該函數(shù)調(diào)用在執(zhí)行時依賴于該參數(shù)來確定要執(zhí)行的下一函數(shù)的地址;向編譯的計算機(jī)代碼(300)插入(440)向參數(shù)分配值的指令,所述值使得由該函數(shù)調(diào)用所確定的地址與被替換的跳轉(zhuǎn)指令的地址對應(yīng)。優(yōu)選地使用來自控制流程圖(CFG)的信息,將分配函數(shù)插入至與第一基本塊(360;370)不同的第二基本塊(320-350)中的計算機(jī)代碼中。在不能夠從迷惑的代碼中生成CFG的同時,這可以確保在沒有來自CFG的信息的情況下不能對迷惑后的代碼進(jìn)行反匯編。還提供了一種用于代碼迷惑的設(shè)備。文檔編號G06F21/14GK102132289SQ200980132311公開日2011年7月20日申請日期2009年8月17日優(yōu)先權(quán)日2008年8月21日發(fā)明者安托萬.蒙西夫羅特,費邊.拉霍德雷申請人:湯姆森特許公司