在对已有的花指令加密策略及其存在的问题进行分析的基础上,我们提出了随机花指令加密算法。
一、花指令加密方法及研究现状
1、花指令加密的工作原理
动态跟踪是软件破解的基本过程,如果程序代码具有反动态跟踪的能力,那软件被破解的可能性就变小了。花指令加密可以应用在反跟踪和反静态分析中。
花指令加密方法需要在原始指令的适当位置插入一些无用的字节。这些被插入的字节不能被执行,否则原始指令的逻辑会遭到破坏,这是花指令变换的基本条件。根据反汇编的工作原理,只有当花指令的最后一个或两个字节同正常指令的开始几个字节放反汇编器识别成一条指令时,才能有效破坏反汇编的结果。插入的花指令应当是一些不完整的指令,被插入的不完整指令可以是随机选择的。
2、研究状况及存在的问题
目前采用比较多的一种花指令形式是无条件跳转指令JMP加花指令。这种策略通过简单变换后的各种扩展形式,在一定程度上增强了花指令的生存能力,但是这些扩展形式还是存在特征码,用工具仍可以自动去除。
另外一种形式是直接在原代码中的JMP指令后添加花指令,缺点是受代码中JMP指令个数的限制,如果JMP指令过少,则代码变换效果不明显。
综合而盲,要想提高模糊度(反汇编器产生错误结果的程度),就必须应用多个方法,并保证方法使用的随机性和方法本身的随机性,使产生的花指令没有固定的特征码。由此,我们提出随机袍指令加密算法的目的就是保证花指令无特征码并且具有较高的模糊度。
二、随机花指令加密算法
1、加密算法思想
根据的文的分析,目前采用花指令进行加密的问题主要在于存在特征码,容易用工具自动去除,其次是模糊度不够,效果不明显。对于这两个问题,本文提出两种策略来加以解决。第一种策略是JMP加花指令的扩展形式,简称为“JMP扩展”。这种变换保证其具有足够的随机度,即使存在特征值,但特征值的数量巨大,完全列举所有情况也需要很多工作量。第二种策略是将代码中的条件跳转指令变换为反条件跳转指令加JMP指令的形式,简称为"JMC变换”口这个策略进一步增加JMP指令的数量以便可以添加更多花指令。
加密算法的具体思想是:首先将原始指令分成若干个候选块并确定一个候选块随机序列,然后对每一个候选块进行如下处理:应用“JMP扩展”策略对候选块内指令进行变换,然后应用“JMC变换”策略对候选块内条件跳转指令进行变换,最后在变换后的代码的JMP指令后随机添加花指令。
2、"JMP扩展¨加密算法描述
JMP扩展是用三条JMP指令对一段正常的指令进行变换,具体方法如下:
跳过的正常指令个数是随机选取的,但是个数不能超过候选块的指令数目。图1给出了“JMP扩展”的工作流程。
加密算法描述:
1)取到一指令候选块B,指令指针P指示候选块的第一条指令;
2)产生一随机数m,m的大小在B的指令数目内;
3)从指针P开始处向后扫描m条指令,确定这m条指令的长度Z;
4)在P前插入第一条JMP指令JMP+(l+2),其中2是第二条JMP指令长度2字节;
5)在P+m后插入第二条JMP指令JMP+2,其中2是第三条JMP指令长度2字节;
6)在P+m+1后插入第三条JMP指令JMP - (l+2)。跳转到正常指令处。
3、"JMC变换”加密算法描述
JMC变换是将一条条件跳转指令变换为反条件跳转指令加JMP指令,具体方法如下:
所有的条件跳转指令都可以做这种变换。Intel x86指令集中条件跳转指令编码方式有其特点,一条条件跳转指令的操作码和0x01异或就可以得到其反条件跳转指令。根据这个特点,“JMC变换”就变得容易多了。图2给出了“JMC变换”的工作流程。
加密算法描述:
1)取到一指令候选块B,指令指针P指示候选块的第一条指令;
2)如果指令P为条件跳转指令则进行如下操作,否则跳转到8);
3)区分指令的操作码opcode和操作数opmnd;
4)将opcode与0x01异或得到反条件跳转操作码opcode;
5)根据oprand判断跳转类型足短跳转还是长跳转,得到oprand;
6)将指令JFI变换为opcode’+oprand’,其中oprand’是下条JMP指令的长度;
7)在P后插入JMP +oprand指令;
8)指令指针尸指向下一条指令;
9)如果8中指令全部处理完则结束,否则跳转到2)。
4、加密算法描述
加密算法首先对原始指令进行分块操作,每个分块被称为候选块,分块操作的目的一是为了使“JMP扩展”操作不会重叠影响,二是可以根据空闲空间的多少灵活调整分块大小。分块的大小可根据空闲空间多少灵活确定。确定一个分块的随机序列的目的是假如空闲空问不够,那么随机变换的候选块都不会一样。随机花指令加密算法会调用
前面的两种策略对代码变换后,在JMP指令后添加花指令。图3给出了随机花指令加密算法的工作流程。
随机花指令加密算法描述:
首先对所有指令进行分块,对候选块产生一个随机序列P,例如P(4,1,3,.7,2,5,6…),下面按照随机序列的顺序对所有分块如下处理:
1)如果空间不够则退出,否则进行下面操作;
2)对一个候选块进行一次“JMP扩展”操作;
3)对一个候选块中的条件跳转指令进行“JMC变换”操作;
4)在候选块中的JMP指令后随机添加花指令;
5)平衡代码段剩余可用空间;
6)如果所有候选块处理完毕则向下执行,否则取下一个候选块并眺转到1);
7)平衡所有跳转指令跳转位置;
8)指令地址偏移重定位;
9)其他数据、函数地址重定位。
三、随机花指令加密算法实践
1、随机花指令算法的实验步骤与结果
1)实验环境
硬件环境:celcronl. 7GHz/256M Memoy/20G HardDisk软件环境;操作系统Windows XP+SP2/JCEE变换器/W32Dasm8. 93/实验用可执行程序test.exe。其中JCEE变换器是为实现变换而编制的测试程序。W32Dasm是应用广泛的反汇编器调试器,程序test.cxe是用来进行变换的程序。
2)实验步骤
a)对实验用原程序进行反汇编,得到汇编伪码P;
b)用JCEE变换器对原程序进行变换,得到变换后的程序;
c)用反汇编器对变换后的程序进行反汇编,得到汇编伪码P;
d)比较P和P’得到结论R。
3)实验结果
候选块的大小选为10条指令,每条JMP指令后最大添加8个字节花指令。 teat. exe程序经变换后得到的数据如表1所示。
经验证,采用本随机花指令加密方法对test. exe文件进行花指令变换,采用花指令去除工具对变换后的结果进行花指令搜索,均未能发现相关的花指令特征。
2、实验分析
经过‘‘JMP扩展”变换后的代码要跳过一定数量的正常指令,然后在三条JMP指令后添加花指令,总共存在的特征值是8*8*8*10 =5120种,如果基数扩大,特征值数量更多。因此想要定义所有的特征不太实际。在JMP后添加了花指令后不能自动去除还有一个原因是JMP指令作为原始代码的组成部分是不能被去除的,否则程序逻辑遭到破坏。
小知识之花指令
花指令是程序中有一些指令,由设计者特别构思,希望使反汇编的时候出错,让破解者无法清楚正确地反汇编程序的内容,迷失方向。经典的是一些跳转指令,目标位置是另一条指令的中间,这样在反汇编的时候便会出现混乱。花指令有可能利用各种指令:jmp, call, ret的一些堆栈技巧,位置运算,等等。