`
天涯海角tour
  • 浏览: 173106 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

java 源码混淆器

    博客分类:
  • java
阅读更多

[转载] http://blueskylan.iteye.com/blog/250052

jocky是一款非常优秀的java混淆器
下载包里包含jocky的eclipse插件,jocky的安装说明和使用说明
强! 强! 原是joc

使用jocky的时候,如果你的java文件使用了utf-8编码,而windows默认是gbk编码,可能会出现"unmappable character for encoding GBK"错误而导致jocky不能使用的情况。可以通过修改jocky_build.xml中的javac段,为其添加encoding="UTF-8"就可以解决这个问题了。

这个问题的实质原因是因为ant的javac使用了默认编码(如果你使用windows xp中文版,默认编码就是GBK),从而导致编码不一致。

        <javac destdir="${jocky.output.dir}/WebRoot/WEB-INF/classes" target="${target}" encoding="UTF-8">
            <src path="src"/>
            <classpath refid="project.classpath"/>
        </javac>

 

[转载]http://hi.baidu.com/javahjj/blog/item/e01b8a5159a51b888d543000.html

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

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

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

Jocky

Java Obfuscate Compiler Kit   for You

一、前言

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    <Class ArrayList>
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 {
}
}

<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,它的用法如下:
-scramble          混淆所有package private或private符号
    -scrambleall       混淆所有符号
    -scramble:<level>  混淆相应级别的符号
     其中<level>指定混淆级别,可以是以下几种级别:
    -scramble:none        不进行混淆
    -scramble:private     对所有private访问级别的元素进行混淆
    -scramble:package     对所有private或package private元素进行混淆
    -scramble:protected   对所有private, package private, protected元素进行混淆
    -scramble:public      对所有的元素都进行混淆
    -scramble:all         相当于-scramble:public
    如果使用-scramble不带级别参数,则相当于-scramble:package

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">

<!-- 引入Jocky Ant Task,要确保jocky-ant.jar位于ANT_HOME\lib目录下 -->

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

<target name="build">

<!-- 设置jocky.jar的位置以及混淆级别,当enable为true时,javac task将被自动替换成Jocky混淆编译器 -->

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

<!-- 下面的编译,将使用Jocky混淆编译器 -->

<javac destdir="bin2" debug="on" source="1.5" target="1.4">

<src path="src"></src>

</javac>

<!-- 当enable为false时,javac task将被恢复成正常设置, Jocky编译器不再起作用 -->

<jocky enable="false"></jocky>

<!-- 下面的编译,将使用正常的Javac编译器 -->

<javac destdir="bin3" debug="on" target="1.4">

<src path="src"></src>

</javac>

</target>

</project>

<Jocky的Ant脚本示例>

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

2.3 Jocky for Eclipse

     Jocky提供了Eclipse的插件,从而能够直接在Eclipse中使用Jocky。
     1. Jocky插件的安装:
     将Jocky插件安装至Eclipse中非常简单,只需要将eclipse/plugins/org.apusic.jocky_1.0.0目录 copy 至 Eclipse的 plugins目录即可。或者在Eclipse/links文件夹中,通过link方式指定Jocky的插件目录。
     2. 在Eclipse中使用Jocky:
     在Eclipse中使用Jocky也非常简单,任何一个Java工程,选中工程通过右键菜单,都可以出现Jocky的快捷菜单:

金蝶 Jocky 混淆编译器(Eclipse)使用说明  - alex_kame - alex_kame的个人主页

<Jocky在Eclipse中的右键菜单>

金蝶 Jocky 混淆编译器(Eclipse)使用说明  - alex_kame - alex_kame的个人主页

<Jocky在Eclipse中的属性设置>

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

<project basedir="." default="build" name="jocky.example.jocky">

<property name="jocky.jar" value="f:\EclipseWTP1.0.8\workspace_jdk5_apusicstudio\org.apusic.jocky\jocky.jar"></property>

<property name="jocky.output.dir" value="jocky"></property>

<property name="jocky.scramble.level" value="package"></property>

<property name="target" value="1.4"></property>

<path id="project.classpath">

<pathelement location="bin"></pathelement>

</path>

<target name="init">

<jocky jar="${jocky.jar}" level="${jocky.scramble.level}"></jocky>

<mkdir dir="${jocky.output.dir}"></mkdir>

<mkdir dir="${jocky.output.dir}/bin"></mkdir>

</target>

<target name="clean">

<delete dir="${jocky.output.dir}/bin"></delete>

<delete dir="${jocky.output.dir}"></delete>

</target>

<target depends="init" name="build">

<echo message="${ant.project.name}: ${ant.file}"></echo>

<jocky enable="true"></jocky>

<javac destdir="${jocky.output.dir}/bin" target="${target}">

<src path="src"></src>

<classpath refid="project.classpath"></classpath>

</javac>

</target>

</project>

<Jocky在Eclipse中自动生成的Ant脚本示例>

注1:只支持Eclipse 3.1.1及以上版本。
注2:如果在Eclipse中找不到Jocky插件,请删除 Eclipse安装目录/configuration/org.eclipse.update 文件夹 (Maybe an eclipse bug?)。

2.4 如何使用符号保留指令

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

/**
* This class should preserve.
* @preserve
*/
public class Foo {
/**
* You can specify which field should be preserved.
* @preserve
*/
private int x;
/**
* This field is not preserved.
*/
private int y;
/**
* You can also preserve methods.
* @preserve
*/
public void hello() {}
/**
* This method is not preserved.
*/
private void collect() {}
}

<使用preserved指令的示例>

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

@preserve            仅对类名进行保留,类成员的保留根据-scramble命令行参数决定
       @preserve public     保留所有public成员
       @preserve protected  保留所有public和protected成员
       @preserve package    保留所有public, protected, package private成员
       @preserve private    保留所有成员
       @preserve all        相当于@preserve private
    事实上,即便不加@preserve指令,Jocky对Java语言特有的一些private级别的方法不进行混淆,譬如,在序列化时有特殊作用的writeObject及readObject方法等。但笔者强烈建议: 针对这些有特殊含义不能够被混淆的 private级别的方法或者字段,请以@preserve指令予以保护。
注1:建议通过IDE的JavaDoc设置,来辅助@preserve指令的书写。

三、Jocky的限制

    正如前文所说,Jocky是基于源代码的混淆编译器,因此,Jocky不支持分别编译,必须对所有的源文件同时进行混淆编译。但事实上,倘若混淆级别控制在private级别上,该限制便不复存在。
分享到:
评论
2 楼 李_俊 2012-09-06  
呃,那么复杂,果断无视,找一个简单的。
1 楼 k_cheng007 2012-06-08  

相关推荐

    很强大的java代码混淆工具 Jocky

    大家熟知的Progaurd只能对class文件进行混淆,也就是必须先把java源码编译为class文件,然后再进行混淆 Jockey跟其他混淆工具不同的是:它是直接对编译过程做文章,也就是在把java文件编译为class文件的过程中对代码...

    一种基于源代码的Java代码混淆器的设计与实现.pdf

    Java代码混淆器是一种用于保护Java源代码安全的技术,通过让源代码变得难以理解和反编译,从而达到防止源代码泄露和被恶意利用的目的。在目前Java字节码反编译变得十分容易的背景下,源代码的混淆显得尤为重要。 ...

    java 混淆、加密js代码

    Java混淆和加密JavaScript代码是保护Web应用程序源代码安全的重要手段,尤其是在公开发布或者与第三方共享时,能够防止恶意用户分析和篡改代码。本压缩包包含的资源专注于这个主题,让我们详细了解一下相关知识点。 ...

    JAVA源代码混淆器proguard4.8 + 安卓源码混淆配置文件(原创)

    proguard混淆器可以对多种平台的JAVA源代码进行混淆,增加反编译代价。proguard混淆器是开源的软件,压缩包内含全部最新版源代码。压缩包根目录下有我修改的安卓JAVA项目混淆配置文件,proguard自带的混淆配置文件在...

    对java jar包实现混淆加密

    ProGuard是一个开源的Java字节码混淆器,它可以删除无用的类、字段和方法,同时混淆剩余的代码。此外,它还可以优化字节码以减小jar包的大小,提高运行效率。 1. ProGuard配置与使用 使用ProGuard需要编写一个配置...

    java源码混淆工具使用演示

    idea+maven+proguard,通过proguard实现源码的混淆编译,将源码的原始变量、方法名等按proguard规则进行统一修改替换,保证功能不变的情况下,一定程度提高源码的安全性,避免源码中的敏感词变量引起的安全检查异常...

    java代码双重混淆

    2,混淆的目的就是为了不能把class还原成java源码,保护自己的利益; 3,不混淆时,可以被轻而易举的还原,容易泄露商业机密是很不安全的; 4,单次混淆时,仍然有被还原的可能,只是难度偏高; 5,双重混淆之后,...

    jocky(java代码混淆器)

    我们知道,Java是一种跨平台的编程语言,其源码(.java文件)被编译成与平台无关的字节码(.class文件),然后在运行期动态链接。这样,编译后的类文件中将包含有符号表,从而使得Java程序很容易被反编译。相信每一个...

    java 源码加密 混淆 proguard 配置文件

    java 源码加密 混淆,proguard 配置文件,很详细,经测试可以用

    java 代码混淆 proguard

    Java代码混淆是保护软件知识产权的重要手段,特别是在开源或者发布商业应用时,为了防止恶意用户反编译源码,理解并篡改程序逻辑,开发者通常会采用代码混淆技术。ProGuard是一款广泛使用的Java代码混淆工具,它能...

    Java代码混淆工具proguard

    经典的Java代码混淆工具,可以混淆class,jar类型的文件,防止被反编译,对需要进行源码保护的代码很有用。

    java源代码混淆器proguard4.8 + 安卓源码混淆配置文件(原创)

    proguard混淆器可以对多种平台的JAVA源代码进行混淆,增加反编译代价。proguard混淆器是开源的软件,压缩包内含全部最新版源代码。压缩包根目录下有我修改的安卓JAVA项目混淆配置文件,proguard自带的混淆配置文件在...

    java混淆器 RetroGuard

    java混淆器 RetroGuard 免费提供源码 可运行jar文件 Java 代码编译后生成的 .class 中包含有源代码中的所有信息(不包括注释),尤其是在其中保存有调试信息的时候。所以一个按照正常方式编译的 Java .class 文件...

    java源码查看工具

    Java源码查看工具是开发过程中不可或缺的辅助软件,主要用于查看和理解已编译的.class文件或.jar文件中的源代码。这些工具对于开发者来说至关重要,因为它们可以帮助开发者在没有原始.java源代码的情况下,深入理解...

    基于java的开发源码-JS和CSS压缩混淆 JsCompressor.zip

    基于java的开发源码-JS和CSS压缩混淆 JsCompressor.zip 基于java的开发源码-JS和CSS压缩混淆 JsCompressor.zip 基于java的开发源码-JS和CSS压缩混淆 JsCompressor.zip 基于java的开发源码-JS和CSS压缩混淆 ...

    捕鱼 java 源码.rar

    3. **对象模型**:在Java源码中,每种游戏元素(如鱼、炮弹)都是一个对象,它们有自己的属性(如位置、速度)和行为(如游动、发射)。理解这些对象如何被创建、管理和更新是理解游戏逻辑的关键。 4. **游戏逻辑**...

    JAVA源码JS和CSS压缩混淆JsCompressor

    JAVA源码JS和CSS压缩混淆JsCompressor

    JAVA混淆编译工具

    - **主要功能**:一个简单的类文件分析器和混淆器。 - **许可证类型**:免费 - **适用场景**:适合于需要快速混淆处理的场合。 6. **BloatFree** - **开发者/公司**:Riggs Hill Software - **主要功能**:...

    最新java jar包混淆工具

    **ProGuard** 是一个免费的Java类文件混淆器、优化器和 Shrinker。它的主要功能包括: 1. **混淆**:ProGuard通过给类、方法和字段随机分配简短的名字(如a, b, c等)来混淆代码,使得阅读和理解混淆后的代码变得...

Global site tag (gtag.js) - Google Analytics