一种合并变量为数组的隐藏变量代码迷惑方法

2014-05-25 00:31卿海军冀肖榆陈丽萍
梧州学院学报 2014年3期
关键词:源代码数组梧州

卿海军,冀肖榆,陈丽萍

(1.2.梧州学院,广西梧州543002;3.梧州市第一中学,广西梧州 543002)

一种合并变量为数组的隐藏变量代码迷惑方法

卿海军1,冀肖榆2,陈丽萍3

(1.2.梧州学院,广西梧州543002;3.梧州市第一中学,广西梧州 543002)

变量在程序中起着承载信息的作用,因此隐藏变量的代码迷惑能极大地混淆程序中的数据流程,但现有的一些实体更名迷惑技术不能有效地抵抗反迷惑攻击。该文提出了一种合并变量为数组的隐藏变量的方法,提高了隐藏变量迷惑技术的强度与弹性,实验结果表明该方法能有效地应对变量名替换攻击。

数据迷惑;弹性;合并变量为数组

1 引言

随着软件产业的快速发展,一方面涌现出了各种软件应用,另一方面各产业对信息化需求欲加强烈,这两方面的发展都促使软件安全技术快速地发展,代码迷惑技术又称为代码混淆技术,其是一种新的软件安全技术,在保护知识产权方面有着重要作用。

根据迷惑算法针对的对象不同,可以将代码迷惑分为类内迷惑和类间迷惑。类内迷惑实现的方式主要包括数据迷惑、控制流迷惑、切片迷惑等[1]。目前代码迷惑技术有效性评价主要有以下几个指标[2]:①迷惑的强度,该指标用来描述迷惑后的程序是否更难以理解、更加复杂。②迷惑的弹性,该指标用来描述迷惑后的程序能够在何种程度上抵抗反迷惑程序的攻击。③迷惑的代价,该指标用来度量程序迷惑后执行时增加的时间和空间代价。

数据迷惑的原理是通过对常量、变量和数据结构这些程序的基本组成元素进行修改,增大攻击者进行逆向工程的难度[2]。常见数据迷惑方法有以下一些:引进非法标识符用作变量名[3]、尽可能多地重用同一变量名、交换各组成元素的标识符[4]、将静态数据转换为与程序相关的数据、数组重构迷惑。但是上面的几种迷惑方法结合度不够紧密,导致其迷惑的强度与弹性都不高。文献[5]基于此提出了相应的反迷惑方法,能较好地破解前面提及的迷惑方法。针对现有的一些数据迷惑强度与弹性不够、不能有效抵御反迷惑的攻击,本文提出了一种强度与弹性较高的代码迷惑方法。

2 合并变量为数组的代码迷惑

在该方法中将结合数据流迷惑和数据迷惑,并针对现有的一些反迷惑方法提出应对措施,使得合并变量为数组的迷惑方法能大大提高其强度与弹性。

源代码片断如下:合并变量为数组后的代码如下:

上面展示了将源代码中变量合并为数组后的变化情况,左右两边的代码功能是一样的,其中array数组的三个元素分别和变量a、b及c存在一一对应关系(如图1(a)所示)。此时变量与元素之间的关系是一目了然的,代码的功能也是非常清楚,没有达到迷惑效果。当然变量和向量元素的映射不一定按照某一特定的顺序,可以任意设定它们的映射关系,如图1(b)所示。

图1 变量和向量元素的映射关系

合并变量为数组并动态变换数组元素下标后的代码如下:

在上述代码中,同在一个数组的数组元素表现形式几乎一致,这对于人工阅读来说已不能轻易区分当前使用的是哪个元素,如果源代码量较大的话,这样的程序阅读起来是相当困难的。但动态变换数组元素下标后,它的弹性仍然不够好。可以使用源代码植入技术[6]在运行时将这些下标变量在某个具体位置的值收集起来,这样就可以利用这些收集起来的信息进行还原。

