子程序花指令加密算法
根據(jù)反匯編器原理,分析現(xiàn)有的花指令加密算法存在的問題,我們提出了一種新的花指令加密算法——子程序花指令加密算法。
一、花指令加密基本原理及現(xiàn)狀
1、花指令加密工作原理
軟件破解者要想有效的破解軟件,需要對程序代碼進行靜態(tài)分析和跟蹤?;ㄖ噶罴用芸梢杂行У貙轨o態(tài)分析,經過花指令變換后的程序代碼具有一定的反跟蹤能力,能夠在很大程度上增加軟件破解者對程序進行分析和跟蹤的難度,從而有效地保護軟件的知識產權。
花指令分為可執(zhí)行花指令和不可執(zhí)行花指令。可執(zhí)行花指令指的是能夠正常運行但又不改變原始程序邏輯性的一組無用指令。這類花指令常常用在病毒代碼的變形引擎中,但反匯編器能夠正常反匯編這些花指令。不可執(zhí)行花指令又稱垃圾字節(jié),是指被插入到原始代碼中但又不改變原始程序邏輯性的一組無用字節(jié)。被插入的字節(jié)不能被執(zhí)行,否則會使程序的邏輯性遭到破壞,影響程序運行的結果。根據(jù)反匯編的工作原理,當插入的最后一個或多個花指令與其后正常的指令被反匯編器識別成一條有效地指令時,就能有效地破壞反匯編器的反匯編結果?;ㄖ噶罴用芗夹g就充分利用了這一特點,通過在程序代碼中插入一些隨機的不完整指令來破壞反匯編器的結果,達到保護軟件的目的。
2、花指令加密研究現(xiàn)狀
目前花指令加密中采用較多的一種形式是無條件跳轉指令JMP加花指令腳,這種方法具有簡單、易實現(xiàn)的優(yōu)點,但存在特征碼,容易被工具自動去除。另一種形式是直接在程序代碼中的JMP指令后添加花指令,這種方法的優(yōu)點是不存在特征碼,但受代碼中JMP指令個數(shù)的影響,如果JMP指令數(shù)太少,則變換效果不明顯。從以上內容可以看出,目前花指令加密中采用的多是JMP及各種JMP變形后加花指令的變換方法,這種方法雖然能夠在一定程度上破壞反匯編器的反匯編結果,但模糊度較低。因此要想更好的對程序進行花指令加密,就必須應用多個方法,使得產生的花指令既無固定的特征碼,又具有較高的模糊度。
二、反匯編器工作原理分析
目前,大多數(shù)反匯編器使用的反匯編方法分為兩類:一是線性掃描法,反匯編器從程序代碼的第一個可執(zhí)行字節(jié)開始依次逐個的將程序中的二進制代碼反匯編成相應的匯編指令;另一種方法是遞歸掃描法,反匯編器沿著程序的指令執(zhí)行控制流來一步一步進行反匯編,將二進制代碼反匯編成相應的匯編指令。
在遞歸掃描中,如果在目標程序的代碼中出現(xiàn)了跳轉分支,反匯編器就會把這個分支地址記錄下來,并分頭反匯編各個分支中的指令。但反匯編器并不去判斷分支代碼正確與否,它們只是將跳轉地址的代碼進行反匯編。因此,如果在程序代碼中加入一些偽分支,使得這些偽分支永遠也不可能達到圈,然后在這些偽分支的地方加上一些花指令,那么反匯編器就會將這些花指令作為代碼進行反匯編,極有可能使得添加的花指令與其后的代碼結合在一起,從而擾亂整個反匯編結果。由于這種方法中,跳轉偽分支的目的地址是正確的,因此這些花指令是必須要進行反匯編的,花指令也就更容易與其后的程序原代碼結合在一起,擾亂反匯編器的反匯編結果。
三、子程序花指令加密算法
1、加密算法思想
在下面提出的子程序花指令加密算法中,采用了將可執(zhí)行花指令與隨機選擇的不可執(zhí)行花指令相結合的方法。通過在程序的子程序中構造偽分支,并添加一些花指令,來迷惑反匯編器,達到代碼保護的目的。
子程序中的偽分支使用XOR指令和CMP指令來進行構造o XOR指令是將兩個操作數(shù)進行邏輯“異或”操作的指令,它具有一個明顯的特點,即:某一個數(shù)A與同一個數(shù)B進行兩次“異或”操作后數(shù)值A不變,即有:
![]()
在子程序花指令加密算法中就充分利用了這一特點。通過隨機插入一個數(shù)B,讓B與寄存器AL數(shù)值中A進行“異或”,然后得到中間結果C,將這個C與B進行比較,如果相等就跳轉到添加的花指令的位置,如果不等則跳轉到添加的下一個“異或”指令,即,用C與召再進行一次“異或”操作,仍然得到原來的寄存器AL中的數(shù)值A。
偽分支就是在A與B進行了“異或”得到C之后,比較B與C的值,如果相等就跳轉到labell的位置,labell的位置是添加的隨機花指令;如果不等就跳轉到labe12的位置,labe12的位置是添加的第二條XOR指令。只要寄存器AL中的值不為O,那么A和曰“異或”之后就永遠也不可能等于日,所以labell就是一個偽分支,也就是說程序永遠也不可能去執(zhí)行l(wèi)abell處的指令,因此程序只能去執(zhí)行l(wèi)abe12處的指令。但是由于labell處的地址是合法的目的地址,而且添加的je labell是合法的跳轉指令,所以反匯編器一定要反匯編labell處的花指令,從而有可能將花指令與其后的代碼結合在一起,使反匯編結果出錯。
2、子程序花指令變換描述
子程序花指令加密算法變換前后:

基本加密算法概要描述如下:
(1)找到子程序調用候選塊,得到子程序調用的指針p;
(2)進入子程序模塊,找到MOV指令,產生一個隨機數(shù)m;
(3)在MOV指令后面添加兩條XOR AL,m指令;
(4)在添加的第一條XOR指令后添加CMP指令;
(5)在CMP指令后添加JE和JNE指令,并設置JNE的跳轉;
(6)在JNE指令后添加上n條花指令;
(7)設置JE的跳轉;
(8)變換完成,程序繼續(xù)執(zhí)行,掃描尋找下一個需要變換的子程序模塊。
子程序花指令加密算法工作流程見圖1。

3、迷惑度分析
子程序花指令加密算法最為關鍵的是添加的花指令反匯編器是一定要進行反匯編的,所以,當添加的不完整花指令是正確的跳轉位置時,它們就更容易與其后的代碼結合在一起,從而有效地擾亂程序代碼。而以前的各種JMP加花指令的形式,在反匯編器采用遞歸掃描方法反匯編代碼時,由于花指令不在程序的控制流程內,所以反匯編器不用反匯編這些代碼。
在本加密算法中,由于與寄存器做“異或”運算的數(shù)值m是隨機產生的,添加的佗條花指令也是隨機產生的,這保證了該加密算法具有一定的隨機性。兩條XOR指令同時與AL中的值進行“異或”操作,保證了AL中的值在變換前后沒有改變。在比較指令CMP al,m中,由于al中的值與m是不相等的,所以程序也不可能去執(zhí)行JE labell指令,而只能去執(zhí)行JNE labe12指令,因此程序在變換前后的邏輯一致性沒有遭到破壞,仍然可以完成相同的功能。
四、子程序花指令加密算法實踐
1、實驗步驟與結果
(1)實驗環(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反匯編調試器/實驗用可執(zhí)行程序0928.exe。其中JCEE變換器是為實現(xiàn)變換而編制的測試程序,程序0928.exe是用來進行變換的實驗用程序。
(2)實驗步驟
a、對實驗用原程序進行反匯編,得到匯編偽代碼P;
b、用JCEE變換器對原程序進行變換,得到變換后的程序;
c、用反匯編器對匯編后的程序進行反匯編,得到匯編偽代碼P'。
(3)實驗結果
候選塊的大小為58條指令,其中有4個子程序調用指令。變換前后的程序代碼分別如圖2和圖3所示(選定其中的一個子程序進行分析,這個子程序共有12條指令)。

2、實驗分析
從圖3可以看出,子程序在經過變換后,JE跳轉位置處的不完整花指令確實與其后的若干個正常代碼結合在一起,使得反匯編器的反匯編結果出錯。
從以上的圖2、圖3中也可以分析出,原來的12條指令有2條指令和添加的花指令結合在一起,使得反匯編器出現(xiàn)了錯誤。而且,添加XOR指令時是添加的兩條XOR指令,但是第二條XOR指令也與花指令結合到一起。因此,在這個子程序中共有3條指令出現(xiàn)了反匯編錯誤。
經驗證,變換后的程序是可以運行的,而且和沒有經過變換的程序具有一樣的輸出結果,也就是程序在經過變換后其邏輯一致性沒有受到破壞。對變換后的結果使用花指令自動去除工具,也不能將程序中的花指令自動去除。這是由于JE指令是作為原始代碼的一個組成部分是不能被去除的,否則程序邏輯性會遭到破壞,程序就無法正常運行了。

小知識之反匯編
反匯編:把目標代碼轉為匯編代碼的過程,也可以說是把機器語言轉換為匯編語言代碼、低級轉高級的意思,常用于軟件破解(例如找到它是如何注冊的,從而解出它的注冊碼或者編寫注冊機)、外掛技術、病毒分析、逆向工程、軟件漢化等領域。學習和理解反匯編語言對軟件調試、漏洞分析、OS的內核原理及理解高級語言代碼都有相當大的幫助,在此過程中我們可以領悟到軟件作者的編程思想??傊痪湓挘很浖磺猩衩氐倪\行機制全在反匯編代碼里面。










