JAVA下标可以是表达式吗,基于Java多线程隐藏数组下标变换表达式的代码迷惑算法...

代码迷惑技术的研究开始于20世纪90年代末,目前尚处于有待于成熟阶段[1]。但是随着人们对软件安全问题重视程度和产权保护意识的增强,以及代码迷惑技术无需硬件支持的优点[2],代码迷惑技术日益受到人们的青睐,形成了研究代码迷惑的热潮。Barak[3]认为世界上并不存在完美的迷惑器,但是在后续的研究中他承认代码迷惑有它自身价值。Collerg等人定义代码迷惑的概念为:通过对程序代码进行迷惑变换,这种变换是在不影响程序执行结果的情况下,使得程序的复杂度和理解难度大大增加,从而使得攻击者不能正确理解程序和还原出迷惑前的源代码,以防止恶意主机问题[1]。代码迷惑技术归纳为4大类:版面布局迷惑、数据迷惑、控制流迷惑与预防迷惑[1]。这些迷惑技术都可以设计数组下标的变换,尤其在控制流迷惑技术中,可以通过对下标的复杂变换来增大程序的复杂度和理解难度[4,5]。通过对数组下标变换来隐藏程序的实际控制流的技术,在代码迷惑领域应用广泛,因此研究隐藏数组下标的变换过程显得尤为重要。本文提出一种基于Java多线程的隐藏数组下标变换过程的代码迷惑算法,并通过实例分析说明该算法实现的过程。1基于Java多线程代码迷惑算法在数组下标的传统变换过程中,即使非常复杂的变换表达式,攻击者也轻而易举的通过静态分析源代码,从而得出变换后的下标值。如果我们在下标变换中进行并行处理,变换程序的可能执行路径数目将随线程数目成指数级增长。由于线程是占有CPU的最小单位,如果要求串行程序能够变换为多线程并行化代码,那么被处理的数据在并行处理时不应该存在数据依赖关系。例如由i变换为较复杂的形式(i+3)*5+i+2+3*4+((5*3)*i)+3,即求下标变换表达式的值,如果在串行程序中,只需对程序代码进行静态分析,易得变换后i为21*i+32,如果把该变换表达式进行并行化,要通过静态分析出源代码要变换的值将大大增加了复杂度。为了便于说明问题,我们令当前的i=2,于是问题转化为并行求解(2+3)*5+2+2+3*4+((5*3)*2)+3,并且使得程序的求解过程不易被攻击者分析出来。1.1数据预处理为了使并行处理的数据没有依赖性,我们提出数据预处理算法为:首先在不改变下标变换求值表达式语义的前提下,对表达式中所有操作数,用尽可能多的“()”操作符进行操作,直至“()”外仅剩余“+”或者“-”,则表达式变为:((2+3)*5)+2+2+(3*4)+((5*3)*2)+3。然后按照操作数被嵌套“()”的重数进行分组,并把表达式分解为只有单个运算操作符连接的简单运算式子,且值未知的表达式用M替换,那么被“()”嵌套两次的运算式有2+3、5*3,嵌套“()”一次式子的有M*5、3*4、M*2。最后令N为所有简单运算式子中被括号嵌套最大的重数,用N+1个List或者数组分别存储被嵌套不同重数“()”的运算式子中的操作数。数据存储分布如图1所示,数据依赖关系用实线箭头标出,其中M可以存储任意值,用以迷惑攻击者。从图1可知同一个数组或者链表中的数据之间没有依赖关系,因此可以多线程并行处理。图1预处理后的数据分布与依赖关系1.2多线程并行执行的控制为了隐藏下标变换过程,则要使得下标变换程序的执行路径应该具有随机性,同时要保证变换结果的正确性,因此我们必须对线程加以控制。并行控制的基本思想为:通过设置变量来保证程序运行同步,即只有在处理被依赖的数据的操作执行完成后,才能处理其他数据,而没有依赖关系的数据可以并行处理。在本实例中,如下所示的控制线程代码就是通过设置数组变量“cls[]”来确保依次先后处理有数据依赖关系的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值