提高合并变量为数组隐藏变量迷惑技术弹性后的代码如下:

在上述代码中巧妙地利用了源代码植入必须引用下标表达式才能得出下标表达式的值,但在源程序中下标表达式的引用次数是受限制的,一旦多引用便会导致计算出错误的下标。如n.increase(5)-20当且仅当在array[n.increase(5)-20]=1这一句里使用才是应有的下标值,若再次引用则计算出的是错误的下标值,且它后面下标值也必会出错,因为再次引用也就是多调用了一次增值函数,下标增加了一个值,结果会导致这以后所有下标值都会增加一个值,元素会全部错位。n.increase(5)也不能连续被引用(上述代码中increase()函数的实参都是交替出现的),否则也会计算出错误的下标,并且这以后的数组元素下标都会是不正确的值。迷惑后的代码引进了一个新的类,它有一个成员i用来记录数组元素下标的粗约变化情况(并不是数组元素的下标),它的初始值可以是任意的常数,其次它还有一个成员方法用来对下标变量增加一个值,在上述代码中增加的值是6、9和8,当然也可以增加其他任意的常量值,在实际的应用中,可以采用文献[7]提出的隐藏常量的方法把常量隐藏起来。

设方法m的局部变量集合为LocalVars(m),V为方法被迷惑后生成的向量,则采用该方法迷惑之前的变量和迷惑之后的变量构成一个映射f1,f1定义如下:f1:LocalVars(m)V(1)

将上述迷惑代码中increase方法一般化得到f2(z)函数。

源程序经合并变量为数组迷惑方法迷惑之后,局部变量表现形式为V[f2(cn+1)-c1],V[f2(cn+2)-c2],…,V[f2(cn+n)-cn],这时候元素之间是通过下标来相互区分的,但是下标f2(cn+1)-c1,f2(cn+2) -c2,f2(cn+n)-cn是不可显式计算的,且下标是不可多引用、连续引用的,正如前面提到的,一旦多引用或连续引用就会使程序陷入非常混乱状态,这样能保证变量之间彻底地混淆,而且能保证合并变量为数组迷惑方法弹性相当高。

在合并变量为数组时,可将低精度的变量先转化为高精度的变量,再将这些同一种类型高精度的变量合并为一个数组,这样做可以减少数组的个数,增加数组元素之间关系的复杂性。

合并变量为数组迷惑方法可以运用于方法参数,方法局部变量,类的成员变量,本文只考虑用于局部变量的情况。

3 实验

对于本文提出的隐藏变量的代码迷惑方法,我们在Java平台上进行了编程实现,并进行了实验验证,实验是针对源代码进行的,每个实验都划分为预处理、变量信息收集和迷惑三个阶段。

将要合并变量为数组的源代码如下:

下页图2对上述源代码分别采用了文献[3]中的迷惑方法和本文提出的合并变量为数组的迷惑方法进行了迷惑处理。通过对下页图2的左右两边代码的对比,可以发现在阅读的困难性方面,右边的代码要远远高于左边,在右边的代码中相同的数组元素表现形式不一致,元素之间的关系被彻底地混淆了。当然左边代码也能在一定程度上增加反编译的困难性。

图2 迷惑后的代码

下页图3展示了采用ADAM工具对图2的代码进行反迷惑处理后的结果,通过对比可以发现合并变量为数组的迷惑方法在反迷惑后仍然保持迷惑性,因为ADAM工具只是替换了一下名字,迷惑的数量关系仍然保持存在,而采用文献[3]方法的迷惑代码已被反迷惑成功。所以合并变量为数组的迷惑方法能有效地对抗简单更名(如ADAM)反迷惑攻击,同时它还能对抗源代码植入技术攻击。

图3 采用ADAM工具对图2的迷惑代码反迷惑后的结果

