java jocky 下载_java代码混淆工具jocky的使用 | 学步园

大家常见的java代码混淆工具应该是Progaurd,它通过修改掉class文件中的变量名、方法名、类名的方式使反编译出来的代码可读性降低来起到保护作者知识产权的作用。但是Progaurd只能对class文件进行混淆,也就是必须先把java源码编译为class文件,然后再进行混淆,此时混淆的效果是不太令人满意的,反编译之后还是很容易整理成具有可读性的代码的。

今天给大家介绍的jockey跟其他混淆工具不同的是:它是直接对编译过程做文章,也就是在把java文件编译为class文件的过程中对代码进行混淆,混淆后的代码中包含很多JVM

指令,大家知道JVM指令是面向机器的,人类一般很难看懂!。

Jocky是金蝶中间件技术领袖袁红岗先生的个人作品(旧有名称JOC)。原本是方便Apusic 应用服务器的开发,现在开放出来,供大家自由使用 ... Jocky提供了对IDE Eclipse的支持,同时,也支持在Ant中使用(事实上,在Eclipse中,也是先生成一个ant文件,然后再编译).

是挺好用, 编译后的代码大部分反编译出来只有 JVM 指令! 的确是保护系统核心的利器! 支持 JDK 1.5. 可是 Jocky 竟然不开源... 领袖啊!

以下是官方IDE(Apusic IDE)中的详细说明:

Jocky

Java Obfuscate Compiler Kit for You

一、前言

我们知道,Java是一种跨平台的于是就出现了Java混淆编译器,它的作用是打乱class文件中的符号信息,从而使反向工程变得非常困难。Jocky就是这样一款优秀的Java混淆编译器。

目前业界有不少商业的甚或是开源的混淆编译器,但它们普遍存在一些这样或者那样的问题。一般而言,现有的混淆器都是对编译好的 class文件进行混淆,这样就需要编译和混淆两个步骤。而事实上,并不是所有的符号都需要混淆。如果你开发的是一个类库,或者某些类需要动态装载,那些公共API(或者说:那些被publish出来的API)就必须保留符号不变,只有这样,别人才能使用你的类库。现有的混淆器提供了GUI或脚本的方式来对那些需要保留的符号名称进行配置,但如果程序较大时,配置工作将变得很复杂,而程序一旦修改,配置工作又要重新进行。某些混淆器能够调整字节码的顺序,使反编译更加困难,但笔者经历过混淆之后的程序运行出错的情况。而Jocky与其它混淆编译器最大的不同之处在于:它是直接从源码上做文章,也就是说编译过程本身就是一个混淆过程。

Jocky混淆编译器是在Sun JDK中提供的Java编译器(javac)的基础上完成的,修改了其中的代码生成过程,对编译器生成的中间代码进行混淆,最后再生成class文件,这样编译和混淆只需要一个步骤就可以完成。另外可以在源程序中插入符号保留指令来控制哪些符号需要保留,将混淆过程与开发过程融合在一起,不需要单独的配置。

如前文所述,混淆编译是Jocky的首要用途。我们举一个最简单的例子,下面的SimpleBean是未经混淆的class文件通过Jad反编译以后获得的源文件:1

1fa987a29c6482f53d401256f96355eb.pngpublic class SimpleBean implements Serializable {

2

d18c02628675d0a2c816449d98bda930.png  

3

d18c02628675d0a2c816449d98bda930.png  private String name = "myname";

4

d18c02628675d0a2c816449d98bda930.png  

5

d18c02628675d0a2c816449d98bda930.png  private List myList = null;

6

d18c02628675d0a2c816449d98bda930.png  

7

97e794c86028c5f5b5461ae5ef440a4c.png  public void SimpleBean() {

8

d18c02628675d0a2c816449d98bda930.png    myList = new ArrayList(10);

9

ecedf933ec37d714bd4c2545da43add2.png  }

10

d18c02628675d0a2c816449d98bda930.png

11

97e794c86028c5f5b5461ae5ef440a4c.png  public void foo1() {

12

d18c02628675d0a2c816449d98bda930.png    myList.add("name");

13

ecedf933ec37d714bd4c2545da43add2.png  }

14

d18c02628675d0a2c816449d98bda930.png  

15

97e794c86028c5f5b5461ae5ef440a4c.png  private void foo2() {    

16

ecedf933ec37d714bd4c2545da43add2.png  }

17

d18c02628675d0a2c816449d98bda930.png  

18

d18c02628675d0a2c816449d98bda930.png  private void writeObject(java.io.ObjectOutputStream out)

19

97e794c86028c5f5b5461ae5ef440a4c.png      throws IOException {

20

d18c02628675d0a2c816449d98bda930.png    

21

ecedf933ec37d714bd4c2545da43add2.png  }

22

d18c02628675d0a2c816449d98bda930.png

23

8f1ba5b45633e9678d1db480c16cae3f.png}

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

