APP下载

一种JAVA控制流混淆方案

2017-05-15余沛钊夏梦森

湖北第二师范学院学报 2017年2期
关键词:控制流压扁分支

葛 华, 余沛钊, 夏梦森

(武汉理工大学 a.信息工程学院; b.计算机科学与技术学院, 武汉 430072)

一种JAVA控制流混淆方案

葛 华a, 余沛钊a, 夏梦森b

(武汉理工大学 a.信息工程学院; b.计算机科学与技术学院, 武汉 430072)

在逆向分析的领域里,JAVA软件最需要保护的地方毫无疑问是整个软件的结构。本文在总结代码混淆领域中的一些混淆策略后,提出一个基于结构代码块的控制流混淆方案。该方案不是以基本代码块为基础来提出具体的混淆策略,而是从软件结构角度上,只对那些复杂的结构块进行混淆处理。该方案首先插入含有垃圾代码块的分支路径,然后以结构代码块为基础进行压扁操作。分析表明该方案具有较好的效率。

代码混淆;控制流混淆;代码块

1 代码混淆

当我们将一段JAVA代码通过混淆变化后生成一段新的代码,在保证前后运行结果相同的情况下,如果新生成的代码比原来的代码更具有迷惑作用,我们就把这个过程称为代码混淆[1-3]。

依据混淆原理与所需进行混淆处理的对象的不同,可以将代码混淆分成以下几类[4-5]:

图1 代码混淆分类

控制流混淆是静态混淆的一种,近来得到学者的广泛关注。

2 控制流混淆

对于JAVA应用来说,攻击者大多是通过解析出来的程序结构来进行破解,数据混淆和结构混淆对于这种情况是没有明显的作用,因为攻击者依旧能够将程序结构重新构造出来,要想对JAVA应用有一个很好的保护,运用控制流混淆去隐蔽并且改变它的运行结构是个很好的选择[6-8]。

将一段按照先后次序运行的语句称作为基本代码块,它先从首条语句开始运行,直到最后一条语句执行完就结束。由多个基本代码块组成的结构称之为结构代码块。

压扁的思想是将一个正常按照次序执行的程序块打乱,并把这些打乱的程序块通过结构进行重新排列组合,将放在一个循环里,每次在程序块运行结束之前对一个全局变量进行。这样做不但打乱了原有的结构而且确保能够按照原来正确的次序运行。结构如图2所示:

图2 结构图

本文的控制流混淆方案分为两步执行:

第一步模仿原基本代码块构造出结构相似但是数据不同的垃圾代码块,将垃圾代码安插到原程序结构中形成分支路径,再往里面添加一个不透明谓词来使得逆向攻击者不知道程序接下来往哪条路径走。

第二步将部分的垃圾代码块和原基本块进行处理,为了控制混淆带来的花销,剩下的垃圾代码块将进行删除操作。

本文基于结构代码块JAVA控制流混淆过程是:首先对原程序进行仔细的分析研究,对于一些结构不是很复杂的结构代码块我们将不进行混淆操作,而对于那些结构比较复杂的结构代码块,我们把里面的基本代码块全部提取出来,接着对其进行插入分支路径的操作,然后对不同种类的基本代码块进行对应的压扁混淆操作,经过这一系列的操作后得到一个混淆后的程序。

3 控制流混淆算法

3.1 基于不透明谓词的分支路径

在对原程序进行插入分支路径前,我们首先要对整个JAVA代码进行遍历分析,选取复杂度高的结构进行接下来的混淆操作。插入分支路径第一步就是选取不透明谓词和构造垃圾代码块[9-10]。当我们在对一JAVA代码进行保护的时候,如果一个表达式的值我们很容易得到,但是逆向攻击者却要花费巨大时间来判定这个表达式的值,那么这个表达式就被叫做不透明谓词。本文用PT来代表值永远为真的不透明谓词,用PF来代表值永远为假,用P?代表值真假不确定,在图3中,实线箭头表示运行程序时会走到的路径,虚线箭头表示运行程序时永远不会到达的路径即分支路径。

图3 不透明谓词类别

在虚线箭头的一边插入垃圾代码块。这里需要指出的是插入垃圾代码只会给原软件带来文件大小上的开销,因为其永远不会被运行到,所以不会增加程序的运行时间。垃圾代码最好构造得和原代码块外形看起来一样,我们常常通过保持两者程序结构相同的情况下改变垃圾代码块中的数据,这样做会使混淆后的程序变得更加难以逆向破解。

3.2 压扁控制流

在进行插入多余分支路径后我们接下来对程序进行压扁操作,使整个程序结构更难被逆向攻击。本文的压扁控制流的特点是只对部分的原程序块和垃圾代码块进行压扁操作[11-13],剩下的垃圾代码块直接删除。

由基本块的判断条件不同将压扁控制流相关算法细分为if语句,while语句,for语句,switch语句,do-while语句等基本代码块算法。

当我们对原程序进行压扁操作的时候,其实我们利用的条件基本代码块的压扁控制流算法,首先将整个程序看成一个结构块,然后对每一层进行分析,得到该层的嵌套类型,由此就知道了我们接下来将要调用哪一个压扁控制流算法。

(1)分支结构压扁控制流算法

该算法首先分析程序结构,只对程序结构复杂的进行压扁操作,在进行压扁的时候抽取一半的原基本代码块和1/4的垃圾代码块进行压扁,剩余的垃圾代码块直接删除。

下面是一个具体基于基本代码块压扁控制流混淆算法的范例,将if语句进行压扁控制流混淆。

图4(a) 原if语句代码