下页图4展示了采用反编译器Jad对图2的迷惑代码进行反编译后的结果,通过左右两边代码的对比,可以发现采用文献[3]方法的迷惑代码经过反编译后,只有成员变量的不能有效的反编译,而局部变量都已经用新生成的变量名替换了,而采用合并变量为数组的代码迷惑方法有效地将局部变量给混淆了,保持了局部变量迷惑的有效性。

图4 采用Jad对图2的迷惑代码进行反编译后的结果

4 小结

本文在考虑现有的实体更名迷惑弹性不够的情况下,提出了一种具有一定抵抗反迷惑攻击能力的方法。该方法结合了数据流迷惑方法到数据迷惑当中,并巧妙地动态变换数组元素下标,从而很好地隐藏了变量,同时对下标的引用是调用某个函数,从而使得下标只能引用限定的次数,能有效应对源代码植入的攻击。当然该方法的迷惑代价可能会比较高,因为调用函数过于频繁,这也是下一步值得研究的内容。

[1]王建民,等.Java程序混淆技术综述[J].计算机学报,2011(34):1578-1588.

[2]Christian Collberg,Clark Thomborson,Douglas Low.ATaxonomyofObfuscatingTransformations[R].Technical Report 148,Department ofComputerScience,UniversityofAuckland.July1996.

[3]Jien-Tsai Chan,Wuu Yang.Advanced obfuscation techniques for java byte-code[J].The Journal of Systems and Software,2004,71(12): 1-10.

[4]de Roo A,v.den Oord L.Stealthy obfuscation techniques:misleading the pirates[EB/OL].http://www.home.cs.utwente.nl/~oord/ paper.pdf,2007-02-12.

[5]S.Cimato,A.D.Santis,and U.F.Petrillo.Overcomingthe obfuscation ofjava programs byidentifier renaming[J].The Journal ofSystems and Software,2005(78):60-72.

[6]卿海军,钟诚,张莲.基于源代码植入的针对函数指针数组的反代码迷惑[C]//2008计算机技术与应用进展.北京:中国科学技术大学出版社,2008:1095-1099.

[7]L.Ertaul,S.Venkatesh.Novel Obfuscation Algorithms for SoftwareSecurity[C]//Proceedings of the 2005 International Conference onSoftware EngineeringResearch and Practice(SERP’05).CSREAPress,2005:209-215.

An Obfuscation Method of Merging Variables to an Array

Qing Haijun1,Ji Xiaoyu2,Chen Liping3
(1.2.Wuzhou University,Wuzhou 543002,China;
3.No.1 Middle School of Wuzhou,Wuzhou 543002,China)

Since some information is stored in variables in a program,hiding variables can obfuscate the data stream to a great extent.However,the existing entity rename code obfuscation methods can’t resist the attack of obfuscations.A code obfuscation method merging variable to array is proposed in this paper.The experiment results show that it can increase the resilience and potency of hiding variable obfuscation method and it can resist the attack of auto substituting the variable.

Data obfuscation;Resilience;Merging variable to an array

TP311.1

A

1673-8535(2014)03-0014-08

卿海军(1979-),男,湖南邵阳人,梧州学院讲师,硕士,研究方向:信息安全。

冀肖榆(1982-),男,广西梧州人,梧州学院副教授,硕士,研究方向:旅游安全。

(责任编辑:覃华巧)

2014-03-06

梧州学院青年科研项目(2012D001)

陈丽萍(1980-),女,广西梧州人,梧州市第一中学教师,研究方向:信息技术教育。

猜你喜欢
源代码数组梧州
JAVA稀疏矩阵算法
中共梧州城工委
基于TXL的源代码插桩技术研究
JAVA玩转数学之二维数组排序
软件源代码非公知性司法鉴定方法探析
梧州工人运动的急先锋
基于语法和语义结合的源代码精确搜索方法
Excel数组公式在林业多条件求和中的应用
八十多载后寻访梧州
梦梧州(外两首)