如何保护java程序不被反编译

Java是一种 跨平台的、解释型语言 Java 源代码编译中间“字节码”存储于class文件中。Class文件是一种字节码形式的中间代码,该字节码中包括了很多源代码的信息,例如变量名、方法名 等。因此,Java中间代码的反编译就变得非常容易。目前市场上有许多免费的、商用的反编译软件,都能够生成高质量的反编译后的源代码。所以,对开发人员 来说,如何保护Java程序就变成了一个非常重要的挑战
下面我们就结合实例讨论

保护Java程序的基本方法然后对代码混淆问题进行深入研究最后结合一个实际的应用程序,分析如何在实践中保护Java程序。
反编译成为保护Java程序的最大挑战
通常C、C++等编程语言开发的程序都被编译成目标代码,这些目标代码都是本机器的二进制
执行代码。通常所有的源文件被编译、链接成一个可执行文件。在这些可执行文件中,编译器删除了程序中的变量名称、方法名称等信息,这些信息往往是由内存地
址表示,例如如果需要使用一个变量,往往是通过这个变量的地址来访问的。因此,反编译这些本地的目标代码就是非常困难的。
Java语言的出现,使得反编译变得非常容易而有效。
原因如下:
1.由于跨平台的需求,Java的指令集比较简单而通用,较容易得出程序的语义信息;2.Java编译器将每一个类编译成一个单独的文件,这也简化了反编译的工作;3.Java 的Class文件中,仍然保留所有的方法名称、变量名称,并且通过这些名称来访问变量和方法,这些符号往往带有许多语义信息。由于Java程序自身的特点,对于不经过处理的Java程序反编译的效果非常好。
目前,市场上有许多Java的反编译工具,有免费的,也有商业使用的,还有的是开放源代码的。这些工具的反编译速度和效果都非常不错。好的反编译软件,能够反编译出非常接近源代码的程序。因此,通过反编译器,黑客能够对这些程序进行更改,或者复用其中的程序。因此,如何保护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程序的重要技术。代码混淆示意图
以上几种技术都有不同的应用环境,各自都有自己的弱点,表1是相关特点的比较。
混淆技术介绍
表1 不同保护技术比较表 
到目前为止,对于Java程序的保护,混淆技术还是最基本的保护方法。Java混淆工具也非常多,包括商业的、免费的、开放源代码的。Sun
公司也提供了自己的混淆工具。它们大多都是对Class文件进行混淆处理,也有少量工具首先对源代码进行处理,然后再对Class进行处理,这样加大了混
淆处理的力度。目前,商业上比较成功的混淆工具包括JProof公司的1stBarrier系列、Eastridge公司的JShrink和
4thpass.com的SourceGuard等。主要的混淆技术按照混淆目标可以进行如下分类,它们分别为符号混淆(Lexical Obfuscation)、数据混淆(Data Obfuscation)、控制混淆(Control Obfuscation)、预防性混淆(Prevent Transformation)。

案例分析
在实践当中,保护一个大型Java程序经常需要综合使用这些方法,而不是单一使用某一种方法。这是因为每种方法都有其弱点和应用环境。综合使用这些方法使得Java程序的保护更加有效。另外,我们经常还需要使用其它的相关安全术,例如安全认证、数字签名、PKI等。
现在我们要分析的是一个Java应用程序,它是一个SCJP(Sun Certificate Java Programmer)的模拟考试软件。该应用程序带有大量的模拟题目,所有的题目都被加密后存储在文件中。由于它所带的题库是该软件的核心部分,所以关于题库的存取和访问就成为非常核心的类。一旦这些相关的类被反编译,则所有的题库将被破解。现在,我们来考虑如何保护这些题库及相关的类。
在这个例子中,我们考虑使用综合保护技术,其中包括本地代码和混淆技术。因为该软件主要发布在Windows上,因此转换成本地代码后,仅仅需要维护一个版本的本地代码。另外,混淆对Java程序也是非常有效的,适用于这种独立发布的应用系统。
在具体的方案中,我们将程序分为两个部分,一个是由本地代码编写的题库访问的模块,另外一个是由Java开发的其它模块。这样可以更高程度地保护题目管理模块不被反编译。对于Java开发的模块,我们仍然要使用混淆技术。
该方案的示意图如下:

时间: 2024-11-02 16:13:47

如何保护java程序不被反编译的相关文章

安卓App安全保护,如何防止app反编译!

先进的移动设备具有各种奇妙的功能,从长远来看可以节省大量的时间和金钱.但这些设备真是太新了,所以他们具有"不可预料的弱点和保护不当的价值." 手机方面,恶意软件大约99%的目标是针对Android的,而Java编程语言里的漏洞被人利用的机会最高.文章出处!www.ijiami.cn 基于可理解的原因,尽管中国已是智能手机生产大国和消费大国,但智能手机的"大脑"即操作系统还全靠"外援",目前主要有谷歌的安卓系统和苹果的IOS系统.两者中,开放的安卓

