JAVA反编译和源代码保护
java class文件反编译

java class文件反编译Java Class文件反编译简介概述:Java Class文件是Java源代码编译后生成的二进制文件,其中包含了Java程序的字节码指令、常量池、方法信息等。
在某些情况下,我们可能需要对Class文件进行反编译,以了解其中的实现细节或进行代码审查。
本文将介绍Java Class文件的反编译过程以及常用的反编译工具。
一、反编译的目的和意义在软件开发的过程中,我们经常会遇到需要了解第三方库或框架的实现细节的情况。
而这些库或框架通常是以二进制形式提供的,我们无法直接查看源代码。
此时,通过反编译Class文件可以帮助我们了解其实现原理,便于理解和使用。
此外,对于一些需要进行代码审查或安全性分析的场景,反编译也是常用的手段之一。
二、反编译的工具1. JD-GUIJD-GUI是一款开源的Java Class文件反编译工具,它提供了用户友好的图形界面,能够将Class文件反编译为可读的Java源代码。
使用JD-GUI只需打开Class文件,然后即可查看其中的源代码。
JD-GUI支持查看常量池、方法、字段等详细信息,并提供了代码高亮、查找、导出等实用功能。
2. CFRCFR是另一款常用的Java Class反编译工具,它能够将Class文件反编译为高度优化的Java源代码。
与JD-GUI相比,CFR更加注重代码的可读性和准确性。
CFR提供了丰富的命令行选项,可以根据需要进行定制化配置。
此外,CFR还支持反编译内部类、Lambda 表达式等Java语法特性。
3. ProcyonProcyon是一款功能强大的Java反编译工具,它能够将Class文件反编译为易于阅读和理解的Java源代码。
Procyon支持Java 8的新特性,例如Lambda表达式、方法引用等。
与其他工具相比,Procyon在反编译效果和性能方面都具有一定的优势。
三、反编译的注意事项1. 法律合规性:在进行反编译之前,我们应该确保自己遵守了相关的法律和法规。
JAVA反编译工具

-o - 无需确认直接覆盖输出 (default: no)
-p - 发送反编译代码到标准输出 STDOUT (e.g., for piping)
-nl - 分割strings用新行字符 newline character (default: no)
-nodos -不要去检查class文件是否以dos方式写 (CR before NL, default: check)
-nocast - 不要生成辅助文件
-nocode -不要生成方法的源代码
反编译结果以.java为扩展名。
四、Option -p
将反编译结果输出到屏幕
c:\java\>jad -p example1.class
将反编译结果重定向到文件
c:\java\>jad -p example1.class>example1.java
新加入的类包或是类的名字会在左侧窗口出现,双击类包名可以展开目录树结构,双击需要反编译的类名则在右上角的窗口中直接显示反编译后的源代码。
三、 独树一帜的DAVA
DAVA不是一个独立的JAVA反编译器,而是JAVA代码优化工具Soot的一部分。Soot和JODE一样是纯JAVA开发的,也是一个独立的JAR包,但却不能通过双击直接运行,而是象JAD一样在命令行状态运行。
五、Option -d
指定反编译的输出文件目录
c:\java\>jad -o -dtest -sjava *.class
命令行选择的列表
-a - 用JVM字节格式来注解输出
-af - 同 -a,但是注解的时候用全名称
-clear - 清除所有的前缀
JODE是全球最大的开源项目网站的成员,不要以为源码开放就小瞧它,在所有的JAVA反编译器中,JODE的反编译效果是最好的,尤其是对付一些常见的加密手段,例如混淆技术等,更是出类拔粹。
java class文件反编译

