Java反编译的几种常用方法

开发 后端
由于Java字节码的抽象级别较高,因此它们较容易被反编译。本文讲述了四种常用的Java反编译的方法,它们分别是隔离Java程序、对Class文件进行加密、转换成本地代码和代码混淆。

由于Java字节码的抽象级别较高,因此它们较容易被反编译。下面介绍了几种常用的Java反编译的方法,用于保护Java字节码不被反编译。通常,这些方法不能够绝对防止程序被反编译,而是加大反编译的难度而已,因为这些方法都有自己的使用环境和弱点。
一、隔离Java程序

最简单的方法就是让用户不能够访问到Java Class程序,这种方法是最根本的方法,具体实现有多种方式。例如,开发人员可以将关键的Java Class放在服务器端,客户端通过访问服务器的相关接口来获得服务,而不是直接访问Class文件。这样黑客就没有办法反编译Class文件。目前,通过接口提供服务的标准和协议也越来越多,例如 HTTP、Web Service、RPC等。但是有很多应用都不适合这种保护方式,例如对于单机运行的程序就无法隔离Java程序。

二、对Class文件进行加密

为了防止Class文件被直接反编译,许多开发人员将一些关键的Class文件进行加密,例如对注册码、序列号管理相关的类等。在使用这些被加密的类之前,程序首先需要对这些类进行解密,而后再将这些类装载到JVM当中。这些类的解密可以由硬件完成,也可以使用软件完成。

在实现时,开发人员往往通过自定义ClassLoader类来完成加密类的装载(注意由于安全性的原因,Applet不能够支持自定义的ClassLoader)。自定义的ClassLoader首先找到加密的类,而后进行解密,最后将解密后的类装载到JVM当中。在这种保护方式中,自定义的ClassLoader是非常关键的类。由于它本身不是被加密的,因此它可能成为黑客最先攻击的目标。如果相关的解密密钥和算法被攻克,那么被加密的类也很容易被解密。

三、转换成本地代码

将程序转换成本地代码也是一种防止反编译的有效方法。因为本地代码往往难以被反编译。开发人员可以选择将整个应用程序转换成本地代码,也可以选择关键模块转换。如果仅仅转换关键部分模块,Java程序在使用这些模块时,需要使用JNI技术进行调用。当然,在使用这种技术保护Java程序的同时,也牺牲了Java的跨平台特性。对于不同的平台,我们需要维护不同版本的本地代码,这将加重软件支持和维护的工作。不过对于一些关键的模块,有时这种方案往往是必要的。为了保证这些本地代码不被修改和替代,通常需要对这些代码进行数字签名。在使用这些本地代码之前,往往需要对这些本地代码进行认证,确保这些代码没有被黑客更改。如果签名检查通过,则调用相关JNI方法。

四、代码混淆

代码混淆是对Class文件进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能(语义)。但是混淆后的代码很难被反编译,即反编译后得出的代码是非常难懂、晦涩的,因此反编译人员很难得出程序的真正语义。从理论上来说,黑客如果有足够的时间,被混淆的代码仍然可能被破解,甚至目前有些人正在研制反混淆的工具。但是从实际情况来看,由于混淆技术的多元化发展,混淆理论的成熟,经过混淆的Java代码还是能够很好地防止反编译。下面我们会详细介绍混淆技术,因为混淆是一种保护Java程序的重要技术。

以上便是四种最常用的Java反编译的方法。

 

【编辑推荐】

  1. 20个开发人员非常有用的Java功能代码
  2. 走进Java 7中的模块系统
  3. JavaFX 1.2 已经发布 主要新功能一览
  4. 2009年十大Java技术解决方案
  5. 2008最值得学习的五种JAVA技术

 

责任编辑:仲衡 来源: jethro的个人主页
相关推荐

2015-01-15 11:01:43

2011-05-31 14:52:13

Android 反编译 方法

2011-05-31 14:18:17

2017-02-20 13:54:14

Java代码编译

2011-04-20 10:32:44

java反编译

2021-03-07 16:31:35

Java编译反编译

2021-12-17 14:27:52

jar反编译Java

2016-09-06 22:16:42

JavaDOCXPDF

2009-06-11 14:11:33

代码混淆Java反编译

2010-05-17 15:17:06

MySQL常用操作

2020-08-25 08:53:02

Linux端口转发

2021-12-10 10:05:27

Java反编译jar

2014-09-25 10:28:02

反编译工具Java

2012-11-06 10:02:04

JavaJadEclipse

2021-06-30 06:10:31

数组去重方法数组变量

2010-05-04 15:49:24

Oracle修改

2009-09-14 18:11:23

C#排序方法

2011-06-30 14:58:16

伪原创

2021-05-18 10:18:15

Java

2009-08-06 17:24:08

C#字符串
点赞
收藏

51CTO技术栈公众号