根据反汇编器原理,分析现有的花指令加密算法存在的问题,我们提出了一种新的花指令加密算法——子程序花指令加密算法。

一、花指令加密基本原理及现状

1、花指令加密工作原理

软件破解者要想有效的破解软件,需要对程序代码进行静态分析和跟踪。花指令加密可以有效地对抗静态分析,经过花指令变换后的程序代码具有一定的反跟踪能力,能够在很大程度上增加软件破解者对程序进行分析和跟踪的难度,从而有效地保护软件的知识产权。

花指令分为可执行花指令和不可执行花指令。可执行花指令指的是能够正常运行但又不改变原始程序逻辑性的一组无用指令。这类花指令常常用在病毒代码的变形引擎中,但反汇编器能够正常反汇编这些花指令。不可执行花指令又称垃圾字节,是指被插入到原始代码中但又不改变原始程序逻辑性的一组无用字节。被插入的字节不能被执行,否则会使程序的逻辑性遭到破坏,影响程序运行的结果。根据反汇编的工作原理,当插入的最后一个或多个花指令与其后正常的指令被反汇编器识别成一条有效地指令时,就能有效地破坏反汇编器的反汇编结果。花指令加密技术就充分利用了这一特点,通过在程序代码中插入一些随机的不完整指令来破坏反汇编器的结果,达到保护软件的目的。

2、花指令加密研究现状

目前花指令加密中采用较多的一种形式是无条件跳转指令JMP加花指令脚,这种方法具有简单、易实现的优点,但存在特征码,容易被工具自动去除。另一种形式是直接在程序代码中的JMP指令后添加花指令,这种方法的优点是不存在特征码,但受代码中JMP指令个数的影响,如果JMP指令数太少,则变换效果不明显。从以上内容可以看出,目前花指令加密中采用的多是JMP及各种JMP变形后加花指令的变换方法,这种方法虽然能够在一定程度上破坏反汇编器的反汇编结果,但模糊度较低。因此要想更好的对程序进行花指令加密,就必须应用多个方法,使得产生的花指令既无固定的特征码,又具有较高的模糊度。

二、反汇编器工作原理分析

目前,大多数反汇编器使用的反汇编方法分为两类:一是线性扫描法,反汇编器从程序代码的第一个可执行字节开始依次逐个的将程序中的二进制代码反汇编成相应的汇编指令;另一种方法是递归扫描法,反汇编器沿着程序的指令执行控制流来一步一步进行反汇编,将二进制代码反汇编成相应的汇编指令。

在递归扫描中,如果在目标程序的代码中出现了跳转分支,反汇编器就会把这个分支地址记录下来,并分头反汇编各个分支中的指令。但反汇编器并不去判断分支代码正确与否,它们只是将跳转地址的代码进行反汇编。因此,如果在程序代码中加入一些伪分支,使得这些伪分支永远也不可能达到圈,然后在这些伪分支的地方加上一些花指令,那么反汇编器就会将这些花指令作为代码进行反汇编,极有可能使得添加的花指令与其后的代码结合在一起,从而扰乱整个反汇编结果。由于这种方法中,跳转伪分支的目的地址是正确的,因此这些花指令是必须要进行反汇编的,花指令也就更容易与其后的程序原代码结合在一起,扰乱反汇编器的反汇编结果。

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

1、加密算法思想

在下面提出的子程序花指令加密算法中,采用了将可执行花指令与随机选择的不可执行花指令相结合的方法。通过在程序的子程序中构造伪分支,并添加一些花指令,来迷惑反汇编器,达到代码保护的目的。

子程序中的伪分支使用XOR指令和CMP指令来进行构造o XOR指令是将两个操作数进行逻辑“异或”操作的指令,它具有一个明显的特点,即:某一个数A与同一个数B进行两次“异或”操作后数值A不变,即有:

子程序花指令加密算法
在子程序花指令加密算法中就充分利用了这一特点。通过随机插入一个数B,让B与寄存器AL数值中A进行“异或”,然后得到中间结果C,将这个C与B进行比较,如果相等就跳转到添加的花指令的位置,如果不等则跳转到添加的下一个“异或”指令,即,用C与召再进行一次“异或”操作,仍然得到原来的寄存器AL中的数值A。

