本文分享了几个关于Java中混淆技术的内容。我觉得边肖很实用,就和大家分享一下作为参考。让我们跟着边肖看一看。
到目前为止,混淆技术是Java程序最基本的保护方法。有许多Java混淆工具,包括商业的、免费的和开源的。孙公司也提供了自己的迷惑工具。大部分都是处理Class文件的混乱,少数工具先处理源代码,再处理Class,增加了混乱。目前商业上比较成功的混淆工具有JProof公司的1stBarrier系列、Eastridge公司的JShrink、4thpass.com的SourceGuard等。
根据混淆的目的,主要的混淆技术可以分为以下几类:符号混淆、数据混淆、控制混淆、控制流重组和预防混淆。
一、符号混淆
Class中有很多与程序执行本身无关的信息,比如方法名和变量名。这些符号的名字往往有一定的含义。例如,如果一个方法被命名为getKeyLength(),那么这个方法可能被用来返回密钥的长度。符号混淆是将信息混淆,变成无意义的表示,例如,从vairant_001开始对所有变量进行编号;所有方法都从method_001开始编号。这会给反编译带来一些困难。对于私有函数和局部变量,您通常可以在不影响程序运行的情况下更改它们的符号。但是对于一些接口名称、公共函数、成员变量,如果其他外部模块需要引用这些符号,我们往往需要保留这些名称,否则外部模块找不到这些名称的方法和变量。因此,大多数混淆工具为符号混淆提供了丰富的选项,允许用户选择是否以及如何混淆符号。
二、数据混淆
数据混淆是混淆程序使用的数据。混淆的方式有很多,主要分为更改数据存储和编码转换以及更改数据访问转换。
改变数据存储和编码会破坏程序使用的数据存储方法。例如,将一个有10个成员的数组拆分成10个变量,并打乱这些变量的名称;将二维数组转换为一维数组等。对于一些复杂的数据结构,我们会打乱它们的数据结构,比如用多个类替换一个复杂的类。
另一种方法是更改数据访问。例如,当访问数组的下标时,我们可以做一些计算,图5就是一个例子。在混淆处理的实践中,这两种方法通常被综合使用,不仅打乱了数据存储,也打乱了数据访问的方式。混淆数据后,程序的语义变得复杂,增加了反编译的难度。
三、控制混淆
控制混淆是对程序的控制流进行混淆,使得反编译程序的控制流更加困难。通常,控制流的改变需要增加一些额外的计算和控制流,因此会对程序的性能带来一些负面影响。有时,在程序的性能和混乱程度之间有一个权衡。控制混乱的技术最复杂,技巧最多。这些技术可分为以下几类:
添加混淆控件可以通过添加额外的复杂控制流来隐藏程序的原始语义。比如对于顺序执行的两个语句A和B,我们可以增加一个控制条件来决定B的执行,这样的话,反汇编就比较困难了。但是所有的干扰控制都不应该影响b的执行。
四、控制流重组
控制流重组也是一种重要的混淆方法。例如,一个程序调用一个方法,混淆后,方法代码可以嵌入到调用程序中。相反,程序中的一段代码也可以转换成函数调用。另外,对于一个循环的控制流来说,它是一个可以拆分多个循环的控制流,或者把循环变成一个递归过程。这种方法是最复杂的,研究人员也很多。
五、预防性混淆
这种混淆通常是为一些特殊的反编译程序设计的。一般来说,这些技术利用反编译程序的弱点或缺陷来设计混淆方案。例如,一些反编译程序不会在Return之后反编译指令,而一些混淆方案只是将代码放在Return语句之后。对于不同的反编译程序,这种混淆的效果是不同的。一个好的混淆工具通常结合这些混淆技术。
感谢阅读!这篇关于“Java中有几种混淆技术”的文章将在这里分享。希望
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/137936.html