java class文件反编译Java Class文件反编译:解密Java字节码导语:Java是一种面向对象的高级编程语言,而Java Class文件则是Java程序编译后生成的字节码文件。
但是,有时候我们需要对Java Class文件进行反编译,以便了解其源代码实现,或者进行代码审计等工作。
本文将介绍Java Class文件的反编译过程和相关工具,帮助读者更深入地理解和掌握Java程序的内部结构。
一、什么是Java Class文件?Java Class文件是Java程序编译后生成的二进制文件,它包含了Java程序的字节码指令、常量池、字段、方法等信息。
Java虚拟机(JVM)可以读取和执行Java Class文件,将其转换为可运行的机器码。
二、为什么需要反编译Java Class文件?1. 学习和理解源代码:有时候我们只有Java Class文件,但没有源代码。
通过反编译Java Class文件,可以还原出源代码,以便学习和理解程序的实现原理。
2. 代码审计和安全分析:反编译Java Class文件可以帮助我们分析程序的安全性,检查是否存在漏洞或潜在的安全风险。
3. 调试和修复问题:有时候我们需要对Java程序进行调试和修复问题,但没有源代码。
通过反编译Java Class文件,我们可以了解程序的内部结构和运行逻辑,更方便地进行调试和修复工作。
三、Java Class文件的反编译工具1. JD-GUI:JD-GUI是一款免费的Java Class文件反编译工具,可以将Java Class文件转换成可阅读的源代码。
它提供了友好的用户界面和强大的反编译功能,可以帮助我们快速还原出Java程序的源代码。
2. CFR:CFR是另一款流行的Java Class文件反编译工具,与JD-GUI相比,它提供了更高级的反编译功能。
CFR可以将Java Class 文件转换为高度优化的源代码,使得我们能够更好地理解程序的实现逻辑。
java反编译工具 idea使用案例

java反编译工具 idea使用案例
IDEA 是一个基于 Java 开发的集成开发环境(IDE),提供了很多强大的开发工具和功能。
虽然 IDEA 本身不包含反编译工具,但可以通过安装第三方插件来实现 Java 反编译功能。
下面是使用 IDEA 进行 Java 反编译的步骤:
1. 打开 IDEA,并创建一个新的 Java 项目,或者打开一个已有的项目。
2. 在 IDEA 的插件库中搜索并安装 `Java Decompiler` 插件。
可以在 IDE 的设置界面中选择 `Plugins`,然后搜索并安装 `Java Decompiler`。
3. 安装完成后,重新启动 IDEA。
4. 打开需要进行反编译的 Java 类文件。
5. 在 IDEA 的代码编辑器中,右键点击需要反编译的类文件,选择 `Decompile Class`。
6. 在新的窗口中,将会显示该类文件的反编译代码。
7. 可以查看和分析反编译后的代码,进行修改和重构。
需要注意的是,有些类文件可能会被编译为 Kotlin(一种运行在 JVM 上的静态类型编程语言)或其他语言,如果想要反编
译这些类文件,可能需要安装相应的插件。
此外,还有其他的反编译工具可以与 IDEA 配合使用,比如`JD-GUI`、`Fernflower` 等。
可以通过将这些工具的 JAR 文件添加到项目的依赖中,然后使用 IDEA 的调试功能来查看反编译的代码。
防止反编译的措施

防止反编译的措施
代码就像是我们精心打造的宝贝,可不能轻易让别人给反编译了呀!那怎么防止反编译呢?这可得好好琢磨琢磨。
咱先说说代码混淆吧,这就好比给宝贝穿上了一件花衣服,让别人很难一眼就看清它本来的模样。
把那些关键的代码变得七扭八歪的,让那些想反编译的人摸不着头脑,这招是不是很绝!
还有啊,加密也是很重要的手段呢。
就像给宝贝上了一把锁,没有钥匙可打不开。
对重要的数据进行加密处理,让那些不怀好意的人就算拿到了也没法轻易看懂。
再想想,增加代码的复杂性也是个好办法呀。
就如同走迷宫一样,让别人在里面绕来绕去,最后都不知道自己走到哪儿了。
多设置一些弯弯绕绕的逻辑和流程,让反编译的人望而却步。
另外呀,我们可以采用一些动态技术。
这就好像宝贝会七十二变,一会儿这样,一会儿又那样,让那些想抓住它的人根本无从下手。
我们辛辛苦苦写出来的代码,怎么能随便让人给反编译了呢?那不是白费我们的心血了吗?所以一定要把这些措施都用上,把我们的代码保护得严严实实的。
难道我们不应该这样做吗?不这样做怎么行呢!我们就是要让那些想反编译的人知道,想轻易得逞,没门!我们的代码是我们的骄傲,是我们的心血结晶,可不能让人随随便便就给破坏了。
我们要用各种方法,让我们的代码坚如磐石,固若金汤!让那些心怀不轨的人知难而退!。
技术-Java防反编译技术