伪分支就是在A与B进行了“异或”得到C之后,比较B与C的值,如果相等就跳转到labell的位置,labell的位置是添加的随机花指令;如果不等就跳转到labe12的位置,labe12的位置是添加的第二条XOR指令。只要寄存器AL中的值不为O,那么A和曰“异或”之后就永远也不可能等于日,所以labell就是一个伪分支,也就是说程序永远也不可能去执行labell处的指令,因此程序只能去执行labe12处的指令。但是由于labell处的地址是合法的目的地址,而且添加的je labell是合法的跳转指令,所以反汇编器一定要反汇编labell处的花指令,从而有可能将花指令与其后的代码结合在一起,使反汇编结果出错。

2、子程序花指令变换描述

子程序花指令加密算法变换前后:

子程序花指令加密算法

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

(1)找到子程序调用候选块,得到子程序调用的指针p;

(2)进入子程序模块,找到MOV指令,产生一个随机数m;

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

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

(5)在CMP指令后添加JE和JNE指令,并设置JNE的跳转;

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

(7)设置JE的跳转;

(8)变换完成,程序继续执行,扫描寻找下一个需要变换的子程序模块。

子程序花指令加密算法工作流程见图1。

子程序花指令加密算法

3、迷惑度分析

子程序花指令加密算法最为关键的是添加的花指令反汇编器是一定要进行反汇编的,所以,当添加的不完整花指令是正确的跳转位置时,它们就更容易与其后的代码结合在一起,从而有效地扰乱程序代码。而以前的各种JMP加花指令的形式,在反汇编器采用递归扫描方法反汇编代码时,由于花指令不在程序的控制流程内,所以反汇编器不用反汇编这些代码。

在本加密算法中,由于与寄存器做“异或”运算的数值m是随机产生的,添加的佗条花指令也是随机产生的,这保证了该加密算法具有一定的随机性。两条XOR指令同时与AL中的值进行“异或”操作,保证了AL中的值在变换前后没有改变。在比较指令CMP al,m中,由于al中的值与m是不相等的,所以程序也不可能去执行JE labell指令,而只能去执行JNE labe12指令,因此程序在变换前后的逻辑一致性没有遭到破坏,仍然可以完成相同的功能。

四、子程序花指令加密算法实践

1、实验步骤与结果

(1)实验环境

硬件环境:AMD SempronlMProcessor 3200+1.79 GHz/768 MMemory/19.5 G HardDisk。
软件环境:操作系统Windows XP+SP2/JCEE变换器/OIIy-dbg反汇编调试器/实验用可执行程序0928.exe。其中JCEE变换器是为实现变换而编制的测试程序,程序0928.exe是用来进行变换的实验用程序。

(2)实验步骤

a、对实验用原程序进行反汇编,得到汇编伪代码P;

b、用JCEE变换器对原程序进行变换,得到变换后的程序;

c、用反汇编器对汇编后的程序进行反汇编,得到汇编伪代码P'。

(3)实验结果

候选块的大小为58条指令,其中有4个子程序调用指令。变换前后的程序代码分别如图2和图3所示(选定其中的一个子程序进行分析,这个子程序共有12条指令)。

子程序花指令加密算法

2、实验分析

从图3可以看出,子程序在经过变换后,JE跳转位置处的不完整花指令确实与其后的若干个正常代码结合在一起,使得反汇编器的反汇编结果出错。

从以上的图2、图3中也可以分析出,原来的12条指令有2条指令和添加的花指令结合在一起,使得反汇编器出现了错误。而且,添加XOR指令时是添加的两条XOR指令,但是第二条XOR指令也与花指令结合到一起。因此,在这个子程序中共有3条指令出现了反汇编错误。

经验证,变换后的程序是可以运行的,而且和没有经过变换的程序具有一样的输出结果,也就是程序在经过变换后其逻辑一致性没有受到破坏。对变换后的结果使用花指令自动去除工具,也不能将程序中的花指令自动去除。这是由于JE指令是作为原始代码的一个组成部分是不能被去除的,否则程序逻辑性会遭到破坏,程序就无法正常运行了。

子程序花指令加密算法

小知识之反汇编

反汇编:把目标代码转为汇编代码的过程,也可以说是把机器语言转换为汇编语言代码、低级转高级的意思,常用于软件破解(例如找到它是如何注册的,从而解出它的注册码或者编写注册机)、外挂技术、病毒分析、逆向工程、软件汉化等领域。学习和理解反汇编语言对软件调试、漏洞分析、OS的内核原理及理解高级语言代码都有相当大的帮助,在此过程中我们可以领悟到软件作者的编程思想。总之一句话:软件一切神秘的运行机制全在反汇编代码里面。