Chinaunix首页 | 论坛 | 博客
  • 博客访问: 682329
  • 博文数量: 85
  • 博客积分: 1797
  • 博客等级: 上尉
  • 技术积分: 1238
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-02 08:53
个人简介

职位:技术总监 1、精通c++(linux平台、vc++Mfc、qt)、java、php、unity3d,略懂python 2、用c++开发过嵌入式产品,用c++开发过大型银行运维产品 3、用java开发大型银行运维产品,学校教务系统 4、用php开发进销存系统(在销售中),用php开发淘宝小程序 5、用unity3d开发衣柜设计软件,在运营中

文章分类

全部博文(85)

分类: Java

2016-07-05 10:41:21

一、代码混淆定义

Java是一种跨平台的、解释型语言,Java源代码编译成中间“字节码”存储于class文件中。由于跨平台的需要,Java字节码中包括了很多源代码信息,如变量名、方法名,并且通过这些名称来访问变量和方法,这些符号带有许多语义信息,很容易被反编译成Java源代码。为了防止这种现象,我们可以使用Java混淆器对Java字节码进行混淆。

混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义。被混淆过的程序代码,仍然遵照原来的档案格式和指令集,执行结果也与混淆前一样,只是混淆器将代码中的所有变量、函数、类的名称变为简短的英文字母代号,在缺乏相应的函数名和程序注释的况下,即使被反编译,也将难以阅读。同时混淆是不可逆的,在混淆的过程中一些不影响正常运行的信息将永久丢失,这些信息的丢失使程序变得更加难以理解。

混淆器的作用不仅仅是保护代码,它也有精简编译后程序大小的作用。由于以上介绍的缩短变量和函数名以及丢失部分信息的原因, 编译后jar文件体积大约能减少25% ,这对当前费用较贵的无线网络传输是有一定意义的。

代码混淆的目的是防止对软件的逆向分析,从而有效保护软件知识产权。它通过改变程序本身,使其转换为极难理解和分析的新程序,最终让恶意攻击者在必须耗费其所不能承受的代价(时间或其它方面)面前,放弃对软件的分析来实现。

二、代码混淆技术

       根据混淆对象和对其进行操作的差别,可将代码混淆技术分为外形(layout)混淆、控制(control)混淆、数据(data)混淆、预防(preventive)混淆等几种。

      (1)外形混淆。该类混淆主要包括对程序中的变量名、常量名、类名、方法名称等标识符作词法上的变换改名和删除程序中与执行无关的调试信息、注释、源码格式等。

(2)控制混淆。该类混淆的目的是使得攻击者对程序的控制流难以理解。主要包括打乱某段代码本身逻辑关系的聚集混淆(Aggregation Transformation)、把相关语句分散到程序不同位置并实现某项功能的次序混淆(Ordering Transformation)和隐藏真实执行路径的执行混淆(Computation Transformation)等。

(3)数据混淆。数据混淆的对象是程序中的数据域。它可细分为相关数据的储存(Storage)与编码(Encoding)方式的混淆、组合和拆分数据的聚集(Aggregation)混淆、位序重计的次序(Ordering)混淆等。

(4)预防混淆。与前述混淆类型针对恶意用户不同,预防混淆主要利用一些专用反编译器的设计缺陷,以使这些反编译器难以反向还原混淆之后的代码。例如,反编译器 mocha 对于 Return 后面的指令不进行反编译,Hosemocha 就是专门针对此缺陷,故意将代码放在 Return 语句后面,从而使反编译失效。

 

此外,我们常用的还有:

将代码中的各种元素,如变量,函数,类的名字改写成无意义的名字。比如改写成单个字母,或是简短的无意义字母组合,甚至改写成“__”这样的符号,使得阅读的人无法根据名字猜测其用途。

重写代码中的部分逻辑,将其变成功能上等价,但是更难理解的形式。比如将for循环改写成while循环,将循环改写成递归,精简中间变量,等等。

打乱代码的格式。比如删除空格,将多行代码挤到一行中,或者将一行代码断成多行等等。

