读书人

Jocky搅混JAVA代码(保护你的JAVA项目

发布时间: 2012-07-18 12:05:40 作者: rapoo

Jocky混淆JAVA代码(保护你的JAVA项目)

Jocky混淆JAVA代码(保护你的JAVA项目)public?class?SimpleBean?implements?Serializable?{
?2Jocky搅混JAVA代码(保护你的JAVA项目)??
?3Jocky搅混JAVA代码(保护你的JAVA项目)??private?String?name?=?"myname";
?4Jocky搅混JAVA代码(保护你的JAVA项目)??
?5Jocky搅混JAVA代码(保护你的JAVA项目)??private?List?myList?=?null;
?6Jocky搅混JAVA代码(保护你的JAVA项目)??
?7Jocky搅混JAVA代码(保护你的JAVA项目)??public?void?SimpleBean()?{
?8Jocky搅混JAVA代码(保护你的JAVA项目)????myList?=?new?ArrayList(10);
?9Jocky搅混JAVA代码(保护你的JAVA项目)??}
10Jocky搅混JAVA代码(保护你的JAVA项目)
11Jocky搅混JAVA代码(保护你的JAVA项目)??public?void?foo1()?{
12Jocky搅混JAVA代码(保护你的JAVA项目)????myList.add("name");
13Jocky搅混JAVA代码(保护你的JAVA项目)??}
14Jocky搅混JAVA代码(保护你的JAVA项目)??
15Jocky搅混JAVA代码(保护你的JAVA项目)??private?void?foo2()?{????
16Jocky搅混JAVA代码(保护你的JAVA项目)??}
17Jocky搅混JAVA代码(保护你的JAVA项目)??
18Jocky搅混JAVA代码(保护你的JAVA项目)??private?void?writeObject(java.io.ObjectOutputStream?out)
19Jocky搅混JAVA代码(保护你的JAVA项目)??????throws?IOException?{
20Jocky搅混JAVA代码(保护你的JAVA项目)????
21Jocky搅混JAVA代码(保护你的JAVA项目)??}
22Jocky搅混JAVA代码(保护你的JAVA项目)
23Jocky搅混JAVA代码(保护你的JAVA项目)}?<未混淆的类文件反编译后的效果>


???下面是经Jocky混淆过的类文件,通过Jad反编译后产生的源文件:

public?class?SimpleBean?implements?Serializable?{
?2Jocky搅混JAVA代码(保护你的JAVA项目)
?3Jocky搅混JAVA代码(保护你的JAVA项目)??private?String?_$2;
?4Jocky搅混JAVA代码(保护你的JAVA项目)
?5Jocky搅混JAVA代码(保护你的JAVA项目)??private?List?_$1;
?6Jocky搅混JAVA代码(保护你的JAVA项目)
?7Jocky搅混JAVA代码(保护你的JAVA项目)??public?SimpleBean()?????{
?8Jocky搅混JAVA代码(保护你的JAVA项目)????????_$2?=?"myname";
?9Jocky搅混JAVA代码(保护你的JAVA项目)????????this;
10Jocky搅混JAVA代码(保护你的JAVA项目)????????JVM?INSTR?new?#4???<Class?ArrayList>;
11Jocky搅混JAVA代码(保护你的JAVA项目)????????JVM?INSTR?dup?;
12Jocky搅混JAVA代码(保护你的JAVA项目)????????JVM?INSTR?swap?;
13Jocky搅混JAVA代码(保护你的JAVA项目)????????10;
14Jocky搅混JAVA代码(保护你的JAVA项目)????????ArrayList();
15Jocky搅混JAVA代码(保护你的JAVA项目)????????_$1;
16Jocky搅混JAVA代码(保护你的JAVA项目)????}??
17Jocky搅混JAVA代码(保护你的JAVA项目)??public?void?foo1()?{
18Jocky搅混JAVA代码(保护你的JAVA项目)????_$1.add("name");
19Jocky搅混JAVA代码(保护你的JAVA项目)??}
20Jocky搅混JAVA代码(保护你的JAVA项目)
21Jocky搅混JAVA代码(保护你的JAVA项目)??private?void?_$1()?{
22Jocky搅混JAVA代码(保护你的JAVA项目)??}
23Jocky搅混JAVA代码(保护你的JAVA项目)
24Jocky搅混JAVA代码(保护你的JAVA项目)??private?void?writeObject(ObjectOutputStream?objectoutputstream){
25Jocky搅混JAVA代码(保护你的JAVA项目)??????throws?IOException?{
26Jocky搅混JAVA代码(保护你的JAVA项目)??}
27Jocky搅混JAVA代码(保护你的JAVA项目)}?<Jocky混淆过的类文件反编译的效果>

?

1.4.2 支持将JDK 5.0的语法编译成能够在JDK 1.4上运行的类文件

???JDK 5.0在语法层面上有许多新增特色,能够为简化应用的开发带来一些便利。譬如Generics、Enhanced for Loop以及 Autoboxing/Unboxing等。但另人遗憾的是,倘若利用这些新的语法开发应用,就意味着不能够在JDK 1.4上运行,而JDK 1.4毕竟是目前最为普及的VM版本。幸运是,Jocky的另一个特色就是:通过参数配置,能够把用JDK 5.0语法编写的应用编译成JDK 1.4上的类文件版本。我们可以把经过 Jocky编译的类文件以UltraEdit打开,可以发现在第8个字节上(类文件的major version)的数值是0x30,即十进制的48,这是JDK 1.4所能够理解的类文件版本(JDK 5.0默认编译的类文件版本是49)。前提是:应用中不能够使用JDK 1.4中所没有的一些API。

二、Jocky的用法

2.1 常规用法

???使用Jocky非常简单,获得jocky.jar以后,只需要运行java -jar jocky.jar就可以启动Jocky混淆编译器,jocky的命令行参数和javac完全相同,但增加了一个新的参数-scramble,它的用法如下:

Jocky搅混JAVA代码(保护你的JAVA项目)-scramble??????????混淆所有package?private或private符号Jocky搅混JAVA代码(保护你的JAVA项目)-scrambleall???????混淆所有符号Jocky搅混JAVA代码(保护你的JAVA项目)-scramble:<level>??混淆相应级别的符号Jocky搅混JAVA代码(保护你的JAVA项目)其中<level>指定混淆级别,可以是以下几种级别:Jocky搅混JAVA代码(保护你的JAVA项目)-scramble:none????????不进行混淆Jocky搅混JAVA代码(保护你的JAVA项目)-scramble:private?????对所有private访问级别的元素进行混淆Jocky搅混JAVA代码(保护你的JAVA项目)-scramble:package?????对所有private或package?private元素进行混淆Jocky搅混JAVA代码(保护你的JAVA项目)-scramble:protected???对所有private,?package?private,?protected元素进行混淆Jocky搅混JAVA代码(保护你的JAVA项目)-scramble:public??????对所有的元素都进行混淆Jocky搅混JAVA代码(保护你的JAVA项目)-scramble:all?????????相当于-scramble:publicJocky搅混JAVA代码(保护你的JAVA项目)如果使用-scramble不带级别参数,则相当于-scramble:packageJocky搅混JAVA代码(保护你的JAVA项目)

2.2 Jocky for Ant

????近年来,Ant已经成为Java应用开发中打包工具的事实上的标准。在应用的开发过程中,我们往往都会有一个Ant脚本,通过该脚本,能够对应用进行编译、打包、发布等一系列过程。因此,Jocky的最佳切入点便是对Ant的支持。
????在Ant中使用Jocky非常简单:

????1. 将lib\jocky-ant.jar copy至ANT_HOME\lib目录下。

????2. 在ant脚本中加入这样一行代码,以引入Jocky Task

?????<taskdef?resource="jockytasks/">?


????3. 设置Jocky的一些基本属性,包括: jocky.jar包的位置,以及混淆级别,如下所示:

???<jocky?jar="?F:\Works2\Jocky\jocky1.0\lib\jocky.jar"?enable="true"?level="private/">?


????4. 当设置jocky的enable属性为true时,此时,Ant脚本中的javac编译命令,便会被自动替换成Jocky编译器;当设置enable属性为false时,javac编译命令将恢复成正常设置,示例脚本如下:

<project?name="jocky"?default="build">?
?2Jocky搅混JAVA代码(保护你的JAVA项目)<!--?引入Jocky?Ant?Task,要确保jocky-ant.jar位于ANT_HOME\lib目录下?-->
?3Jocky搅混JAVA代码(保护你的JAVA项目)<taskdef?resource="jockytasks">?</taskdef>
?4Jocky搅混JAVA代码(保护你的JAVA项目)<target?name="build">?
?5Jocky搅混JAVA代码(保护你的JAVA项目)<!--?设置jocky.jar的位置以及混淆级别,当enable为true时,javac?task将被自动替换成Jocky混淆编译器?-->
?6Jocky搅混JAVA代码(保护你的JAVA项目)<jocky?jar="?F:\Works2\Jocky\jocky1.0\lib\jocky.jar"?enable="?true"?level="?private">?</jocky>?
?7Jocky搅混JAVA代码(保护你的JAVA项目)<!--?下面的编译,将使用Jocky混淆编译器?-->
?8Jocky搅混JAVA代码(保护你的JAVA项目)<javac?destdir="bin2"?debug="on"?source="1.5"?target="1.4">?
?9Jocky搅混JAVA代码(保护你的JAVA项目)<src?path="src"></src>
10Jocky搅混JAVA代码(保护你的JAVA项目)</javac>
11Jocky搅混JAVA代码(保护你的JAVA项目)<!--?当enable为false时,javac?task将被恢复成正常设置,?Jocky编译器不再起作用?-->
12Jocky搅混JAVA代码(保护你的JAVA项目)<jocky?enable="false"></jocky>
13Jocky搅混JAVA代码(保护你的JAVA项目)<!--?下面的编译,将使用正常的Javac编译器?-->
14Jocky搅混JAVA代码(保护你的JAVA项目)<javac?destdir="bin3"?debug="on"?target="1.4">?
15Jocky搅混JAVA代码(保护你的JAVA项目)<src?path="src"></src>
16Jocky搅混JAVA代码(保护你的JAVA项目)</javac>
17Jocky搅混JAVA代码(保护你的JAVA项目)</target>
18Jocky搅混JAVA代码(保护你的JAVA项目)</project><Jocky的Ant脚本示例>


<Jocky在Eclipse中的右键菜单>


<Jocky在Eclipse中的属性设置>



????事实上,在Eclipse中使用Jocky时,Jocky也是首先针对所选工程生成Ant的Build文件(默认名称jocky_build.xml),然后再通过Ant完成混淆编译。?

????以下是Jocky在Eclipse中自动生成的Ant Build 文件示例:

<project?basedir="."?default="build"?name="jocky.example.jocky">?
?2Jocky搅混JAVA代码(保护你的JAVA项目)<property?name="jocky.jar"?value="f:\EclipseWTP1.0.8\workspace_jdk5_apusicstudio\org.apusic.jocky\jocky.jar"></property>
?3Jocky搅混JAVA代码(保护你的JAVA项目)<property?name="jocky.output.dir"?value="jocky"></property>
?4Jocky搅混JAVA代码(保护你的JAVA项目)<property?name="jocky.scramble.level"?value="package"></property>
?5Jocky搅混JAVA代码(保护你的JAVA项目)<property?name="target"?value="1.4"></property>
?6Jocky搅混JAVA代码(保护你的JAVA项目)<path?id="project.classpath">?
?7Jocky搅混JAVA代码(保护你的JAVA项目)<pathelement?location="bin"></pathelement>
?8Jocky搅混JAVA代码(保护你的JAVA项目)</path>
?9Jocky搅混JAVA代码(保护你的JAVA项目)<target?name="init">?
10Jocky搅混JAVA代码(保护你的JAVA项目)<jocky?jar="${jocky.jar}"?level="${jocky.scramble.level}"></jocky>
11Jocky搅混JAVA代码(保护你的JAVA项目)<mkdir?dir="${jocky.output.dir}"></mkdir>
12Jocky搅混JAVA代码(保护你的JAVA项目)<mkdir?dir="${jocky.output.dir}/bin"></mkdir>
13Jocky搅混JAVA代码(保护你的JAVA项目)</target>
14Jocky搅混JAVA代码(保护你的JAVA项目)<target?name="clean">?
15Jocky搅混JAVA代码(保护你的JAVA项目)<delete?dir="${jocky.output.dir}/bin"></delete>
16Jocky搅混JAVA代码(保护你的JAVA项目)<delete?dir="${jocky.output.dir}"></delete>
17Jocky搅混JAVA代码(保护你的JAVA项目)</target>
18Jocky搅混JAVA代码(保护你的JAVA项目)<target?depends="init"?name="build">?
19Jocky搅混JAVA代码(保护你的JAVA项目)<echo?message="${ant.project.name}:?${ant.file}"></echo>
20Jocky搅混JAVA代码(保护你的JAVA项目)<jocky?enable="true"></jocky>
21Jocky搅混JAVA代码(保护你的JAVA项目)<javac?destdir="${jocky.output.dir}/bin"?target="${target}">?
22Jocky搅混JAVA代码(保护你的JAVA项目)<src?path="src"></src>
23Jocky搅混JAVA代码(保护你的JAVA项目)<classpath?refid="project.classpath"></classpath>
24Jocky搅混JAVA代码(保护你的JAVA项目)</javac>
25Jocky搅混JAVA代码(保护你的JAVA项目)</target>
26Jocky搅混JAVA代码(保护你的JAVA项目)</project><Jocky在Eclipse中自动生成的Ant脚本示例>


/**
?2Jocky搅混JAVA代码(保护你的JAVA项目)?*?This?class?should?preserve.
?3Jocky搅混JAVA代码(保护你的JAVA项目)?*?@preserve
?4Jocky搅混JAVA代码(保护你的JAVA项目)?*/
?5Jocky搅混JAVA代码(保护你的JAVA项目)public?class?Foo?{
?6Jocky搅混JAVA代码(保护你的JAVA项目)????/**
?7Jocky搅混JAVA代码(保护你的JAVA项目)?????*?You?can?specify?which?field?should?be?preserved.
?8Jocky搅混JAVA代码(保护你的JAVA项目)?????*?@preserve
?9Jocky搅混JAVA代码(保护你的JAVA项目)?????*/
10Jocky搅混JAVA代码(保护你的JAVA项目)????private?int?x;
11Jocky搅混JAVA代码(保护你的JAVA项目)
12Jocky搅混JAVA代码(保护你的JAVA项目)????/**
13Jocky搅混JAVA代码(保护你的JAVA项目)?????*?This?field?is?not?preserved.
14Jocky搅混JAVA代码(保护你的JAVA项目)?????*/
15Jocky搅混JAVA代码(保护你的JAVA项目)????private?int?y;
16Jocky搅混JAVA代码(保护你的JAVA项目)
17Jocky搅混JAVA代码(保护你的JAVA项目)????/**
18Jocky搅混JAVA代码(保护你的JAVA项目)?????*?You?can?also?preserve?methods.
19Jocky搅混JAVA代码(保护你的JAVA项目)?????*?@preserve
20Jocky搅混JAVA代码(保护你的JAVA项目)?????*/
21Jocky搅混JAVA代码(保护你的JAVA项目)????public?void?hello()?{}
22Jocky搅混JAVA代码(保护你的JAVA项目)
23Jocky搅混JAVA代码(保护你的JAVA项目)????/**
24Jocky搅混JAVA代码(保护你的JAVA项目)?????*?This?method?is?not?preserved.
25Jocky搅混JAVA代码(保护你的JAVA项目)?????*/
26Jocky搅混JAVA代码(保护你的JAVA项目)????private?void?collect()?{}
27Jocky搅混JAVA代码(保护你的JAVA项目)}?<使用preserved指令的示例>


???如果没有@preserve指令,则根据混淆级别及成员的访问级别来确定符号是否保留。
???对于类的符号保留指令可以附带一个保留级别参数,来控制类成员的符号保留,包括:

Jocky搅混JAVA代码(保护你的JAVA项目)@preserve????????????仅对类名进行保留,类成员的保留根据-scramble命令行参数决定Jocky搅混JAVA代码(保护你的JAVA项目)@preserve?public?????保留所有public成员Jocky搅混JAVA代码(保护你的JAVA项目)@preserve?protected??保留所有public和protected成员Jocky搅混JAVA代码(保护你的JAVA项目)@preserve?package????保留所有public,?protected,?package?private成员Jocky搅混JAVA代码(保护你的JAVA项目)@preserve?private????保留所有成员Jocky搅混JAVA代码(保护你的JAVA项目)@preserve?all????????相当于@preserve?privateJocky搅混JAVA代码(保护你的JAVA项目)

???事实上,即便不加@preserve指令,Jocky对Java语言特有的一些private级别的方法不进行混淆,譬如,在序列化时有特殊作用的writeObject及readObject方法等。但笔者强烈建议: 针对这些有特殊含义不能够被混淆的 private级别的方法或者字段,请以@preserve指令予以保护。

注1:建议通过IDE的JavaDoc设置,来辅助@preserve指令的书写。

三、Jocky的限制

???正如前文所说,Jocky是基于源代码的混淆编译器,因此,Jocky不支持分别编译,必须对所有的源文件同时进行混淆编译。但事实上,倘若混淆级别控制在private级别上,该限制便不复存在。

读书人网 >开源软件

热点推荐