Java防反编译技术1简介1.1 Java软件面临的挑战目前,由于黑客的频繁活动,使得Java类文件面临着反编译的挑战。
有一些工具能够对Java 源代码进行反工程,其结果甚至以比普通Java文件更可读的方式, 尽管普通的Java文件(由于代码风格不同)有注释。
许可证和软件过期对于用户们来说将变得无用。
因此,防止软件被反编译或使得反编译的结果变得无意义对于Java来说非常重要。
一个Java类文件不一定非要存储在一个真正的文件里;它可以存在存贮器缓冲区,或从一个网络流获得。
尽管防火墙和网络协议如TCP/IP有安全策略,黑客仍能打破访问限制获取一些类。
尽管这些类能被混淆,他们(黑客)能够一步一步地分析和猜出每个指令的目的。
如果这些代码是关键技术部分,例如是大产品的许可证或时间期满部分,反编译和分析指令的努力似乎很值得。
如果这些关键类被隐藏或被一个关键字加密,黑客的非法入侵就很困难了。
而且,未认证的软件复制对智能产权是普遍的攻击。
还没有一个较好的通用方案来解决这类问题。
目前关于JA V A程序的加密方式不外乎JA V A混淆处理(Obfuscator)和运用ClassLoader 方法进行加密处理这两种方式(其他的方式亦有,但大多是这两种的延伸和变异)。
1.2 混淆处理关于JA V A程序的加密方式,一直以来都是以JA V A混淆处理(Obfuscator)为主。
这方面的研究结果也颇多,既有混淆器(如现在大名鼎鼎的JODE,SUN开发的JADE),也有针对反编译器的"炸弹"(如针对反编译工具Mocha的"炸弹" Crema和HoseMocha)。
混淆器,从其字面上,我们就可以知道它是通过混淆处理JA V A代码,具体的说,就是更换变量名,函数名,甚至类名等方法使其反编译出来的代码变得不可理解。
它的目的是:让程序无法被自动反编译,就算被反编译成功,也不容易被程序员阅读理解其实这只是做到了视觉上的处理,其业务逻辑却依然不变,加以耐心,仍是可以攻破的,如果用在用户身份验证等目的上,完全可以找到身份验证算法而加以突破限制。
javap 反编译方法

javap 反编译方法javap 反编译方法简介javap 是 Java 开发工具包(JDK)中一个强大的命令行工具,它可以用来反编译 Java 类文件。
通过使用 javap,开发者可以查看类文件中的详细信息,包括类的成员变量、方法、常量池等。
本文将介绍使用 javap 工具进行反编译的几种方法。
方法 1: 使用默认选项可以直接运行以下命令来反编译指定的类文件:javap YourClass这将会输出 YourClass 类的详细信息,包括方法的签名、运行时的标志等。
方法 2: 查看类的源代码如果你想查看类的源代码,可以加上-c选项,运行以下命令:javap -c YourClass这将会输出类的源代码,显示类中每个方法的字节码指令。
方法 3: 显示更多信息使用-verbose选项可以显示更多关于类文件的详细信息,包括类文件的版本号、常量池中的常量、访问标志等。
运行以下命令:javap -verbose YourClass这将会输出更详细的类文件信息。
方法 4: 反编译所有类如果你想反编译一个 JAR 文件中的所有类,可以使用以下命令:javap -classpath -s这将会输出 JAR 文件中所有类的详细信息,包括类的签名、方法和字段信息。
方法 5: 保存结果到文件你可以将反编译结果保存到一个文件中,以便后续查看。
运行以下命令:javap YourClass >这将会将 YourClass 类的反编译结果保存到名为的文件中。
结论通过使用 javap 工具,我们可以方便地查看 Java 类文件的详细信息,甚至反编译类的源代码。
无论是查看单个类的信息,还是反编译整个 JAR 文件,javap 都是一个非常有用的工具。
希望本文所介绍的各种方法能够帮助您更好地使用 javap 进行反编译。
方法 6: 反编译内部类如果你想查看类中的内部类的详细信息,可以运行以下命令:javap YourClass$InnerClass这将会输出内部类 InnerClass 的详细信息,包括方法、常量池等。
eclipse java web项目反编译

