您的位置:首页 > 编程语言 > Java开发

【Java代码保护技术】代码混淆

2015-08-11 17:15 176 查看
作者:郭孝星

微博:郭孝星的新浪微博

邮箱:allenwells@163.com

博客:http://blog.csdn.net/allenwells

Github:https://github.com/AllenWells

【Java代码保护技术】章节列表

【Java代码保护技术】Java代码保护开篇

【Java代码保护技术】代码混淆

代码混淆是对Class文件进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能(语义)。但是混淆后的代码很难被反编译,即反编译后得出的代码是非常难懂、晦涩的,因此反编译人员很难得出程序的真正语义。

一 代码混淆原理

代码混淆通常从以下几个方面着手:

符号混淆

数据混淆

控制混淆

预防性混淆

1.1 符号混淆

在Class中存在的方法名称、变量名称这些符号的名称,往往带有一定的含义。符号混淆就是将这些信息打乱,把这些信息变成无任何意义的表示,这将对反编译带来一定的困难。对于私有函数、局部变量,通常可以改变它们的符号,而不影响程序的运行。但是对于一些接口名称、公有函数、成员变量,如果有其它外部模块需要引用这些符号,我们往往需要保留这些名称,否则外部模块找不到这些名称的方法和变量。因此,多数的混淆工具对于符号混淆,都提供了丰富的选项,让用户选择是否、如何进行符号混淆。

1.2 数据混淆

数据混淆是对程序使用的数据进行混淆。混淆的方法也有多种,主要可以分为:

1 改变数据存储及编码

改变数据存储和编码可以打乱程序使用的数据存储方式。例如将一个有10个成员的数组,拆开为10个变量,并且打乱这些变量的名字等。对于一些复杂的数据结构,我们将打乱它的数据结构,例如用多个类代替一个复杂的类等。

2 改变数据访问

另外一种方式是改变数据访问。例如访问数组的下标时,我们可以进行一定的计算。

在实践混淆处理中,这两种方法通常是综合使用的,在打乱数据存储的同时,也打乱数据访问的方式。经过对数据混淆,程序的语义变得复杂了,这样增大了反编译的难度。

1.3 控制混淆

控制混淆就是对程序的控制流进行混淆,使得程序的控制流更加难以反编译,通常控制流的改变需要增加一些额外的计算和控制流,因此在性能上会给程序带来一定的负面影响。有时,需要在程序的性能和混淆程度之间进行权衡。控制混淆的技术最为复杂,技巧也最多。这些技术可以分为如下几类:

增加混淆控制 通过增加额外的、复杂的控制流,可以将程序原来的语义隐藏起来。

重组控制流也是重要的混淆方法。例如,程序调用一个方法,在混淆后,可以将该方法代码嵌入到调用程序当中。

1.4 预防性混淆

这种混淆通常是针对一些专用的反编译器而设计的,一般来说,这些技术利用反编译器的弱点或者Bug来设计混淆方案。例如,有些反编译器对于Return后面的指令不进行反编译,而有些混淆方案恰恰将代码放在Return语句后面。这种混淆的有效性对于不同反编译器的作用也不太相同的。

一个好的混淆工具,通常会综合使用这些混淆技术。符号混淆主要应用于迷惑解读程序的攻击者,同时在抵抗反编译工具领域也起到一定作用。数据混淆目前主要针对的是对布尔变量的替换。控制混淆是应用比较广泛的一种混淆技术,主要是通过增加程序的复杂度来增强程序的抗攻击能力。预防混淆是针对不同的反编译软件而设计的。

数据混淆和控制混淆为了提高混淆后程序的复杂度,通常都会在程序中引入大量的布尔变量或源程序以外的结构,大大增加了程序的代码量和程序的时空执行开销,虽然也增加了程序抗攻击性,但程序的执行效率也大大降低。而一般的符号混淆技术虽然没有增加程序的执行开销,但程序的复杂度却不高。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: