干货!如何保护Java程序 避免Java

干货!如何保护Java程序 避免Java

Java是一种跨平台的、解释型语言Java源代码编译中间“字节码”存储于class文件中。Class文件是一种字节码情势的中间代码,该字节码中包括了很多源代码的信息,例如变量名、方法名等。因此,Java中间代码的反编译就变得非常容易。目前市场上有许多免费的、商用的反编译软件,都能够生成高质量的反编译后的源代码。所以,对开发人员来讲,如何保护Java程序就变成了一个非常重要的挑战。下面我们就结合实例讨论保护Java程序的基本方法然后对代码混淆问题进行深入研究, 结合一个实际的应用程序,分析如何在实践中保护Java程序。反编译成为保护Java程序的 挑战通常C、C++等编程语言开发的程序都被编译成目标代码,这些目标代码都是本机器的二进制可执行代码。通常所有的源文件被编译、链接成一个可执行文件。在这些可执行文件中,编译器删除了程序中的变量名称、方法名称等信息,这些信息常常是由内存地址表示,例如如果需要使用一个变量,常常是通过这个变量的地址来访问的。因此,反编译这些本地的目标代码就是非常困难的。Java语言的出现,使得反编译变得非常容易而有效。缘由以下:1.由于跨平台的需求,Java的指令集比较简单而通用,较容易得出程序的语义信息;va编译器将每个类编译成一个单独的文件,这也简化了反编译的工作;va的Class文件中,依然保存所有的方法名称、变量名称,并且通过这些名称来访问变量和方法,这些符号常常带有许多语义信息。由于Java程序本身的特点,对不经过处理的Java程序反编译的效果非常好。目前,市场上有许多Java的反编译工具,有免费的,也有商业使用的,还有的是开放源代码的。这些工具的反编译速度和效果都非常不错。好的反编译软件,能够反编译出非常接近源代码的程序。因此,通过反编译器,黑客能够对这些程序进行更改,或复用其中的程序。因此,如何保护Java程序不被反编译,是非常重要的一个问题。经常使用的保护技术由于Java字节码的抽象级别较高,因此它们较容易被反编译。下面介绍几种经常使用的方法,用于保护Java字节码不被反编译。通常,这些方法不能够 避免程序被反编译,而是加大反编译的难度而已,由于这些方法都有自己的使用环境和弱点。隔离Java程序最简单的方法就是让用户不能够访问到JavaClass程序,这种方法是最根本的方法,具体实现有多种方式。例如,开发人员可以将关键的JavaClass放在服务器端,客户端通过访问服务器的相干接口来取得服务,而不是直接访问Class文件。这样黑客就没有办法反编译Class文件。目前,通过接口提供服务的标准和协议也愈来愈多,例如HTTP、WebService、RPC等。但是有很多运用都不适合这类保护方式,例如对单机运行的程序就没法隔离Java程序。这类保护方式如下图所示。对Class文件进行加密为了避免Class文件被直接反编译,许多开发人员将一些关键的Class文件进行加密,例如对注册码、序列号管理相干的类等。在使用这些被加密的类之前,程序首先需要对这些类进行解密,而后再将这些类装载到JVM当中。这些类的解密可以由硬件完成,也可以使用软件完成。在实现时,开发人员常常通过自定义ClassLoader类来完成加密类的装载(注意由于安全性的缘由,Applet不能够支持自定义的ClassLoader)。自定义的ClassLoader首先找到加密的类,而后进行解密, 将解密后的类装载到JVM当中。在这类保护方式中,自定义的ClassLoader是非常关键的类。由于它本身不是被加密的,因此它可能成为黑客最早攻击的目标。如果相干的解密密钥和算法被攻克,那末被加密的类也很容易被解密。这类保护方式示意图见下图。转换本钱地代码将程序转换本钱地代码也是一种避免反编译的有效方法。由于本地代码常常难以被反编译。开发人员可以选择将全部应用程序转换本钱地代码,也可以选择关键模块转换。如果仅仅转换关键部份模块,Java程序在使用这些模块时,需要使用JNI技术进行调用。固然,在使用这类技术保护Java程序的同时,也牺牲了Java的跨平台特性。对不同的平台,我们需要保护不同版本的本地代码,这将加重软件支持和保护的工作。不过对一些关键的模块,有时这类方案常常是必要的。为了保证这些本地代码不被修改和替换,通常需要对这些代码进行数字签名。在使用这些本地代码之前,常常需要对这些本地代码进行认证,确保这些代码没有被黑客更改。如果签名检查通过,则调用相干JNI方法。这类保护方式示见下图代码混淆转换本钱地代码示意图代码混淆是对Class文件进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能(语义)。但是混淆后的代码很难被反编译,即反编译后得出的代码是非常难懂、晦涩的,因此反编译人员很难得出程序的真正语义。从理论上来讲,黑客如果有足够的时间,被混淆的代码依然可能被破解,乃至目前有些人正在研制反混淆的工具。但是从实际情况来看,由于混淆技术的多元化发展,混淆理论的成熟,经过混淆的Java代码还是能够很好地避免反编译。下面我们会详细介绍混淆技术,由于混淆是一种保护Java程序的重要技术。代码混淆示意图以上几种技术都有不同的运用环境,各自都有自己的弱点,表1是相干特点的比较。混淆技术介绍表1不同保护技术比较表到目前为止,对Java程序的保护,混淆技术还是最基本的保护方法。Java混淆工具也非常多,包括商业的、免费的、开放源代码的。Sun公司也提供了自己的混淆工具。它们大多都是对Class文件进行混淆处理,也有少许工具首先对源代码进行处理,然后再对Class进行处理,这样加大了混淆处理的力度。目前,商业上比较成功的混淆工具包括JProof公司的1stBarrier系列、Eastridge公司的JShrink和4thpass.









































白癜风可以根治吗
北京白癜风治疗中心



转载请注明:http://www.xxcyfilter.com/zyjn/629.html