文章标题:深入探讨eclipse中Java Web项目反编译的方法与重要性在当今数字化时代,软件开发已经成为不可或缺的一部分。
Java作为一种流行的编程语言,在企业级应用开发中被广泛应用。
而在Java开发过程中,反编译在项目维护和安全性检查中扮演着至关重要的角色。
本文将从深度和广度两个方面对eclipse中Java Web项目反编译的方法与重要性进行全面评估,并提供有价值的观点和理解。
一、eclipse中Java Web项目的反编译方法1. 导入反编译工具:在eclipse中,可以通过导入各种反编译工具来实现对Java Web项目的反编译。
常用的工具包括JD-GUI、Procyon 等,它们能够将.class文件转换为易于阅读的源代码,帮助开发者更好地理解和维护项目。
2. 设置反编译快捷键:在eclipse的设置中,可以为反编译工具设置快捷键,便于开发者在需要时快速进行反编译操作。
这样可以提高效率,减少开发过程中出现的问题。
3. 调试和修复:通过反编译工具,开发者可以方便地进行调试和修复工作,及时解决项目中的bug和错误。
这也是保障项目质量的关键步骤。
二、eclipse中Java Web项目反编译的重要性1. 代码安全性检查:反编译工具可以帮助开发者检查项目代码的安全性,避免出现潜在的漏洞和安全隐患。
通过查看反编译后的源代码,可以及时发现并修复可能存在的安全问题。
2. 项目维护与升级:在项目维护和升级过程中,使用反编译工具可以更好地理解现有的代码结构和逻辑,有助于进行代码重构和优化。
这对于提升项目的可维护性和可扩展性非常重要。
3. 知识学习和技术共享:通过反编译工具,开发者还可以学习他人的优秀代码和技术经验,提高自身的编程能力和水平。
也可以共享自己的代码给他人学习,促进技术交流和共同进步。
个人观点与理解对我个人而言,eclipse中Java Web项目反编译不仅是一项必需的技能,更是一种重要的态度和责任。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.10 Java 反编译和源代码保护一、反编译反编译是一个将目标代码转换成源代码的过程。
目标代码是一种用机器语言表示的代码,这种语言能通过实机或虚拟机直接执行。
当C编译器编译生成一个对象的目标代码时,该目标代码是为某一特定硬件平台运行而产生的,在编译过程中,编译程序通过查表将所有符号的引用转换为特定的内存偏移量。
目标代码只能在特定的CPU 上运行。
而Java编译器为了保证目标代码的可移植性,并不将对变量和方法的引用编译为数值引用,也不确定程序执行过程中的内存布局,而是将这些符号引用信息保留在字节码中,由Java虚拟机在运行过程中创立内存布局,然后再通过查表来确定一个方法所在的地址。
由于其相对简单的Java 虚拟机(与真实的微处理器相比)和规范的字节码格式,由Java字节码(Bytecode)反编译成源代码的过程相对于C语言来说要简单许多,因此,当前反编译Java程序颇为盛行。
在介绍Java反编译器之前,要提及JDK自带的一个工具javap,它是一个Java 代码反汇编器。
反汇编器和反编译器是不同的,使用javap反汇编的Java类文件可得到数据区定义、方法和类的引用等信息。
例如,下面是对HelloWorld.class反汇编后的部分信息:C:\JExamples>javap -c HelloWorldCompiled from "helloworld.java"public class HelloWorld extends ng.Object{public HelloWorld();Code:0: aload_01: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return…由此可见在Java字节码中蕴藏了大量的信息。
Java反编译器就是利用类文件中的潜在信息和语言规范等猜测出源代码的。
没有一个反编译器能够保证准确无误地翻译出源代码,而且每个反编译器自身也存在各种不同的漏洞。
但是我们不可轻视反编译器的威力,它还是能比较准确地翻译出部分甚至全部的源代码。
下面是一个具体的例子(图1所示),利用Java反编译器Jode(Jode的下载位置:/download.html)成功地反编译了HelloWorld.class:图1 Jode反编译HelloWorld.class反编译对安全构成的威胁是显而易见的,因此源码保护也就必不可少。
其实,反编译和代码保护是一场无休止的斗争,双方都在争斗中得以发展。
目前保护源码的方法大致可以归为三类:加密、模糊和定制Java的类装载器。
所谓加密,就是在Java应用程序分发之前,使用加密工具进行加密。
流行的加密工具有PGP(Pretty Good Privacy)和GPG(Gnu Privacy Guard)等。
但最终用户在运行应用之前必须先进行解密,解密之后最终用户就有了一份不加密的类文件,所以加密只能对软件分发的中间环节进行有效保护,其实际效用大大减弱。
二、模糊技术模糊技术(Obfuscator)就是对源代码进行模糊化处理的行为。
经过模糊处理后的代码,将失去了一此可读性,程序员很难识别代码的用意。
举例来说,有如下的源代码:public class HillSort {public static String[] sort(String[] stringArray) {String tmp;boolean exchange;for (int i = 0; i < stringArray.length - 1; i++) {exchange = false;for (int j = stringArray.length - 2; j >= i; j--) {if (stringArray[j + 1].compareTo(stringArray[j]) < 0) {tmp = stringArray[j + 1];stringArray[j + 1] = stringArray[j];stringArray[j] = tmp;exchange = true;}}if (!exchange) { break; }}return stringArray;}…}利用模糊处理器Smokescreen (Smokescreen是一个Java模糊器软件,其下载位置:/smokescreen/licensedownload.html,对HillSort.class进行模糊处理得到A.class,然后,再利用Jode对A.class 反编译,得到的源代码如下:public class A{public static String[] A(String[] strings) {int i = 0;GOTO flow_2_32_flow_2_32_:int i;IF (i >= strings.length - 1)GOTO flow_72_33_String[] strings_0_ = strings;boolean bool = false;int i_1_ = strings_0_.length - 2;for (;;) {IF (i_1_ < i)GOTO flow_75_34_if (strings[i_1_ + 1].compareTo(strings[i_1_]) < 0) { boolean bool_2_ = true;String string = strings[i_1_ + 1];strings[i_1_ + 1] = strings[i_1_];strings[i_1_] = string;bool = bool_2_;}i_1_--;}flow_70_35_:String[] strings_3_ = null;GOTO flow_71_36_…}…static {…}}模糊处理器把可读的有意义的变量名、方法名,有时甚至是类名、包名转换成没有意义的字符串,让人难以阅读程序,但对于 JVM 来说,其在本质上和原来的程序是一样的。
在上例中类名HillSort变为A,方法名sort变为A,变量名stringArray变为strings,我们已经不可能简单地从这些名称了解这段代码的功能。
有的模糊处理器更进一步,甚至采用非法的字符串来替代类文件中的标记,有意地违反了Java的规范。
这些古怪的用法也可能造成Java虚拟机不能作出合法的反应(尤其在浏览器中)。
例如,一个像“=”这样的变量与 Java 的规范是相反的;一些虚拟机可以忽略它,而另一些不可以这样。
模糊处理器除了对符号名进行转换,还可能修改字节码值指令,以模糊方法中的指令控制流,使得反编译的工作更难。
上例中就被加入大量的GOTO语句。
模糊处理器还会在字节码中添加一些俗称“炸弹”的代码,反编译器如果不能忽略或告警,常常可能导致自身崩溃。
例如一些模糊处理器会在return语句后面插入无意义的代码,确保Java虚拟机不会被执行它,反编译器却可能没有识别这个障碍。
模糊处理器也有一些不足之处,main方法不会被模糊处理,这是既定的类入口函数,否则Java虚拟机无法运行该类,本地方法不会被模糊处理。
另外,调用Class.forName()时指定的类名字符串,不会被模糊处理,模糊处理会提供模糊转换前后的名称映射表,手工修改此处的类名字符串为转换后的名称,即可解决该问题。
反编译和模糊处理的技术都在发展,越来越复杂。
这方面的工具也越来越多,大多既支持命令行,也支持图形界面。
三、类装载器在介绍如何定制类装载器(ClassLoader)前,先要了解Java的运行机制。
Java应用程序启动时,在运行指定类的main方法前,虚拟机首先要装载该类的字节码,然后还要执行链接和初始化的准备工作。
例如运行HelloWorld时,Java虚拟机试图执行类HelloWorld的main方法,但发现该类并没有被装载,于是虚拟机使用 ClassLoader寻找并装载HelloWorld的字节码。
如果这个装载过程失败,则抛出一个异常;如果HelloWorld被成功装载,HelloWorld的main方法才会进一步被调用。
Java运行时装入字节码的机制意味着可以对字节码和装载过程进行修改。
一个称为ClassLoader的对象负责为JVM装载类的字节码。
JVM给ClassLoader 一个待装入类的名字(比如HelloWorld),然后由 ClassLoader负责找到类文件,装入原始数据,并把它转换成一个Class对象。
我们可以对类文件进行加密,当其通过定制ClassLoader装载时再进行解密,解密后的字节码保存在内存中,这样窃密者很难得到解密后的代码。
定制ClassLoader既要完成原来所承担的工作,又要完成即时解密的任务。
类装载器实现的核心代码如下:import java.io.*;import java.security.*;import ng.reflect.*;import javax.crypto.*;import javax.crypto.spec.*;public class XClassLoader extends ClassLoader {private final String CRYPT_ALGORITHM = "DES";private Cipher cipher = null;public XClassLoader(String keyFile)throws IOException, GeneralSecurityException {byte keyData[] = Util.readFile(keyFile);SecretKeyFactory keyFactory =SecretKeyFactory.getInstance(CRYPT_ALGORITHM);SecretKey secretKey =keyFactory.generateSecret(new DESKeySpec(keyData));cipher = Cipher.getInstance(CRYPT_ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, secretKey, new SecureRandom());}public Class loadClass(String name, boolean resolve) throws ClassNotFoundException {Class clasz = null;// 检查类是否已被装载if (null != (clasz = findLoadedClass(name))) {return clasz;}// 定制装载处理try {// 读取加密的类文件byte encodedClass[] = Util.readFile(name + ".class");if (null != encodedClass && null != cipher) {// 解密byte decodedClass[] = cipher.doFinal(encodedClass);// 创建类实例if (decodedClass != null) {clasz = defineClass(name, decodedClass, 0, decodedClass.length);}}} catch (Exception e) { }// 如果上面没有成功,用默认的ClassLoader装入它if (clasz == null) {clasz = findSystemClass(name);}// 装入相关的类if (resolve && clasz != null) {resolveClass(clasz);}if (clasz == null) {throw new ClassNotFoundException();}return clasz;}static public void main(String args[]) throws Exception { if (args.length < 2) {System.out.println("Usage: java XClassLoader keyFile Application [args0] [args1] ...");return;}String keyFile = args[0]; //密匙文件String appName = args[1]; //应用实例类名String appArgs[] = null; //应用实例的命令行参数if (args.length > 2) {appArgs = new String[args.length - 2];System.arraycopy(args, 2, appArgs, 0, args.length - 2);}// 创建解密的ClassLoaderXClassLoader xClassLoader = new XClassLoader(keyFile);// 装载应用实例的字节码,并创建一个类实例Class appClass = xClassLoader.loadClass(appName);// 通过Reflection API,获取应用实例的main()方法引用Method main = appClass.getMethod("main", new Class[]{ (new String[1]).getClass() } );// 调用main()main.invoke( null, new Object[] {appArgs});}}public class Util{// 把文件读入byte数组static public byte[] readFile( String filename )throws IOException {File file = new File( filename );byte data[] = new byte[(int)file.length()];FileInputStream fin = new FileInputStream( file );int r = fin.read( data );if (r != data.length)throw new IOException( "Not complete reading file: " + file ); fin.close();return data;}// 把byte数组写出到文件static public void writeFile( String filename, byte data[] )throws IOException {FileOutputStream fout = new FileOutputStream( filename );fout.write( data );fout.close();}}类加密器实现的核心代码如下:import java.io.*;import java.security.*;import javax.crypto.*;public class XClassEncode {static private final String CRYPT_ALGORITHM = "DES";static public String keyFile = "key.data";// 生成密匙,并把密匙保存到文件static private SecretKey generateKey()throws IOException, GeneralSecurityException {KeyGenerator kg = KeyGenerator.getInstance( CRYPT_ALGORITHM ); kg.init( new SecureRandom() );SecretKey key = kg.generateKey();Util.writeFile( keyFile, key.getEncoded());return key;}static public void main(String args[]) throws Exception {if(args.length < 1 ) {System.out.println("Usage: java XClassEncode [class1] [clsss2] ...");System.out.println("Output: key.data class1 clsss2 ...");return;}// 生成密匙SecretKey key = generateKey();Cipher ecipher = Cipher.getInstance( CRYPT_ALGORITHM );ecipher.init( Cipher.ENCRYPT_MODE, key, new SecureRandom() );// 加密命令行中指定的每一个class文件for (int i=0; i<args.length; ++i) {System.out.println( "encode file: "+ args[i]);// 读入类文件byte classData[] = Util.readFile( args[i] );// 加密byte encodedClassData[] = ecipher.doFinal( classData );Util.writeFile( args[i], encodedClassData );}}}运行示例如下:C:\XClassLoader>javac XClassEncode.java XClassLoader.java Util.javaC:\XClassLoader>javac HelloWorld.javaC:\XClassLoader>java HelloWorldHello World!C:\XClassLoader>java XClassEncode HelloWorld.classencode file: HelloWorld.classC:\XClassLoader>java HelloWorldException in thread "main" ng.ClassFormatError:…C:\XClassLoader>java XClassLoader key.data HelloWorldHello World!。