三、代码混淆评判标准

    代码混淆效果通常从强度(potency)、耐受性(resilience)、开销(cost)、隐蔽性(stealth) 4个方面来评估:

    (1)强度。指混淆变换后的程序相对原始的程序对恶意用户理解程序造成的困难程度或复杂度。

    (2)耐受性。指混淆变换后的程序对使用自动去混淆工具进行攻击的抵抗度。其抵抗度大小与前述标准之一的强度的大小无直接联系,甚至可能出现某些强度很高的混淆变换对自动去混淆工具的抵抗能力却很差的情况。

    (3)开销。指经过混淆变换后的程序在执行时由变换所带来的额外的执行时间和所需存储空间的开销。

(4)隐蔽性。耐受性好的混淆变换不容易被自动去混淆工具所去除,但却可能很容易被攻击者的人工分析识破。特别是,如果一种变换所引入的代码和原始程序有较大的差异性,就会轻易地被攻击者识破,因此应尽力使用与原代码相近的语法结构等来加强隐蔽性。

 

四、代码混淆缺点

(1)被混淆的代码难于理解,因此调试除错也变得困难起来。开发人员通常需要保留原始的未混淆的代码用于调试。

(2)对于支持反射的语言,代码混淆有可能与反射发生冲突。

(3)代码混淆并不能真正阻止反向工程,只能增大其难度。因此,对于对安全性要求很高的场合,仅仅使用代码混淆并不能保证源代码的安全。

五、代码混淆工具介绍

       大部分的代码混淆工具都是国外的程序员或者组织贡献的

       这里参考了Google的一个展示,它是按照该软件在Google的得分顺序排列的。

 

 

可以看到:位于排名第一位的,是ProGuard

ProGuard是由著名开源组织sourceforge.net贡献的,基于GNU GPL,免费使用

我们下载的,是其最新版本,在20112月份发布的4.6版本

它是使用Java编写的

下面简单介绍下操作使用步骤:

1、  点选菜单第二项:Input/Output (输入输出)

在右上部分点击Add Input ,选择欲混淆的jar包,war包,或者目录

在右上部分点击Add Output ,选择混淆后所要新生成的jar包,war包,或者目录

还要在右下部分点击 Add,选择编译所依赖的其他Jar

2、  点选菜单第四项:Obfuscation (混淆)

其第一项Obfuscate是一定要选中的,不然就没有什么效果了

最下面的Keep additional class names and class member names就是要保留的类名了

需要反射或者需要对外暴露接口的类就需要添加在这里了,这样就不会被混淆了

3、  点选菜单第七项:Process (处理)

它的按钮都在右下方,这点要特别注意

View Configuration Save Configuration都是关于配置文件的

Save Configuration可以让你把你之前的操作选项都记录下来,方便下次使用。

最重要的就是Process按钮了,点击它之后混淆就真正的开始处理了

4、  常见问题:

A、ProGuardwar包的混淆是有要求的,它要求类必须是在WEB-INF目录下的lib目录里以jar包的形式存在,所以如果类是在WEB-INF目录的classes下面的话,就会报错。

B、内存溢出异常:ProGuard使用Java编写,有时需要处理的类比较多,会造成内存溢出
      
解决办法:修改bin目录下的proguardgui.bat文件,在java命令后添加-Xms128m-Xmx256m参数,以设定指定JVM大小

C、栈溢出异常:

ProGuard默认会采用优化的策略,即菜单第五项Optimization,因此可能遇到非常复杂的方法时,会处理不了,这时可去掉优化。

                     D、如何运行

                            ProGuard的图形界面的运行方式是:

ProGuard目录下的bin目录下的proguardgui.bat文件

5、  其他菜单项介绍(不是混淆使用的重点)

A、菜单第三项:Shrinking (缩进)

该项是对代码的缩进进行处理

B、 菜单第五项:Optimization (优化)

该项是对代码的性能进行优化处理

该项默认是选中的

C、 菜单第六项:Information (信息)

该项是对代码的相关信息进行处理

D、菜单第八项:Retrace (跟踪)

该项可以对代码的混淆进行跟踪查看

阅读(4278) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~