子程序花指令加密算法

根據(jù)反匯編器原理,分析現(xiàn)有的花指令加密算法存在的問(wèn)題,我們提出了一種新的花指令加密算法——子程序花指令加密算法。

一、花指令加密基本原理及現(xiàn)狀

1、花指令加密工作原理

軟件破解者要想有效的破解軟件,需要對(duì)程序代碼進(jìn)行靜態(tài)分析和跟蹤?;ㄖ噶罴用芸梢杂行У貙?duì)抗靜態(tài)分析,經(jīng)過(guò)花指令變換后的程序代碼具有一定的反跟蹤能力,能夠在很大程度上增加軟件破解者對(duì)程序進(jìn)行分析和跟蹤的難度,從而有效地保護(hù)軟件的知識(shí)產(chǎn)權(quán)。

花指令分為可執(zhí)行花指令和不可執(zhí)行花指令。可執(zhí)行花指令指的是能夠正常運(yùn)行但又不改變?cè)汲绦蜻壿嬓缘囊唤M無(wú)用指令。這類花指令常常用在病毒代碼的變形引擎中,但反匯編器能夠正常反匯編這些花指令。不可執(zhí)行花指令又稱垃圾字節(jié),是指被插入到原始代碼中但又不改變?cè)汲绦蜻壿嬓缘囊唤M無(wú)用字節(jié)。被插入的字節(jié)不能被執(zhí)行,否則會(huì)使程序的邏輯性遭到破壞,影響程序運(yùn)行的結(jié)果。根據(jù)反匯編的工作原理,當(dāng)插入的最后一個(gè)或多個(gè)花指令與其后正常的指令被反匯編器識(shí)別成一條有效地指令時(shí),就能有效地破壞反匯編器的反匯編結(jié)果?;ㄖ噶罴用芗夹g(shù)就充分利用了這一特點(diǎn),通過(guò)在程序代碼中插入一些隨機(jī)的不完整指令來(lái)破壞反匯編器的結(jié)果,達(dá)到保護(hù)軟件的目的。

2、花指令加密研究現(xiàn)狀

目前花指令加密中采用較多的一種形式是無(wú)條件跳轉(zhuǎn)指令JMP加花指令腳,這種方法具有簡(jiǎn)單、易實(shí)現(xiàn)的優(yōu)點(diǎn),但存在特征碼,容易被工具自動(dòng)去除。另一種形式是直接在程序代碼中的JMP指令后添加花指令,這種方法的優(yōu)點(diǎn)是不存在特征碼,但受代碼中JMP指令個(gè)數(shù)的影響,如果JMP指令數(shù)太少,則變換效果不明顯。從以上內(nèi)容可以看出,目前花指令加密中采用的多是JMP及各種JMP變形后加花指令的變換方法,這種方法雖然能夠在一定程度上破壞反匯編器的反匯編結(jié)果,但模糊度較低。因此要想更好的對(duì)程序進(jìn)行花指令加密,就必須應(yīng)用多個(gè)方法,使得產(chǎn)生的花指令既無(wú)固定的特征碼,又具有較高的模糊度。

二、反匯編器工作原理分析

目前,大多數(shù)反匯編器使用的反匯編方法分為兩類:一是線性掃描法,反匯編器從程序代碼的第一個(gè)可執(zhí)行字節(jié)開始依次逐個(gè)的將程序中的二進(jìn)制代碼反匯編成相應(yīng)的匯編指令;另一種方法是遞歸掃描法,反匯編器沿著程序的指令執(zhí)行控制流來(lái)一步一步進(jìn)行反匯編,將二進(jìn)制代碼反匯編成相應(yīng)的匯編指令。

在遞歸掃描中,如果在目標(biāo)程序的代碼中出現(xiàn)了跳轉(zhuǎn)分支,反匯編器就會(huì)把這個(gè)分支地址記錄下來(lái),并分頭反匯編各個(gè)分支中的指令。但反匯編器并不去判斷分支代碼正確與否,它們只是將跳轉(zhuǎn)地址的代碼進(jìn)行反匯編。因此,如果在程序代碼中加入一些偽分支,使得這些偽分支永遠(yuǎn)也不可能達(dá)到圈,然后在這些偽分支的地方加上一些花指令,那么反匯編器就會(huì)將這些花指令作為代碼進(jìn)行反匯編,極有可能使得添加的花指令與其后的代碼結(jié)合在一起,從而擾亂整個(gè)反匯編結(jié)果。由于這種方法中,跳轉(zhuǎn)偽分支的目的地址是正確的,因此這些花指令是必須要進(jìn)行反匯編的,花指令也就更容易與其后的程序原代碼結(jié)合在一起,擾亂反匯編器的反匯編結(jié)果。

