984724283毕业论文Java程序的保护.doc
《984724283毕业论文Java程序的保护.doc》由会员分享,可在线阅读,更多相关《984724283毕业论文Java程序的保护.doc(16页珍藏版)》请在三一办公上搜索。
1、 Java程序的保护摘要 由于 Java 语言面向对象和编译成中间代码执行的特点,其在抗反编译和反盗版方 面显得尤其脆弱。本文针对 Java 软件的特点,运用多种方法,综合设计出一个保护 Java 类 文件的方法。Java是一种跨平台的、解释型语言。Java 源代码编译中间“字节码”存储于class文件中。Class文件是一种字节码形式的中间代码,该字节码中包括了很多源代码的信息,例如变量名、方法名 等。因此,Java中间代码的反编译就变得非常容易。目前市场上有许多免费的、商用的反编译软件,都能够生成高质量的反编译后的源代码。所以,对开发人员 来说,如何保护Java程序就变成了一个非常重要的挑
2、战。本文首先讨论了保护Java程序的基本方法,然后对代码混淆问题进行深入研究,最后结合一个实际 的应用程序,分析如何在实践中保护Java程序。 关 键 词: Class;加密;密钥;代码混淆 目前,Java 编程语言的应用在全世界范围正流行,它广泛的应用在 Internet 的数据库、 多媒体、CGI 及动态网页的制作方面。1999 年在美国对 Java 程序员的需求量首次超过 C+。 经调查统计,Java 语言应用在软件领域占领着举足轻重的地位,为人类科技文明进步奠定了 重要基础。然而,Java 语言却存在着巨大的安全隐患。Java 是一种跨平台的、解释型语言。 第一,Java 源代码编译中
3、间“字节码”存储于 Class 文件中。Class 文件是一种字节码形式的中 间代码,该字节码中包括了很多源代码的信息,例如变量名、方法名等;第二,由于跨平台 的需求,Java 的指令集比较简单通用,较容易得出程序的语义信息;第三,Java 编译器将每 一个类编译成一个单独的文件,这也简化了反编译的工作;第四,Java 的 Class 文件中,仍 然保留所有的方法和变量的名称,可以通过这些名称来访问变量和方法,这些符号往往带有 许多语义信息。因此,Java 程序的这些特点,很容易对不经过处理的 Java 程序进行反编译。 目前,市场上有许多优秀的 Java 反编译工具,能够反编译出非常接近源代
4、码的程序。所以, 对开发人员来说,如何保护 Java 程序就变成一个非常重要的任务。第一章 JAVA类文件的安全威胁1.1 JAVA的编译 开发 Java 应用程序首先是使用编辑工具编写 Java 的源代码,然后使用编译器编译成虚 拟机可执行的 Class 类文件。编译后生成的类文件是一种有格式的中间代码字节码文件, 不能在本地机器上独立运行,只能在 Java 虚拟机里解释执行。Java 编译器不对变量和方法 等符号的引用转换为数值引用,也不确定程序执行过程中的内存布局,而是将这些符号的引 用信息保留在类文件中,由解释器在运行过程中创建内存布局,然后再通过查找表来确定一 个变量或方法所在的地址
5、1。 从 Java 类文件的结构及其实际数据可知 Java 类文件保留了源代码文件的大部分信息, 如所有的变量和方法等信息。正是由于这个特点,只要在各个平台上实现了各自的 Java 虚 拟机,不用修改 Java 应用程序的源代码就可以在各个平台上运行,真正做到跨平台的特性, 这也是 Java 能够迅速流行起来的重要原因。1.2 JAVA的反编译 反编译是一个将目标代码转换成源代码的过程2。而目标代码是一种用语言表示的代 码,这种语言能通过实机或虚拟机直接执行。从本质上说,他需要根据小规模、低层次的行 为来推断大规模、高层次的行为。因此,反编译目标代码并不容易。 在 JDK 中,有一个反编译器
6、javap3,利用该工具可以对 Java 类文件进行反编译。经过 该工具反汇编后得到的结果并不是源代码,但是使用javap进行反编译的 Java 类文件可以得 到成员变量、方法、行号以及局部变量名等信息4。在 javap 工具的基础上,一些反编译工 具如 Mocha,WinDis,DjDecompiler 等工具可反编译出和源代码几乎一摸一样的代码。第二章 JAVA语言 Java语言的优点主要表现在:简单、面向对象、多线程、分布性、体系结构中立、安全性等方面2.1简单性 Java与C+语言非常相近,但Java比C+简单,它抛弃了C+中的一些不是绝对必要的功能,如头文件、预处理文件、指针、结构、
7、运算符重载、多重继承以及自动强迫同型。 Java实现了自动的垃圾收集,简化了内存管理的工作。这使程序设计更加简便,同时减少了出错的可能。2.2面向对象Java提供了简单的类机制和动态的构架模型。对象中封装了它的状态变量和方法,很好地实现了模块化和信息隐藏;而类则提供了一类对象的原型,通过继承和重载机制,子类可以使用或重新定义父类或超类所提供的方法,从而既实现了代码的复用,又提供了一种动态的解决方案。 Java是一种完全面向对象的程序设计语言,它除了数组、布尔和字符三个基本数据类型外的其它类都是对象,它不再支持全局变量。在Java中,如果不创建新类就无法创建程序,Java程序在运行时必须先创建一
8、个类的实例,然后才能提交运行。Java同样支持继承特性,Java的类可以从其它类中继承行为,但Java只支持类的单重继承,即每个类只能从一个类中继承。 Java支持界面,界面允许程序员定义方法但又不立即实现,一个类可以实现多个界面,利用界面可以得到多重继承的许多优点而又没有多重继承的。2.3多线程 多线程使应用程序可以同时进行不同的操作,处理不同的事件。在多线程机制中,不同的线程处理不同的任务,他们之间互不干涉,不会由于一处等待其他部分,这样容易实现网络上的实时交互操作。Java程序可以有多个执行线程,如可以让一个线程进行复杂的,而让另一个线程与用户进行交互,这样用户可以在不中断计算线程的前提
9、下与系统进行交互。多线程保证了较高的执行效率。2.4分布性Java是面向网络的语言。通过它提供的类库可以处理TCP/IP协议,用户可以通过URL地址在网络上很方便的访问其他对象。2.5体系结构中立Java是一种网络语言,为使Java程序能在网络的任何地方运行,Java解释器生成与体系结构无关的字节码结构的文件格式。Java为了做到结构中立,除生成机器无关的字节码外,还制定了完全统一的语言文本,如Java的基本数据类型不会随目标机的变化而变化,一个整型总是32位,一个长整型总是64位。为了使Java的应用程序能不依赖于具体的系统,Java语言环境还提供了用于访问底层操作系统功能的类组成的包,当程
10、序使用这些包时,可以确保它能运行在各种支持Java的平台上。java.lang: 一般的语言包。其中包括用于字符串处理、多线程、异常处理和数字函数等的类,该包是实现Java程序运行平台的基本包java.util: 实用工具包。其中包括哈希表、堆栈、时间和日期等java.io: 基于流模型的输入/输出包。该包用统一的流模型实现了各种格式的输入/输出,包括文件系统、网络和设备的输入/输出等: 网络包。该包支持TCP/IP协议,其中提供了socket、URL和WWW的编程接口java.awt: 抽象窗口工具集。其中实现了可以跨平台的图形用户界面组件,包括窗口、菜单、滚动条和对话框等java.appl
11、et: 支持applet程序设计的基本包2.6安全性用于网络、分布环境下的Java必须要防止病毒的入侵,Java不支持指针,一切对内存的访问都必须通过对象的实例变量来实现,这样就防止了程序员使用欺骗手段访问对象的私有成员,同时也避免了指针操作中容易产生的错误。第三章 常用JAVA类文件的保护方法3.1 JAVA类文件的保护方法由于 Java 字节码的抽象级别较高,容易被反编译,所以就有了多种防止 Java 字节码被 反编译的方法。 隔离 Java 程序:最简单的方法就是让用户不能够访问到 Java Class 程序,这种方法是最 根本的方法,具体实现有多种方式。 代码混淆:这种方法对 Clas
12、s 文件进行重新组织和处理,使得处理前后的代码具有相同的语义,被混淆后的代码很难被反编译。 转换成本地代码:本地代码难以被反编译,开发人员可以选择将整个应用程序或关键模块转换成本地代码。如果仅仅转换关键模块,在使用这些模块时,需调用 JNI 技术,这将牺牲 Java 的跨平台特性 加密 Class 文件:为了防止 Class 文件被直接反编译,可以将一些关键的 Class 文件加密 例如对密钥、加密算法、注册码、序列号管理相关的类等。在使用这些被加密的类之前 先解密,然后再将其装载到 JVM 中。 对比上述几种方法,都存在其自身的优缺点。隔离 Java 程序只能适合网络环境的客户 机/服务器结
13、构或者分布式的环境,对单机运行的程序就无法隔离,而且 Java 程序需要使用 安全机制保护服务器开放接口的使用,服务器的安全成了整个系统安全的焦点。代码本地化, 对于不同的平台,需要维护不同版本的本地代码,这将加重软件支持和维护的工作。对 Class 文件进行加密,在使用时再进行解密,同时将关键加密代码部分进行代码混淆,这样经过双 重处理后,代码的安全性6提高了很多,该方法也是本文研究的重点。第四章 class文件加密技术Java 生成的 Class 文件大量暴露在客户端,利用现在的反编译工具可轻易的获取源代码, 下面将讲叙如何有效的保护 Class 文件。4.1读取本工程的所有待加密 Cla
14、ss 文件,并保存到 byte 型数组中;public static byte symmetricEncrypt(byte key, byte classData) ;方法对读取到的所 有 Class 文件进行加密, key 为用来加密的密钥,classData 为所读到的待加密 Class 文件, 返回结果为加密后的 Class 文件,然后将其写回原来的 Class 中,保证结构的完整性。4.2加密过的 Cl行解密,最后将解密后的类装载到 JVM 这里我的虚拟机有默认的类加载器,但是若要它根据用户提供的密码解密代码就难以做到, 此时需要通过自定义 ClassLoader 类来完成加密类的装载
15、。自定义的 ClassLoader 首先找到被 加密过的类,然后进行解密,最后将解密后的类装载到 JVM 中。这里我的自定义 ClassLoader 如下: ClassLoader appLoader=new EncryptedClassLoader(EncryptedClassLoader.class.getClassLoader(), new File(args1); Thread.currentThread().setContextClassLoader(appLoader); final Class app = appLoader.loadClass(args2); 其中参数 args
16、1传入的是方法所在的工程名,args2为主函数所在的类名。 在加载类后,系统的默认 findClass()并未对加载的类作任何处理,由于 Class 文件已被加密过,此时若运用系统方法 findClass()则会抛出 ClassNotFoundException()的异常,所以这里需要重构我自己的 findClass()方法:protected Class findClass(final String name) throws ClassNotFoundException final String classResource = name.replace(., /) + .class; fin
17、al URL classURL = getResource(classResource); InputStream in = null;File file = new File(classURL.getPath();byte classBytes = new byte(int)file.length(); FileInputStream fin = new FileInputStream(file); fin.read(classBytes);classBytes = decrypt(classBytes);/解密return defineClass(name, classBytes, 0,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 984724283 毕业论文 Java 程序 保护
链接地址:https://www.31ppt.com/p-4018600.html