本發(fā)明屬于計(jì)算機(jī)安全
技術(shù)領(lǐng)域:
,具體涉及一種基于兩次變換的代碼混淆方法。
背景技術(shù):
:軟件保護(hù)技術(shù)可以防止未經(jīng)授權(quán)的用戶(hù)非法使用、復(fù)制計(jì)算機(jī)軟件程序,阻礙攻擊者對(duì)軟件程序的代碼進(jìn)行逆向分析。使用腳本語(yǔ)言編寫(xiě)的軟件程序日益增多,這類(lèi)軟件程序的發(fā)布、傳播基于源代碼的形式進(jìn)行,在軟件安全性上面臨較大挑戰(zhàn)?,F(xiàn)有技術(shù)中,針對(duì)腳本語(yǔ)言軟件程序的軟件保護(hù)技術(shù)主要有以下方法:第一類(lèi),源代碼加密:預(yù)先使用特定算法對(duì)源代碼進(jìn)行加密,密文在程序運(yùn)行時(shí)解密還原。這類(lèi)方法可被掛鉤等手段輕易攻破,保護(hù)強(qiáng)度不高。第二類(lèi),源代碼簡(jiǎn)單混淆:打亂標(biāo)識(shí)符、代碼格式、編碼,造成閱讀障礙。這類(lèi)方法對(duì)自動(dòng)化工具影響不大,保護(hù)強(qiáng)度不高。第三類(lèi),編譯保護(hù):將源代碼編譯為二進(jìn)制指令序列,在程序運(yùn)行時(shí),由其它程序?qū)⒅噶钚蛄修D(zhuǎn)換為字節(jié)碼以供執(zhí)行。這類(lèi)方法保護(hù)強(qiáng)度高,但需要依賴(lài)額外程序的支持,適用面狹窄,使用和推廣受到了極大的限制。技術(shù)實(shí)現(xiàn)要素:針對(duì)現(xiàn)有技術(shù)中存在的問(wèn)題,本發(fā)明提供了一種基于二次變換的代碼混淆方法,步驟包括:獲取待混淆代碼;進(jìn)行第一次變換,將所述待混淆代碼轉(zhuǎn)換為指令序列形式的中間代碼;進(jìn)行第二次變換,將所述中間代碼轉(zhuǎn)換為混淆后代碼;其中,所述中間代碼對(duì)應(yīng)的計(jì)算機(jī)語(yǔ)言是一種低級(jí)計(jì)算機(jī)語(yǔ)言。進(jìn)一步地,所述中間代碼對(duì)應(yīng)的計(jì)算機(jī)語(yǔ)言是一種低級(jí)計(jì)算機(jī)語(yǔ)言,具體包括:所述中間代碼對(duì)應(yīng)的計(jì)算機(jī)語(yǔ)言對(duì)應(yīng)一個(gè)指令集合,所述指令集合由若干指令的定義構(gòu)成,所述指令的定義包括指令的操作碼、指令的具體操作。進(jìn)一步地,所述中間代碼對(duì)應(yīng)的計(jì)算機(jī)語(yǔ)言是一種低級(jí)計(jì)算機(jī)語(yǔ)言,具體包括:所述中間代碼對(duì)應(yīng)的計(jì)算機(jī)語(yǔ)言對(duì)應(yīng)一個(gè)物理或虛擬計(jì)算機(jī)體系中存儲(chǔ)結(jié)構(gòu)的集合,所述存儲(chǔ)結(jié)構(gòu)的集合至少包括程序計(jì)數(shù)器、堆棧。進(jìn)一步地,進(jìn)行第一次變換,具體包括:如果所述待混淆代碼對(duì)應(yīng)的計(jì)算機(jī)語(yǔ)言是一種高級(jí)計(jì)算機(jī)語(yǔ)言,則第一次變換的方法是一組編譯規(guī)則;如果所述待混淆代碼對(duì)應(yīng)的計(jì)算機(jī)語(yǔ)言是一種低級(jí)計(jì)算機(jī)語(yǔ)言,則第一次變換的方法是一組映射規(guī)則。進(jìn)一步地,進(jìn)行第二次變換,具體是指:將所述中間代碼對(duì)應(yīng)的計(jì)算機(jī)語(yǔ)言對(duì)應(yīng)的指令集合中每一個(gè)指令的定義,表示為所述待混淆代碼對(duì)應(yīng)的計(jì)算機(jī)語(yǔ)言中的一個(gè)函數(shù)模塊,所述函數(shù)模塊的名稱(chēng)是所述指令的操作碼,所述函數(shù)模塊的功能是所述指令的具體操作;將所述中間代碼對(duì)應(yīng)的計(jì)算機(jī)語(yǔ)言對(duì)應(yīng)的存儲(chǔ)結(jié)構(gòu)集合中每一個(gè)存儲(chǔ)結(jié)構(gòu),表示為所述待混淆代碼對(duì)應(yīng)的計(jì)算機(jī)語(yǔ)言中的一個(gè)變量;將所述中間代碼,表示為所述待混淆代碼對(duì)應(yīng)的計(jì)算機(jī)語(yǔ)言中的一個(gè)條件循環(huán)結(jié)構(gòu),所述條件循環(huán)結(jié)構(gòu)的判斷條件是程序計(jì)數(shù)器變量的值在0和所述中間代碼指令數(shù)量的范圍內(nèi),所述條件循環(huán)結(jié)構(gòu)的執(zhí)行內(nèi)容是調(diào)用所述中間代碼中以程序計(jì)數(shù)器變量的值作為序號(hào)的指令對(duì)應(yīng)的函數(shù)模塊,所述被函數(shù)模塊的名稱(chēng)是所述指令的操作碼,調(diào)用所述函數(shù)模塊時(shí)將所述指令的操作數(shù)作為參數(shù)傳入;將函數(shù)模塊、變量、循環(huán)結(jié)構(gòu)存放在同一個(gè)文件中,得到混淆后代碼。本發(fā)明與現(xiàn)有技術(shù)相比,具有以下技術(shù)特點(diǎn):1.本發(fā)明不針對(duì)特定的計(jì)算機(jī)語(yǔ)言,適用面廣泛;2.針對(duì)腳本語(yǔ)言而言,本方法需要對(duì)程序代碼進(jìn)行編譯處理,有效提高代碼混淆的強(qiáng)度;3.針對(duì)腳本語(yǔ)言而言,經(jīng)過(guò)本方法混淆的代碼不依賴(lài)額外的程序支持即可運(yùn)行,有效降低對(duì)運(yùn)行環(huán)境的要求。附圖說(shuō)明附圖用來(lái)提供對(duì)本發(fā)明的進(jìn)一步了解,并且構(gòu)成說(shuō)明書(shū)的一部分,與本發(fā)明的實(shí)施例一起用于解釋本發(fā)明,并不構(gòu)成對(duì)本發(fā)明的限制。圖1為本發(fā)明的數(shù)據(jù)流圖;圖2為本發(fā)明實(shí)施例待混淆代碼流程圖;圖3為本發(fā)明實(shí)施例混淆后代碼流程圖。具體實(shí)施方式下面通過(guò)附圖和實(shí)施例對(duì)本發(fā)明作進(jìn)一步的說(shuō)明。在實(shí)施例中,待混淆代碼使用超文本預(yù)處理語(yǔ)言PHP編寫(xiě),PHP是一種常見(jiàn)的、用于Web開(kāi)發(fā)的腳本語(yǔ)言。在實(shí)施例中,中間代碼屬于一種低級(jí)計(jì)算機(jī)語(yǔ)言,該語(yǔ)言對(duì)應(yīng)的指令集合如表1所示,該語(yǔ)言對(duì)應(yīng)的存儲(chǔ)結(jié)構(gòu)的集合如表2所示。表1實(shí)施例中間代碼對(duì)應(yīng)的計(jì)算機(jī)語(yǔ)言對(duì)應(yīng)的指令集合表2實(shí)施例中間代碼對(duì)應(yīng)的計(jì)算機(jī)語(yǔ)言對(duì)應(yīng)的存儲(chǔ)結(jié)構(gòu)的集合存儲(chǔ)結(jié)構(gòu)類(lèi)型初始值程序計(jì)數(shù)器整數(shù)0堆棧數(shù)組空數(shù)組棧頂?shù)刂氛麛?shù)0在以下步驟中,將通過(guò)混淆一段PHP代碼來(lái)解釋本發(fā)明的方法。步驟1,獲取待混淆代碼。待混淆代碼如表3所示,圖2是其對(duì)應(yīng)的流程圖。表3待混淆PHP代碼步驟2,進(jìn)行第一次變換,將待混淆代碼轉(zhuǎn)換為指令序列形式的中間代碼。待混淆代碼對(duì)應(yīng)的計(jì)算機(jī)語(yǔ)言PHP是一種高級(jí)計(jì)算機(jī)語(yǔ)言,因此第一次變換是一個(gè)編譯過(guò)程。編譯待混淆代碼,得到如表4所示的中間代碼。表4中間代碼指令地址指令操作碼指令操作數(shù)0PUSH_GET1PUSH_STR“key”2FETCH_ARRAY3POP4PUSH_STR“abc123”5CMPE6POP7JMPT108POP9JMP1410POP11PUSH_STR“HelloWorld!”12ECHO13POP14NOP步驟3,進(jìn)行第二次變換,將中間代碼轉(zhuǎn)換為混淆后代碼,具體包括以下步驟:步驟3.1,使用PHP為表1中每一個(gè)指令創(chuàng)建一個(gè)函數(shù),函數(shù)的名稱(chēng)是指令的操作碼,函數(shù)的功能是完成指令的具體操作,函數(shù)的參數(shù)是指令操作數(shù)及表2中所有結(jié)構(gòu)的變量。表5是為表1中第一個(gè)指令創(chuàng)建的函數(shù)的示例代碼。表5操作碼為PUSH_STR的指令對(duì)應(yīng)的PHP函數(shù)表6使用變量表示存儲(chǔ)結(jié)構(gòu)的PHP代碼步驟3.2,使用PHP為表2中每一個(gè)存儲(chǔ)結(jié)構(gòu)創(chuàng)建一個(gè)變量表示,并賦初值。表6是對(duì)應(yīng)的代碼。步驟3.3,使用PHP創(chuàng)建一個(gè)條件循環(huán)結(jié)構(gòu),條件循環(huán)結(jié)構(gòu)的判斷條件是程序計(jì)數(shù)器變量的值大于或等于0且小于15,條件循環(huán)結(jié)構(gòu)內(nèi)部是一個(gè)多分支選擇結(jié)構(gòu),多分支選擇結(jié)構(gòu)用于根據(jù)程序計(jì)數(shù)器變量的值定位到對(duì)應(yīng)的指令,在多分支選擇結(jié)構(gòu)中,每個(gè)分支的判斷條件為指令地址,每個(gè)分支的操作:增加程序計(jì)數(shù)器變量的值,調(diào)用相應(yīng)地址的指令對(duì)應(yīng)的函數(shù)。表7是對(duì)應(yīng)的代碼。表7中間代碼的PHP實(shí)現(xiàn)將步驟3.1、步驟3.2、步驟3.3得到的PHP代碼保存到同一個(gè)文件中,得到混淆后代碼。圖3是混淆后代碼對(duì)應(yīng)的流程圖。與其它源代碼加密的技術(shù)相比較,本發(fā)明不保留原始的代碼,因而不存在采用技術(shù)手段提取源代碼的基礎(chǔ)。與其它源代碼簡(jiǎn)單混淆的技術(shù)相比較,本發(fā)明采用了編譯的方法對(duì)源代碼進(jìn)行處理,抹去了原始的程序結(jié)構(gòu)和變量信息,能夠有效隱藏代碼的原始信息。表8中比較了待混淆代碼和混淆后代碼的Token數(shù)目和Opcode數(shù)目,明顯可得,混淆后代碼的程序復(fù)雜程度比待混淆代碼有大幅提升。表8待混淆代碼與混淆后代碼的程序復(fù)雜程度比較Token數(shù)目Opcode數(shù)目待混淆代碼237混淆后代碼776264與其它編譯保護(hù)的技術(shù)相比較,本發(fā)明得到的混淆后代碼是合法的PHP代碼,不依賴(lài)任何額外的PHP擴(kuò)展程序即可運(yùn)行,有效降低了對(duì)運(yùn)行環(huán)境的要求。當(dāng)前第1頁(yè)1 2 3