三、子程序花指令加密算法

1、加密算法思想

在下面提出的子程序花指令加密算法中,采用了將可執(zhí)行花指令與隨機(jī)選擇的不可執(zhí)行花指令相結(jié)合的方法。通過(guò)在程序的子程序中構(gòu)造偽分支,并添加一些花指令,來(lái)迷惑反匯編器,達(dá)到代碼保護(hù)的目的。

子程序中的偽分支使用XOR指令和CMP指令來(lái)進(jìn)行構(gòu)造o XOR指令是將兩個(gè)操作數(shù)進(jìn)行邏輯“異或”操作的指令,它具有一個(gè)明顯的特點(diǎn),即:某一個(gè)數(shù)A與同一個(gè)數(shù)B進(jìn)行兩次“異或”操作后數(shù)值A(chǔ)不變,即有:

子程序花指令加密算法
在子程序花指令加密算法中就充分利用了這一特點(diǎn)。通過(guò)隨機(jī)插入一個(gè)數(shù)B,讓B與寄存器AL數(shù)值中A進(jìn)行“異或”,然后得到中間結(jié)果C,將這個(gè)C與B進(jìn)行比較,如果相等就跳轉(zhuǎn)到添加的花指令的位置,如果不等則跳轉(zhuǎn)到添加的下一個(gè)“異或”指令,即,用C與召再進(jìn)行一次“異或”操作,仍然得到原來(lái)的寄存器AL中的數(shù)值A(chǔ)。

偽分支就是在A與B進(jìn)行了“異或”得到C之后,比較B與C的值,如果相等就跳轉(zhuǎn)到labell的位置,labell的位置是添加的隨機(jī)花指令;如果不等就跳轉(zhuǎn)到labe12的位置,labe12的位置是添加的第二條XOR指令。只要寄存器AL中的值不為O,那么A和曰“異或”之后就永遠(yuǎn)也不可能等于日,所以labell就是一個(gè)偽分支,也就是說(shuō)程序永遠(yuǎn)也不可能去執(zhí)行l(wèi)abell處的指令,因此程序只能去執(zhí)行l(wèi)abe12處的指令。但是由于labell處的地址是合法的目的地址,而且添加的je labell是合法的跳轉(zhuǎn)指令,所以反匯編器一定要反匯編labell處的花指令,從而有可能將花指令與其后的代碼結(jié)合在一起,使反匯編結(jié)果出錯(cuò)。

2、子程序花指令變換描述

子程序花指令加密算法變換前后:

子程序花指令加密算法

基本加密算法概要描述如下:

(1)找到子程序調(diào)用候選塊,得到子程序調(diào)用的指針p;

(2)進(jìn)入子程序模塊,找到MOV指令,產(chǎn)生一個(gè)隨機(jī)數(shù)m;

(3)在MOV指令后面添加兩條XOR AL,m指令;

(4)在添加的第一條XOR指令后添加CMP指令;

(5)在CMP指令后添加JE和JNE指令,并設(shè)置JNE的跳轉(zhuǎn);

(6)在JNE指令后添加上n條花指令;

(7)設(shè)置JE的跳轉(zhuǎn);

(8)變換完成,程序繼續(xù)執(zhí)行,掃描尋找下一個(gè)需要變換的子程序模塊。

子程序花指令加密算法工作流程見圖1。

子程序花指令加密算法

3、迷惑度分析

子程序花指令加密算法最為關(guān)鍵的是添加的花指令反匯編器是一定要進(jìn)行反匯編的,所以,當(dāng)添加的不完整花指令是正確的跳轉(zhuǎn)位置時(shí),它們就更容易與其后的代碼結(jié)合在一起,從而有效地?cái)_亂程序代碼。而以前的各種JMP加花指令的形式,在反匯編器采用遞歸掃描方法反匯編代碼時(shí),由于花指令不在程序的控制流程內(nèi),所以反匯編器不用反匯編這些代碼。

