本發(fā)明涉及一種程序混淆方法,具體地說是一種基于控制流和外形混淆的Python代碼混淆方法。
背景技術(shù):
軟件代碼的安全保護(hù)是計(jì)算機(jī)安全領(lǐng)域的一個(gè)重點(diǎn)研究?jī)?nèi)容。隨著互聯(lián)網(wǎng)的飛速發(fā)展和大數(shù)據(jù)時(shí)代的到來,分布式計(jì)算環(huán)境在給人們帶來更強(qiáng)的計(jì)算能力和更大的靈活性的同時(shí),也使軟件代碼不可避免的地運(yùn)行在不可信的節(jié)點(diǎn)上,從而使軟件代碼面臨更加嚴(yán)峻的安全問題。相對(duì)于攻擊者并不知曉攻擊對(duì)象內(nèi)部情況的黑盒子攻擊,這種暴露軟件代碼,通過逆向分析代碼的運(yùn)行,并對(duì)代碼進(jìn)行惡意篡改或盜取的安全攻擊成為白盒子攻擊。目前白盒子攻擊的威脅正在快速上升和不斷演化。軟件代碼混淆技術(shù)是近十年來發(fā)展起來的一種軟件白盒子安全保護(hù)技術(shù)。
Python語言現(xiàn)在變得越來越流行,它是一種面向?qū)ο?、解釋型?jì)算機(jī)程序設(shè)計(jì)語言。Python語法簡(jiǎn)潔而清晰,具有豐富和強(qiáng)大的類庫,常被昵稱為膠水語言,它能夠把其他語言制作的各種模板(尤其是C/C++)很輕松地聯(lián)結(jié)在一起。
現(xiàn)階段,由于Python語言的方便性,大量應(yīng)用開始采用Python語言來實(shí)現(xiàn)。但是現(xiàn)在存在很多開源的反編譯工具,可以直接將使用Python語言開發(fā)的程序模塊(pyc、pyo)反編譯為Python源代碼,導(dǎo)致程序中的核心代碼被攻擊者竊取或篡改,使得開發(fā)者很難保護(hù)其代碼的知識(shí)產(chǎn)權(quán)。
技術(shù)實(shí)現(xiàn)要素:
針對(duì)現(xiàn)有使用Python語言開發(fā)的程序在安全防護(hù)方面所存在的問題,本發(fā)明提供一種基于控制流和外形混淆的Python代碼混淆方法,以期能在保證語義上不發(fā)生改變,也不影響程序的正常執(zhí)行的條件下,通過控制流混淆和外形混淆的手段,使得混淆后的Python源代碼在被反編譯成源代碼之后難以閱讀和理解,以達(dá)到保護(hù)原創(chuàng)代碼的目的。
為達(dá)到上述發(fā)明目的,本發(fā)明采用如下技術(shù)方案:
本發(fā)明一種基于控制流和外形混淆的Python代碼混淆方法的特點(diǎn)按如下步驟進(jìn)行:
步驟1、以一個(gè)函數(shù)的開始與結(jié)束為單位,將Python代碼中所有函數(shù)進(jìn)行劃分,得到若干個(gè)單獨(dú)的函數(shù);
步驟2、針對(duì)任意一個(gè)單獨(dú)的函數(shù)fun,對(duì)其函數(shù)體中若干個(gè)連續(xù)執(zhí)行的代碼進(jìn)行分割,得到若干個(gè)基本塊并依次進(jìn)行編號(hào),記為B={b1,b2,…,bi,…,bn};bi表示第i個(gè)基本塊;所述第i個(gè)基本塊bi中的代碼只有一個(gè)入口和一個(gè)出口;1≤i≤n;
步驟3、使用基于分段Logistic混沌映射的密鑰生成算法,生成兩套密鑰;
步驟3.1、利用式(1)所示的分段Logistic混沌映射產(chǎn)生第i個(gè)實(shí)數(shù)ai,從而得到隨機(jī)實(shí)數(shù)序列A={a1,a2,…,ai,…,an}:
式(1)中,a0=rand(0,1);u表示Logistic參數(shù);且3.569946…≤u≤4;
步驟3.2、利用式(2)所示的映射函數(shù)將第i個(gè)實(shí)數(shù)ai映射成第i個(gè)整數(shù)Fi,從而將所述實(shí)數(shù)序列A={a1,a2,…,ai,…,an}映射成整數(shù)序列F={F1,F2,…,Fi,…,Fn}:
Fi=Round{ai×m} (2)
式(2)中,Round{ }是取整函數(shù);m表示映射參數(shù);
步驟3.3、統(tǒng)計(jì)所述整數(shù)序列F中互不相同的元素個(gè)數(shù),記為t;t∈[1,n];
步驟3.4、由所述步驟3.1~步驟3.3的處理過程構(gòu)成函數(shù)Logistic的函數(shù)體;由實(shí)數(shù)a0和Logistic參數(shù)u構(gòu)成二元組(a0,u)作為第t個(gè)基本塊bt的密鑰keyt;
步驟3.5、重復(fù)步驟3.1~步驟3.4,直到獲得所有基本塊的密鑰作為第一套KEY={key1,key2,…,keyt,…,keyn};
步驟3.6、重復(fù)步驟3.1~步驟3.4,直到獲得所有基本塊的密鑰作為第二套KEY′={key1′,key′2,…,key′t,…,key′n};
步驟4、基于控制流的混淆
步驟4.1、打亂所述函數(shù)fun中所有基本塊的順序,得到B′={b1′,b2′,…,bi′,…,b′n};bi′表示打亂后的第i個(gè)基本塊;
步驟4.2、以所述第一套密鑰KEY作為所述函數(shù)Logistic的參數(shù);經(jīng)過函數(shù)Logistic的函數(shù)體計(jì)算,得到下一個(gè)需要執(zhí)行的基本塊的編號(hào);
以所述第二套密鑰KEY′為作為所述函數(shù)Logistic的參數(shù);經(jīng)過函數(shù)Logistic的函數(shù)體計(jì)算,得到if-else控制語句中的條件變量,從而使用while循環(huán)語句和if-else控制語句對(duì)打亂后的所有基本塊的順序進(jìn)行控制,使得打亂后的所有基本塊的執(zhí)行順序與原來的執(zhí)行順序相同;
步驟5、基于外形的混淆
利用無意義的字符串對(duì)所述Python代碼中局部的類名、函數(shù)名、變量名進(jìn)行替換,從而形成混淆后的Python代碼。
與已有技術(shù)相比,本發(fā)明提出的基于控制流和外形混淆的Python代碼混淆方法,使代碼的反向工程更加困難,創(chuàng)建讓人理解困難的混淆代碼,來隱藏使用Python開發(fā)的應(yīng)用的核心代碼,以便防止攻擊者對(duì)應(yīng)用進(jìn)行篡改或反向工程。具體的說,有益效果體現(xiàn)在:
1、本發(fā)明基于現(xiàn)有的Logistic混沌映射算法,提出了一種新的密鑰生成算法,基于此算法生成了兩套密鑰,并將密鑰應(yīng)用到控制流混淆中,使用while循環(huán)語句和if-else控制語句改變?cè)却a的邏輯結(jié)構(gòu),使得混淆后程序的結(jié)構(gòu)更加復(fù)雜,更難被理解,但并不改變程序的執(zhí)行過程及產(chǎn)生的結(jié)果,以此來增加攻擊者理解代碼的難度。
2、本發(fā)明將控制流混淆與外形混淆相結(jié)合,提供一種更加負(fù)載的面向Python程序的代碼混淆方法,該方法能夠保證混淆后的Python源代碼在語義上不發(fā)生改變,不影響程序的正常執(zhí)行;同時(shí)使得混淆后的Python源代碼邏輯結(jié)構(gòu)變的更加復(fù)雜,并且代碼中局部的類名、函數(shù)名和變量名在外形混淆后變成無意義的字符串。從而使的混淆后的代碼更加難以理解,以此來增加Python模塊在被反編譯成源代碼之后的閱讀和理解的難度,以達(dá)到保護(hù)軟件版權(quán)的作用。
附圖說明
圖1是本發(fā)明實(shí)施例的整體流程框圖;
圖2是本發(fā)明將Python偽代碼進(jìn)行控制流混淆的示例圖。
圖3是本發(fā)明將Python偽代碼進(jìn)行外形混淆的示例圖。
具體實(shí)施方式
本實(shí)施例中,一種基于控制流和外形混淆的Python代碼混淆方法,按如圖1所示步驟進(jìn)行:
步驟1、首先,讀取需要混淆的Python代碼;其次,使用Python語言中自帶的函數(shù)獲取代碼的解析樹;然后,以一個(gè)函數(shù)的開始與結(jié)束為單位,將Python代碼中所有函數(shù)進(jìn)行劃分,得到若干個(gè)單獨(dú)的函數(shù);
步驟2、針對(duì)任意一個(gè)單獨(dú)的函數(shù)fun,如圖2所示,對(duì)其函數(shù)體中若干個(gè)連續(xù)執(zhí)行的代碼進(jìn)行分割,得到若干個(gè)基本塊并依次進(jìn)行編號(hào),記為B={b1,b2,…,bi,…,bn};圖2中基本塊個(gè)數(shù)n=4,所以得到B={b1,b2,b3,b4};bi表示第i個(gè)基本塊;第i個(gè)基本塊bi中的代碼只有一個(gè)入口和一個(gè)出口;1≤i≤n;以此來提取函數(shù)中的基本塊;
步驟3、使用基于分段Logistic混沌映射的密鑰生成算法,生成兩套密鑰;
步驟3.1、利用式(1)所示的分段Logistic混沌映射產(chǎn)生第i個(gè)實(shí)數(shù)ai,從而得到隨機(jī)實(shí)數(shù)序列A={a1,a2,…,ai,…,an}:
式(1)中,a0=rand(0,1);u表示Logistic參數(shù);且3.569946…≤u≤4;
如圖2所示,基本塊個(gè)數(shù)n=4,這里得到的隨機(jī)實(shí)數(shù)序列為A={a1,a2,a3,a4}
步驟3.2、利用式(2)所示的映射函數(shù)將第i個(gè)實(shí)數(shù)ai映射成第i個(gè)整數(shù)Fi,從而將實(shí)數(shù)序列A={a1,a2,a3,a4}映射成整數(shù)序列F={F1,F2,F3,…,F4}:
Fi=Round{ai×m} (2)
式(2)中,Round{}是取整函數(shù);m表示映射參數(shù);
步驟3.3、統(tǒng)計(jì)整數(shù)序列F中互不相同的元素個(gè)數(shù),記為t;t∈[1,n];
步驟3.4、由步驟3.1~步驟3.3的處理過程構(gòu)成函數(shù)Logistic的函數(shù)體;由實(shí)數(shù)a0和Logistic參數(shù)u構(gòu)成二元組(a0,u)作為第t個(gè)基本塊bt的密鑰keyt;
步驟3.5、重復(fù)步驟3.1~步驟3.4,直到獲得所有基本塊的密鑰作為第一套KEY={key1,key2,key3,key4};
步驟3.6、重復(fù)步驟3.1~步驟3.4,直到獲得所有基本塊的密鑰作為第二套KEY′={key1′,key′2,key3′,key′4};
步驟4、基于控制流的混淆,接下來打亂基本塊的順序并插入while和if-else語句進(jìn)行控制流混淆
步驟4.1、打亂函數(shù)fun中所有基本塊的順序,得到B′={b1′,b2′,b3′,b4′};bi′表示打亂后的第i個(gè)基本塊,其與原先基本塊的對(duì)應(yīng)順序?yàn)锽′={b1′,b2′,b3′,b4′}={b3,b1,b4,b2}
步驟4.2、以第一套密鑰KEY作為函數(shù)Logistic的參數(shù);經(jīng)過函數(shù)Logistic的函數(shù)體計(jì)算,得到下一個(gè)需要執(zhí)行的基本塊的編號(hào);
以第二套密鑰KEY′為作為函數(shù)Logistic的參數(shù);經(jīng)過函數(shù)Logistic的函數(shù)體計(jì)算,得到if-else控制語句中的條件變量,從而使用while循環(huán)語句和if-else控制語句對(duì)打亂后的所有基本塊的順序進(jìn)行控制,圖2中Logistic(keyi)=Logistic(keyi′),i∈[1,4]。因此,打亂后的基本塊的執(zhí)行順序?yàn)閧b2′,b4′,b1′,b3′},其對(duì)應(yīng)的混淆前基本塊的順序?yàn)閧b1,b2,b3,b4},因此,打亂后的所有基本塊的執(zhí)行順序與原來的執(zhí)行順序相同;
步驟5、基于外形的混淆
利用無意義的字符串對(duì)Python代碼中局部的類名、函數(shù)名、變量名進(jìn)行替換,從而形成混淆后的Python代碼。如圖3所示,使用無意義的字符串對(duì)fun函數(shù)中的函數(shù)名和變量名進(jìn)行了替換。從而增加了Python程序被反編譯后分析代碼語義的難度,保護(hù)使用Python語言開發(fā)的軟件的知識(shí)產(chǎn)權(quán)。