图4(b) 混淆后if语句代码

图5(a) 原if语句控制流

图5(b) 压扁后的if语句控制流

图4 (a)是原if语句代码,图4 (b)混淆后if语句代码,图5(a)和图5(b)是混淆前后的控制流图,混淆之后的代码与原代码语义等价,但结构不同。

(2)循环语句基本代码块压扁控制流算法

在这里需要指出的是,循环语句的判断条件有时候可能是随机条件或者根据本循环基本代码块结构以外的条件随机产生的,这样我们就不能确切的指定出循环的次数。本文按照在程序运行前是否能确定循环次数的条件,将循环语句基本代码块压扁控制流算法分为两种情况来讨论。

(1)不能确定循环次数的情况下,抽取一半的原基本代码块和1/4的垃圾代码块进行压扁,剩余的垃圾代码块直接删除。

(2)能确定循环次数的情况下,将程序结构分成两个部分,对前一半的结构不进行压扁操作,我们只对后一半的结构进行压扁操作。

下面是一个具体的基本代码块压扁控制流混淆范例,将语句进行压扁控制流混淆。

图6(a) 原while语句代码

图6(b) 压扁后while语句代码

图7(a) 原while语句控制流

图7(b) 压扁后while语句控制流

图6 (a)是原while语句代码,图6 (b)混淆后while语句代码,图7(a)和图7(b)是压扁前后的控制流图,压扁之后的代码与原代码语义等价,但结构不同。

4 小结

本文首先对代码混淆的定义和分类做出了介绍,接着详细介绍了控制流混淆方案,抽取结构复杂度较高的结构代码块进行混淆。选择正确的位置插入不透明分支路径和进行压扁操作,最后对分支机构和循环结构基本块的混淆算法做出了非常详细的论述,并且将混淆前后范例代码和结构图进行了展现。

[1]Cimato S, De Santis A, Ferraro Petrillo U. Overcoming the obfuscation of Java programs by identifier renaming[J]. Journal of Systems & Software, 2005, 78(1):60-72.

[2]宋亚奇, 李莉. 基于随机插入策略的Java混淆器设计与实现[J]. 计算机工程与设计, 2009, 30(4):887-889.

[3]Sun Y, Huang G. A control flow obfuscation scheme based on garbage code[J]. Journal of Theoretical & Applied Information Technology, 2012.

[4]蒋华, 刘勇, 王鑫. 基于控制流的代码混淆技术研究[J]. 计算机应用研究, 2013, 30(3):897-899.

[5]Kulkarni A, Metta R. A New Code Obfuscation Scheme for Software Protection[C]// IEEE, International Symposium on Service Oriented System Engineering. IEEE, 2014:409-414.

[6]陈喆, 王志, 王晓初, 贾春福. 基于代码移动的二进制程序控制流混淆方法[J]. 计算机研究与发展, 2015, 52(8):1902-1909.

[7]邵孟良, 齐德昱, 刘东文. 一种多态内联代码混淆算法[J]. 计算机应用研究, 2015, 32(6):1787-1790.

[8]王志, 贾春福, 刘伟杰, 王晓初, 张海宁, 于晓旭,等. 一种抵抗符号执行的路径分支混淆技术[J]. 电子学报,2015,(5):870-878.

[9]Ceccato M, Penta M D, Falcarin P, et al. A family of experiments to assess the effectiveness and efficiency of source code obfuscation techniques[J]. Empirical Software Engineering, 2014, 19(4):1040-1074.

[10]姚琴. 基于数据混淆的软件保护研究[D]. 武汉理工大学, 2010.

[11]赵玉洁, 汤战勇, 王妮, 房鼎益, 顾元祥. 代码混淆算法有效性评估[J]. 软件学报, 2012, 23(3):700-711.

[12]付剑晶, 王珂. 软件迷惑变换的鲁棒性量化评价[J]. 软件学报, 2013, 24(4):730-748.

[13]林水明, 吴伟民, 陶桂华, 林志毅, 苏庆. 基于主成分分析的代码混淆有效性综合评估模型[J]. 计算机应用研究, 2016, 33(9):2819-2822.

A Code Obfuscation Policy for Java Control Flows

GE Hua, YU Pei-zhao, XIA Meng-sen

(School of Information Engineering, Wuhan 430072, China)

In the reverse analysis field, the structure of Java-based software often needs to be protected. This paper proposes a control flow obfuscation policy based on the structure code blocks under the conclusion of certain conventional code obfuscation policies. This policy is built on the complex structure blocks based on the software structure rather than on basic code. It firstly embeds the branches with junk code blocks, and then carries out the flattening operations based on the structure code blocks. The analysis of the policy indicates that this policy is rather efficient in practice.

code obfuscation; control flow obfuscation; code block

2017-01-15

葛 华(1977-),女,湖北武汉人,副教授,研究方向为电子信息。 余沛钊(1996-),男,湖北宜昌人,研究方向为电子科学与技术。本文的共同第一作者、通讯作者。 夏梦森(1992-), 男,硕士研究生,研究方向为信息安全。

TP31

A

1674-344X(2017)2-0034-04

猜你喜欢

控制流压扁分支
城镇燃气聚乙烯管道压扁阻断关键技术分析
一类离散时间反馈控制系统Hopf分支研究
一类四次扰动Liénard系统的极限环分支
抵御控制流分析的Python 程序混淆算法
抵御控制流分析的程序混淆算法
Carry-on Bags
基于控制流的盒图动态建模与测试
巧分支与枝
塔架加强杆压扁成型实验及力学性能研究
楔形机构压扁工装设计与应用