在本加密算法中,由于與寄存器做“異或”運(yùn)算的數(shù)值m是隨機(jī)產(chǎn)生的,添加的佗條花指令也是隨機(jī)產(chǎn)生的,這保證了該加密算法具有一定的隨機(jī)性。兩條XOR指令同時(shí)與AL中的值進(jìn)行“異或”操作,保證了AL中的值在變換前后沒有改變。在比較指令CMP al,m中,由于al中的值與m是不相等的,所以程序也不可能去執(zhí)行JE labell指令,而只能去執(zhí)行JNE labe12指令,因此程序在變換前后的邏輯一致性沒有遭到破壞,仍然可以完成相同的功能。

四、子程序花指令加密算法實(shí)踐

1、實(shí)驗(yàn)步驟與結(jié)果

(1)實(shí)驗(yàn)環(huán)境

硬件環(huán)境:AMD SempronlMProcessor 3200+1.79 GHz/768 MMemory/19.5 G HardDisk。
軟件環(huán)境:操作系統(tǒng)Windows XP+SP2/JCEE變換器/OIIy-dbg反匯編調(diào)試器/實(shí)驗(yàn)用可執(zhí)行程序0928.exe。其中JCEE變換器是為實(shí)現(xiàn)變換而編制的測(cè)試程序,程序0928.exe是用來(lái)進(jìn)行變換的實(shí)驗(yàn)用程序。

(2)實(shí)驗(yàn)步驟

a、對(duì)實(shí)驗(yàn)用原程序進(jìn)行反匯編,得到匯編偽代碼P;

b、用JCEE變換器對(duì)原程序進(jìn)行變換,得到變換后的程序;

c、用反匯編器對(duì)匯編后的程序進(jìn)行反匯編,得到匯編偽代碼P'。

(3)實(shí)驗(yàn)結(jié)果

候選塊的大小為58條指令,其中有4個(gè)子程序調(diào)用指令。變換前后的程序代碼分別如圖2和圖3所示(選定其中的一個(gè)子程序進(jìn)行分析,這個(gè)子程序共有12條指令)。

子程序花指令加密算法

2、實(shí)驗(yàn)分析

從圖3可以看出,子程序在經(jīng)過(guò)變換后,JE跳轉(zhuǎn)位置處的不完整花指令確實(shí)與其后的若干個(gè)正常代碼結(jié)合在一起,使得反匯編器的反匯編結(jié)果出錯(cuò)。

從以上的圖2、圖3中也可以分析出,原來(lái)的12條指令有2條指令和添加的花指令結(jié)合在一起,使得反匯編器出現(xiàn)了錯(cuò)誤。而且,添加XOR指令時(shí)是添加的兩條XOR指令,但是第二條XOR指令也與花指令結(jié)合到一起。因此,在這個(gè)子程序中共有3條指令出現(xiàn)了反匯編錯(cuò)誤。

經(jīng)驗(yàn)證,變換后的程序是可以運(yùn)行的,而且和沒有經(jīng)過(guò)變換的程序具有一樣的輸出結(jié)果,也就是程序在經(jīng)過(guò)變換后其邏輯一致性沒有受到破壞。對(duì)變換后的結(jié)果使用花指令自動(dòng)去除工具,也不能將程序中的花指令自動(dòng)去除。這是由于JE指令是作為原始代碼的一個(gè)組成部分是不能被去除的,否則程序邏輯性會(huì)遭到破壞,程序就無(wú)法正常運(yùn)行了。

子程序花指令加密算法

小知識(shí)之反匯編

反匯編:把目標(biāo)代碼轉(zhuǎn)為匯編代碼的過(guò)程,也可以說(shuō)是把機(jī)器語(yǔ)言轉(zhuǎn)換為匯編語(yǔ)言代碼、低級(jí)轉(zhuǎn)高級(jí)的意思,常用于軟件破解(例如找到它是如何注冊(cè)的,從而解出它的注冊(cè)碼或者編寫注冊(cè)機(jī))、外掛技術(shù)、病毒分析、逆向工程、軟件漢化等領(lǐng)域。學(xué)習(xí)和理解反匯編語(yǔ)言對(duì)軟件調(diào)試、漏洞分析、OS的內(nèi)核原理及理解高級(jí)語(yǔ)言代碼都有相當(dāng)大的幫助,在此過(guò)程中我們可以領(lǐng)悟到軟件作者的編程思想。總之一句話:軟件一切神秘的運(yùn)行機(jī)制全在反匯編代碼里面。