Java逆向武器库_反编译工具

1.反编译工具之_jd-gui 官网下载地址:http://java-decompiler.github.io/#jd-gui-download 使用: 下载后解压直接使用即可. jd-gui的优势是图形化界面 操作简单,但gui很久没有更新了 存在无法反编译的情况.   2.反编译工具之_CFR 官网下载地址:http://www.benf.org/other/cfr/ 使用: (1)命令行操作: 进入到CFR所在目标 执行命令(需反编译jar:http_operator.jar.反编译后输出

如何有效的保护 JAVA 程序

从头到尾保护 JAVA 目前关于 JAVA 程序的加密方式不外乎 JAVA 模糊处理(Obfuscator)和运用 ClassLoader 方法进行加密处理这两种方式(其他的方式亦有,但大多是这两种的延伸和变异).这两种方式不管给 JAVA 反编译器造成多少困难, 毕竟还是有迹可寻,有机可乘的.本文介绍的方法是对 ClassLoader 方式加密处理的一种改进,使之达到传统二进制程序代码安全. 0 评论: 胡宪利 ([email protected])中兴通讯SoftSwitch产品部 2002

Java代码的编译与反编译那些事儿

编程语言 在介绍编译和反编译之前,我们先来简单介绍下编程语言(Programming Language).编程语言(Programming Language)分为低级语言(Low-level Language)和高级语言(High-level Language). 机器语言(Machine Language)和汇编语言(Assembly Language)属于低级语言,直接用计算机指令编写程序. 而C.C++.Java.Python等属于高级语言,用语句(Statement)编写程序,语句是计算

Java 编译与反编译

编程语言 在介绍编译和反编译之前,我们先来简单介绍下编程语言(Programming Language).编程语言(Programming Language)分为低级语言(Low-level Language)和高级语言(High-level Language). 机器语言(Machine Language)和汇编语言(Assembly Language)属于低级语言,直接用计算机指令编写程序. 而C.C++.Java.Python等属于高级语言,用语句(Statement)编写程序,语句是计算

如何阻止java反编译

常用的保护技术 由于Java字节码的抽象级别较高,因此它们较容易被反编译.本节介绍了几种常用的方法,用于保护Java字节码不被反编译.通常,这些方法不能够绝对防止程序被反编译,而是加大反编译的难度而已,因为这些方法都有自己的使用环境和弱点. 1. 隔离Java程序 最简单的方法就是让用户不能够访问到Java Class程序,这种方法是最根本的方法,具体实现有多种方式.例如,开发人员可以将关键的Java Class放在服务器端,客户端通过访问服务器的相关接口来获得服务,而不是直接访问Class文件

APK中java代码反编译

Android APK中的Java代码可以被反编译到什么程度主要看APK的加密程度. 第一种情况:无混淆无加密无加壳.直接利用Dex2jar和JD-GUI可把源码从APK里抠出来,代码逻辑清晰,基本上做到可复用,只是资源文件的引用需要计算一下. 第二种情况:混淆.通常是利用Proguard做的防护.因为是对jar做的不可逆混淆(除非有mapping),因此不能还原成原来的代码.但是代码结构,代码逻辑一致,只要花长时间对代码进行梳理一样可找准核心代码,解密方法跟第一种一致. 第三种情况:加密.这里

7 款开源 Java 反编译工具

今天我们要来分享一些关于Java的反编译工具,反编译听起来是一个非常高上大的技术词汇,通俗的说,反编译是一个对目标可执行程序进行逆向分析,从而得到原始代码的过程.尤其是像.NET.Java这样的运行在虚拟机上的编程语言,更容易进行反编译得到源代码.当然,也有一些商业软件,对其程序进行了混淆加密,这样我们就很难用工具反编译了. 1.Java反编译插件 —— Jadclipse JadClipse是Jad的Eclipse插件,是一款非常实用而且方便地Java反编译插件,我们只需将下载的插件包复制到e

如何阻止APK反编译查看源代码? 爱加密保护开发者创意

小编曾看到一篇文章,说是一个在校大学生开发一个App并上传应用市场,不久,市场即出现相同的App,下载量还很可观,这个App是反编译了他的应用包.因为他当时没有资金和团队,无从申诉,反被同学认为是剽窃他人的创意,创业之路也因此夭折. 他说道如果市场上早些出现关于App加密保护的平台,也许自己的创业道路会更顺遂.小编也感到很惋惜,今天就说说如何防止黑客反编译查看APK源码的问题,想要防止反编译APK,就要知道反编译得到源码是如何进行的. 反编译APK得到Java源代码 就用反编译工具来举例,例如d