1fa987a29c6482f53d401256f96355eb.pngpublic class SimpleBean implements Serializable {

2

d18c02628675d0a2c816449d98bda930.png

3

d18c02628675d0a2c816449d98bda930.png  private String _$2;

4

d18c02628675d0a2c816449d98bda930.png

5

d18c02628675d0a2c816449d98bda930.png  private List _$1;

6

d18c02628675d0a2c816449d98bda930.png

7

97e794c86028c5f5b5461ae5ef440a4c.png  public SimpleBean()     {

8

d18c02628675d0a2c816449d98bda930.png        _$2 = "myname";

9

d18c02628675d0a2c816449d98bda930.png        this;

10

d18c02628675d0a2c816449d98bda930.png        JVM INSTR new #4   ;

11

d18c02628675d0a2c816449d98bda930.png        JVM INSTR dup ;

12

d18c02628675d0a2c816449d98bda930.png        JVM INSTR swap ;

13

d18c02628675d0a2c816449d98bda930.png        10;

14

d18c02628675d0a2c816449d98bda930.png        ArrayList();

15

d18c02628675d0a2c816449d98bda930.png        _$1;

16

ecedf933ec37d714bd4c2545da43add2.png    }  

17

97e794c86028c5f5b5461ae5ef440a4c.png  public void foo1() {

18

d18c02628675d0a2c816449d98bda930.png    _$1.add("name");

19

ecedf933ec37d714bd4c2545da43add2.png  }

20

d18c02628675d0a2c816449d98bda930.png

21

97e794c86028c5f5b5461ae5ef440a4c.png  private void _$1() {

22

ecedf933ec37d714bd4c2545da43add2.png  }

23

d18c02628675d0a2c816449d98bda930.png

24

97e794c86028c5f5b5461ae5ef440a4c.png  private void writeObject(ObjectOutputStream objectoutputstream){

25

97e794c86028c5f5b5461ae5ef440a4c.png      throws IOException {

26

ecedf933ec37d714bd4c2545da43add2.png  }

27

ecedf933ec37d714bd4c2545da43add2.png}

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

4f1150b881333f12a311ae9ef34da474.png-scramble          混淆所有package private或private符号

4f1150b881333f12a311ae9ef34da474.png-scrambleall       混淆所有符号

4f1150b881333f12a311ae9ef34da474.png-scramble:混淆相应级别的符号

4f1150b881333f12a311ae9ef34da474.png其中指定混淆级别,可以是以下几种级别:

4f1150b881333f12a311ae9ef34da474.png-scramble:none        不进行混淆

4f1150b881333f12a311ae9ef34da474.png-scramble:private     对所有private访问级别的元素进行混淆

4f1150b881333f12a311ae9ef34da474.png-scramble:package     对所有private或package private元素进行混淆

4f1150b881333f12a311ae9ef34da474.png-scramble:protected   对所有private, package private, protected元素进行混淆

4f1150b881333f12a311ae9ef34da474.png-scramble:public      对所有的元素都进行混淆

4f1150b881333f12a311ae9ef34da474.png-scramble:all         相当于-scramble:public

4f1150b881333f12a311ae9ef34da474.png如果使用-scramble不带级别参数,则相当于-scramble:package

4f1150b881333f12a311ae9ef34da474.png

近年来,Ant已经成为Java应用开发中打包工具的事实上的标准。在应用的开发过程中,我们往往都会有一个Ant脚本,通过该脚本,能够对应用进行编译、打包、发布等一系列过程。因此,Jocky的最佳切入点便是对Ant的支持。在Ant中使用Jocky非常简单:1. 将lib\jocky-ant.jar copy至ANT_HOME\lib目录下。2. 在ant脚本中加入这样一行代码,以引入Jocky Task

4f1150b881333f12a311ae9ef34da474.png

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

4f1150b881333f12a311ae9ef34da474.png

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

4f1150b881333f12a311ae9ef34da474.png 

2

4f1150b881333f12a311ae9ef34da474.png

3

4f1150b881333f12a311ae9ef34da474.png 

4

4f1150b881333f12a311ae9ef34da474.png 

5

4f1150b881333f12a311ae9ef34da474.png

6

4f1150b881333f12a311ae9ef34da474.png  

7

4f1150b881333f12a311ae9ef34da474.png

8

4f1150b881333f12a311ae9ef34da474.png 

9

4f1150b881333f12a311ae9ef34da474.png

10

4f1150b881333f12a311ae9ef34da474.png

11

4f1150b881333f12a311ae9ef34da474.png

12

4f1150b881333f12a311ae9ef34da474.png

13

4f1150b881333f12a311ae9ef34da474.png

14

4f1150b881333f12a311ae9ef34da474.png 

15

4f1150b881333f12a311ae9ef34da474.png

16

4f1150b881333f12a311ae9ef34da474.png

17

4f1150b881333f12a311ae9ef34da474.png

18

4f1150b881333f12a311ae9ef34da474.png

注意: Jocky for Ant在Ant 1.6.5上开发,推荐使用该版本。

2. 在Eclipse中使用Jocky:

在Eclipse中使用Jocky也非常简单,任何一个Java工程,选中工程通过右键菜单,都可以出现Jocky的快捷菜单:

7cde786de53302985909d65ee77b9417.png

e4acc0115d593f68e1a604fcfda16c2d.png

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

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

1

4f1150b881333f12a311ae9ef34da474.png 

2

4f1150b881333f12a311ae9ef34da474.png

3

4f1150b881333f12a311ae9ef34da474.png

4

4f1150b881333f12a311ae9ef34da474.png

5

4f1150b881333f12a311ae9ef34da474.png

6

4f1150b881333f12a311ae9ef34da474.png 

7

4f1150b881333f12a311ae9ef34da474.png

8

4f1150b881333f12a311ae9ef34da474.png

9

4f1150b881333f12a311ae9ef34da474.png 

10

4f1150b881333f12a311ae9ef34da474.png

11

4f1150b881333f12a311ae9ef34da474.png

12

4f1150b881333f12a311ae9ef34da474.png

13

4f1150b881333f12a311ae9ef34da474.png

14

4f1150b881333f12a311ae9ef34da474.png 

15

4f1150b881333f12a311ae9ef34da474.png

16

4f1150b881333f12a311ae9ef34da474.png

17

4f1150b881333f12a311ae9ef34da474.png

18

4f1150b881333f12a311ae9ef34da474.png 

19

4f1150b881333f12a311ae9ef34da474.png

20

4f1150b881333f12a311ae9ef34da474.png

21

4f1150b881333f12a311ae9ef34da474.png 

22

4f1150b881333f12a311ae9ef34da474.png

23

4f1150b881333f12a311ae9ef34da474.png

24

4f1150b881333f12a311ae9ef34da474.png

25

4f1150b881333f12a311ae9ef34da474.png

26

4f1150b881333f12a311ae9ef34da474.png

注1:只支持Eclipse 3.1.1及以上版本。

注2:如果在Eclipse中找不到Jocky插件,请删除 Eclipse安装目录/configuration/org.eclipse.update 文件夹 (Maybe an eclipse bug?)。

除了在命令行用 -scramble 参数控制符号混淆级别外,还可以在源代码中使用符号保留指令来控制那些符号需要保留。符号保留指令是一个Java文档注释指令,可以插入在类和类成员的文档注释中,例如:1

4f1150b881333f12a311ae9ef34da474.png/**

2

4f1150b881333f12a311ae9ef34da474.png * This class should preserve.

3

4f1150b881333f12a311ae9ef34da474.png * @preserve

4

4f1150b881333f12a311ae9ef34da474.png */

5

4f1150b881333f12a311ae9ef34da474.pngpublic class Foo {

6

4f1150b881333f12a311ae9ef34da474.png    /**

7

4f1150b881333f12a311ae9ef34da474.png     * You can specify which field should be preserved.

8

4f1150b881333f12a311ae9ef34da474.png     * @preserve

9

4f1150b881333f12a311ae9ef34da474.png     */

10

4f1150b881333f12a311ae9ef34da474.png    private int x;

11

4f1150b881333f12a311ae9ef34da474.png

12

4f1150b881333f12a311ae9ef34da474.png    /**

13

4f1150b881333f12a311ae9ef34da474.png     * This field is not preserved.

14

4f1150b881333f12a311ae9ef34da474.png     */

15

4f1150b881333f12a311ae9ef34da474.png    private int y;

16

4f1150b881333f12a311ae9ef34da474.png

17

4f1150b881333f12a311ae9ef34da474.png    /**

18

4f1150b881333f12a311ae9ef34da474.png     * You can also preserve methods.

19

4f1150b881333f12a311ae9ef34da474.png     * @preserve

20

4f1150b881333f12a311ae9ef34da474.png     */

21

4f1150b881333f12a311ae9ef34da474.png    public void hello() {}

22

4f1150b881333f12a311ae9ef34da474.png

23

4f1150b881333f12a311ae9ef34da474.png    /**

24

4f1150b881333f12a311ae9ef34da474.png     * This method is not preserved.

25

4f1150b881333f12a311ae9ef34da474.png     */

26

4f1150b881333f12a311ae9ef34da474.png    private void collect() {}

27

4f1150b881333f12a311ae9ef34da474.png}

如果没有@preserve指令,则根据混淆级别及成员的访问级别来确定符号是否保留。对于类的符号保留指令可以附带一个保留级别参数,来控制类成员的符号保留,包括:4f1150b881333f12a311ae9ef34da474.png@preserve            仅对类名进行保留,类成员的保留根据-scramble命令行参数决定

4f1150b881333f12a311ae9ef34da474.png@preserve public     保留所有public成员

4f1150b881333f12a311ae9ef34da474.png@preserve protected  保留所有public和protected成员

4f1150b881333f12a311ae9ef34da474.png@preserve package    保留所有public, protected, package private成员

4f1150b881333f12a311ae9ef34da474.png@preserve private    保留所有成员

4f1150b881333f12a311ae9ef34da474.png@preserve all        相当于@preserve private

4f1150b881333f12a311ae9ef34da474.png

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

private级别的方法或者字段,请以@preserve指令予以保护。注1:建议通过IDE的JavaDoc设置,来辅助@preserve指令的书写。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、前言 其他资源: web报表工具 http://download.csdn.net/source/2881508 1.1 什么是Jocky? 我们知道,Java是一种跨平台的编程语言,其源码(.java文件)被编译成与平台无关的字节码(.class文件),然后在运行期动态链接。这样,编译后的类文件中将包含有符号表,从而使得Java程序很容易被反编译。相信每一个Java开发人员,都曾经用过诸如Jad之类的反编译器,对Java的class 文件进行反编译,从而观察程序的结构与实现细节。如此一来,对于那些需要严格进行知识产权保护的Java应用,如何有效的保护客户的商业投资,是开发人员经常需要面对的问题。 于是就出现了Java混淆编译器,它的作用是打乱class文件中的符号信息,从而使反向工程变得非常困难。 Jocky就是这样一款优秀的Java混淆编译器。 1.2 为什么需要Jocky? 目前业界有不少商业的甚或是开源的混淆编译器,但它们普遍存在一些这样或者那样的问题。一般而言,现有的混淆器都是对编译好的 class文件进行混淆,这样就需要编译和混淆两个步骤。而事实上,并不是所有的符号都需要混淆。如果你开发的是一个类库,或者某些类需要动态装载,那些公共API(或者说:那些被publish出来的API)就必须保留符号不变,只有这样,别人才能使用你的类库。现有的混淆器提供了GUI或脚本的方式来对那些需要保留的符号名称进行配置,但如果程序较大时,配置工作将变得很复杂,而程序一旦修改,配置工作又要重新进行。某些混淆器能够调整字节码的顺序,使反编译更加困难,但笔者经历过混淆之后的程序运行出错的情况。 而Jocky与其它混淆编译器最大的不同之处在于:它是直接从源码上做文章,也就是说编译过程本身就是一个混淆过程。 1.3 Jocky是如何工作的? Jocky混淆编译器是在Sun JDK中提供的Java编译器(javac)的基础上完成的,修改了其中的代码生成过程,对编译器生成的中间代码进行混淆,最后再生成class文件,这样编译和混淆只需要一个步骤就可以完成。另外可以在源程序中插入 符号保留指令 来控制哪些符号需要保留,将混淆过程与开发过程融合在一起,不需要单独的配置。 1.4 Jocky的作用 1.4.1代码混淆 如前文所述,混淆编译是Jocky的首要用途。我们举一个最简单的例子,下面的SimpleBean是未经混淆的class文件通过Jad反编译以后获得的源文件: public class SimpleBean implements Serializable { private String name = "myname"; private List myList = null; public void SimpleBean() { myList = new ArrayList(10); } public void foo1() { myList.add("name"); } private void foo2() { } private void writeObject(java.io.ObjectOutputStream out) throws IOException { } } 下面是经Jocky混淆过的类文件,通过Jad反编译后产生的源文件: public class SimpleBean implements Serializable { private String _$2; private List _$1; public SimpleBean() { _$2 = "myname"; this; JVM INSTR new #4 ; JVM INSTR dup ; JVM INSTR swap ; 10; ArrayList(); _$1; } public void foo1() { _$1.add("name"); } private void _$1() { } private void writeObject(ObjectOutputStream objectoutputstream){ throws IOException { } } <Jock
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值