论文部分内容阅读
如今,平板电脑,智能手机,Mac电脑等已经越来越多的进入了人们的生活,以往Window和Intel的组合不再独大。为了使得很多应用程序一次编写之后都可以在各种平台运行,类似于Java这种中间性语言就越来越受到欢迎,Toibe刚刚发布的2012年3月份编程语言中,Java依然排行第一。但是Java等中间性语言很容易受到逆向工程的攻击,因为它们是定义完善,开源,以及以字节码执行的语言。所以,需要使用一种比较安全的保护Java等程序的方法,混淆,即把一个程序的源代码转变为更复杂,但是语义一致,运行结果也相同的代码。通常代码混淆包括改变控制流,改变标识符名字,移除一些与程序运行无关的信息等。目前对于混淆的研究一般集中在“增加不透明谓词来改变控制流”,“加入多余语句”,“改变标识符名字”等方法上。本文首先对基于控制流的混淆方法进行了细致的研究,提出了一些改进,在此基础上提出了一个全新的方法,通过Java等语言的异常机制来混淆程序代码:在普通分支中加入异常指令,并且把正确分支的入口地址放到异常处理表中,再添加一些欺骗和多余的分支起迷惑作用,程序通过异常处理表查询并且跳转到正确的分支执行。我们还对基于异常的代码混淆方法进行了扩展和改进,提出了间接异常链接和多重异常链接的方法,这两种方法增加了分支的数量和分支的复杂度,从而使反编译器和反混淆器更难以破解。以上述理论为基础,本文设计和实现了一个Java混淆器,可以对Java编译生成的类文件进行六种不同的混淆,指定混淆强度和最大时间开销,还可以对类文件进行控制流图的分析。通过本文实现的混淆器对常用的排序算法的源代码进行了控制流混淆和异常混淆,使用性能测试工具对混淆后的代码执行时间,空间大小进行了测试和对比,证明了混淆后的代码在执行性能和文件大小上不会有太大的负载。最后本文使用三个反编译器对混淆结果进行了反编译测试,证明了基于异常的代码混淆方法是有效的,而且在很多方面还要优于传统的混淆技术。结合异常混淆和控制流混淆,能抵御大多数常见反编译器的攻击。