一种基于控制流复杂化的Java代码混淆方法技术

技术编号:15330217 阅读:63 留言:0更新日期:2017-05-16 13:43
本发明专利技术公开了一种基于控制流复杂化的Java代码混淆方法,包括步骤1,构建不透明谓词集合;步骤2,发现循环结构;步骤3,拆开循环结构;步骤4,在拆开的循环结构中插入不透明谓词集合;步骤5,复杂化循环结构。本发明专利技术克服了现有代码混淆方法对循环结构利用不足的缺点,实现了利用循环结构的控制流复杂化方法。

A Java code obfuscation method based on hybrid control flow

The invention discloses a Java code obfuscation method based on complex control flow, including 1 steps, constructing the opaque predicates set; step 2, find a cycle structure; step 3, open loop structure; step 4, insert the opaque predicates set in open loop structure; step 5, complicated circulation structure. The invention overcomes the shortcoming that the existing code obfuscation method has insufficient utilization of the loop structure, and realizes a control flow hybrid method using a cyclic structure.

【技术实现步骤摘要】
一种基于控制流复杂化的Java代码混淆方法
本专利技术涉及一种基于控制流复杂化的Java代码混淆方法,属于计算机安全领域。
技术介绍
伴随着移动互联网的兴起,移动端应用越来越普及,这些应用充分利用了移动设备的计算能力和便携性,方便了人们的生活,但是移动端应用中有大量的Java程序。Java程序在编译后以打包的.class文件的形式分发,这些.class文件都是Java字节码,并且原始的Java字节码可以通过反编译的方法还原出与原代码差别只在注释的源代码。这就给了攻击者或者其他的不法分子机会。这带来的主要问题如下:1.软件盗版,不法分子通过反编译之后的源代码可以轻易的复制出与原来的软件功能相同或相近的软件,或者破解出不需要激活的软件。2.篡改,修改软件源代码,不改变软件的使用功能,但是在其中添加了广告或者其他的恶意代码和病毒。为了解决这些问题,提出了代码混淆的方法,主要分为四类:布局混淆转换、控制混淆转换、数据混淆转换以及预防性混淆转换。这些方法主要是用来应对反编译,对循环结构利用不足。
技术实现思路
为了解决上述技术问题,本专利技术提供了一种基于控制流复杂化的Java代码混淆方法。为了达到上述目的,本专利技术所采用的技术方案是:一种基于控制流复杂化的Java代码混淆方法,包括以下步骤,步骤1,构建不透明谓词集合;步骤2,发现循环结构;步骤3,拆开循环结构;步骤4,在拆开的循环结构中插入不透明谓词集合;步骤5,复杂化循环结构。不透明谓词集合包括构造恒为真的谓词集合T以及恒为假的谓词集合F。发现循环结构的过程为,S11,遍历class文件寻找条件跳转指令M;S12,找到条件跳转指令M的跳转标签E;S13,查看跳转标签E所在位置的上一条指令是否为无条件跳转指令N,如果是,找到无条件跳转指令N的跳转标签B;S14,判断跳转标签B是否在条件跳转指令M之前,如果是,遍历跳转标签B到条件跳转指令M之间的代码段,查看是否还有其余跳转指令,如果没有,那么从跳转标签B到跳转标签E之间的代码段为一个循环结构。拆开循环结构的过程为,S21,定义从跳转标签B到无条件跳转指令N之前的代码段为循环结构的循环体,定义循环结构原先具有的循环体的跳转标签B记为B0,定义复制循环体的次数为k,计数器i=0;S22,i=i+1;S23,在无条件跳转指令N之前插入一循环体,插入的循环体的跳转标签记为Bi;S24,判断i是否大于等于k,如果否,则转至步骤S22,如果是,则转至步骤S25;S25,去掉无条件跳转指令N,在同样的位置插入代码块D,所述代码块D根据输入和局部变量的状态跳转B0到Bk中的任何一个.在拆开的循环结构中插入不透明谓词集合的过程为,S31,定义跳转标签为B0、B1、…、Bk的循环体的的条件谓词分别为Cal_A0、Cal_A1、…、Cal_Ak;S32,定义i=0;S33,如果i小于等于k,则转至步骤S34,否则结束;S34,修改Cal_Ai,从不透明谓词集合中选择若干谓词,与循环体中原本的谓词结合,结合后的谓词真假不变;S35,i=i+1;转至步骤S33。复杂化循环结构的过程为,S41,定义循环结构的循环体为C0、C1、…、Ck;S42,定义i=0;S43,如果i小于等于k,则转至步骤S44,否则结束;S44,在循环体Ci中随机地添加与不透明谓词相关的代码,这些代码不改变不透明谓词的真假;S45,调用构造有向无环图的函数,得到DAG结构;DAG结构中的每一个节点都是循环体Ci中的一个位置,每一条有向边代表从起点所代表位置到终点所代表位置之间的代码段;S46,计算每一条有向边在DAG中的一个拓扑序TS;S47,将代码段按照拓扑序TS替换掉原本的循环体Ci;S48,寻找下一个代码段间的间隔;S49,如果间隔之前紧邻的代码段,在DAG结构中没有后续的代码段执行,转至步骤S410,否则转至步骤S411;S410,插入跳转指令直接跳转到S47中替换掉的循环体Ci的结束位置,转至步骤S412;S411,插入随即条件或者与输入相关的条件,跳转到在DAG结构中紧邻在这个代码段之后的代码段上;S412,判断是否还有代码段间的间隔没有插入跳转指令,如果是,转至步骤S48,否则转至步骤S423;S423,i+=1,转至步骤S43。本专利技术所达到的有益效果:本专利技术克服了现有代码混淆方法对循环结构利用不足的缺点,实现了利用循环结构的控制流复杂化方法。附图说明图1为本专利技术的流程图。图2为拆开循环结构的流程图。图3为复杂化循环结构的流程图。具体实施方式下面结合附图对本专利技术作进一步描述。以下实施例仅用于更加清楚地说明本专利技术的技术方案,而不能以此来限制本专利技术的保护范围。如图1所示,一种基于控制流复杂化的Java代码混淆方法,包括以下步骤:步骤1,构建不透明谓词集合。利用Java中的引用的比较来构造不透明谓词集合,不透明谓词集合包括构造恒为真的谓词集合T以及恒为假的谓词集合F。步骤2,发现循环结构。从Java代码段中发现循环结构,它们应该类似于这种情况:代码如下:B:Cal_AIfnotAgotoE;CGotoB;E:具体过程如下:S11,遍历class文件寻找条件跳转指令M;S12,找到条件跳转指令M的跳转标签E;S13,查看跳转标签E所在位置的上一条指令是否为无条件跳转指令N,如果是,找到无条件跳转指令N的跳转标签B;S14,判断跳转标签B是否在条件跳转指令M之前,如果是,遍历跳转标签B到条件跳转指令M之间的代码段,查看是否还有其余跳转指令,如果没有,那么从跳转标签B到跳转标签E之间的代码段为一个循环结构。步骤3,拆开循环结构。具体过程如图2所示,S21,定义从跳转标签B到无条件跳转指令N之前的代码段为循环结构的循环体,定义循环结构原先具有的循环体的跳转标签B记为B0,定义复制循环体的次数为k,计数器i=0;S22,i=i+1;S23,在无条件跳转指令N之前插入一循环体,插入的循环体的跳转标签记为Bi;S24,判断i是否大于等于k,如果否,则转至步骤S22,如果是,则转至步骤S25;S25,去掉无条件跳转指令N,在同样的位置插入代码块D,所述代码块D根据输入和局部变量的状态跳转B0到Bk中的任何一个。拆开后的代码如下:B0:Cal_AIfnotAgotoB1:CB1:Cal_AIfnotAgotoB2:C…Bi:Cal_AIfnotAgotoE:CDE:步骤4,在拆开的循环结构中插入不透明谓词集合。具体过程为:S31,定义跳转标签为B0、B1、…、Bk的循环体的的条件谓词分别为Cal_A0、Cal_A1、…、Cal_Ak;S32,定义i=0;S33,如果i小于等于k,则转至步骤S34,否则结束;S34,修改Cal_Ai,从不透明谓词集合中选择若干谓词,与循环体中原本的谓词结合,结合后的谓词真假不变;S35,i=i+1;转至步骤S33。步骤5,复杂化循环结构。如图3所示,具体过程为:S41,定义循环结构的循环体为C0、C1、…、Ck;S42,定义i=0;S43,如果i小于等于k,则转至步骤S44,否则结束;S44,在循环体Ci中随机地添加与不透明谓词相关的代码,这些代码不改变不透明谓词的真假;S45,调用构造有向无环图的函数create_DAG(empty_dag本文档来自技高网...
一种基于控制流复杂化的Java代码混淆方法

【技术保护点】
一种基于控制流复杂化的Java代码混淆方法,其特征在于:包括以下步骤,步骤1,构建不透明谓词集合;步骤2,发现循环结构;步骤3,拆开循环结构;步骤4,在拆开的循环结构中插入不透明谓词集合;步骤5,复杂化循环结构。

【技术特征摘要】
1.一种基于控制流复杂化的Java代码混淆方法,其特征在于:包括以下步骤,步骤1,构建不透明谓词集合;步骤2,发现循环结构;步骤3,拆开循环结构;步骤4,在拆开的循环结构中插入不透明谓词集合;步骤5,复杂化循环结构。2.根据权利要求1所述的一种基于控制流复杂化的Java代码混淆方法,其特征在于:不透明谓词集合包括构造恒为真的谓词集合T以及恒为假的谓词集合F。3.根据权利要求2所述的一种基于控制流复杂化的Java代码混淆方法,其特征在于:发现循环结构的过程为,S11,遍历class文件寻找条件跳转指令M;S12,找到条件跳转指令M的跳转标签E;S13,查看跳转标签E所在位置的上一条指令是否为无条件跳转指令N,如果是,找到无条件跳转指令N的跳转标签B;S14,判断跳转标签B是否在条件跳转指令M之前,如果是,遍历跳转标签B到条件跳转指令M之间的代码段,查看是否还有其余跳转指令,如果没有,那么从跳转标签B到跳转标签E之间的代码段为一个循环结构。4.根据权利要求3所述的一种基于控制流复杂化的Java代码混淆方法,其特征在于:拆开循环结构的过程为,S21,定义从跳转标签B到无条件跳转指令N之前的代码段为循环结构的循环体,定义循环结构原先具有的循环体的跳转标签B记为B0,定义复制循环体的次数为k,计数器i=0;S22,i=i+1;S23,在无条件跳转指令N之前插入一循环体,插入的循环体的跳转标签记为Bi;S24,判断i是否大于等于k,如果否,则转至步骤S22,如果是,则转至步骤S25;S25,去掉无条件跳转指令N,在同样的位置插入代码块D,所述代码块D根据输入和局部变量的状态跳转B0到Bk中的任何一个。5.根据权利要求4所述的一种基于控制流复杂化的J...

【专利技术属性】
技术研发人员:周超郭雅娟黄伟朱道华姜海涛郭静李斌王黎明陈锦铭
申请(专利权)人:国网江苏省电力公司电力科学研究院国家电网公司
类型:发明
国别省市:江苏,32

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1