当前位置:  技术问答>java相关

急!如何给编译后的class加密?

    来源: 互联网  发布时间:2017-03-24

    本文导语:  要求通常的反编译工具无法反编译,且加密后的类能够正常运行 | 最近试用了几个Java混淆器(Java Obfuscator),感觉没有一个完全另人满意的,于是想干脆自己写一个得了。翻了几页Java虚拟机规...

要求通常的反编译工具无法反编译,且加密后的类能够正常运行

|
最近试用了几个Java混淆器(Java Obfuscator),感觉没有一个完全另人满意的,于是想干脆自己写一个得了。翻了几页Java虚拟机规范之后突发奇想,别的混淆器都是在编译好的byte code上做文章,能不能从源码直接编译成经过混淆的class文件呢?就这样花了一个多星期的时间写了一个Java混淆编译器(Java Obfuscator Compiler)。


Q: 什么是混淆器?
A: 由于Java程序运行时是动态连接的,因此编译成的目标文件中包含有符号表,使得Java程序很容易被反编译,混淆器可以打乱class文件中的符号信息,使反向工程变得非常困难。


Q: 现有的混淆器有什么问题?
A: 现有的混淆器都是对编译好的class文件进行混淆,这样就需要编译和混淆两个步骤。并不是所有的符号都需要混淆,如果你开发的是一个类库,或者某些类需要动态装载,那些公共API就必须保留符号不变,这样别人才能使用你的类库。现有的混淆器提供了GUI或脚本的方式来对那些需要保留的符号名称进行配置,如果程序较大时配置工作变得很复杂,而程序一旦修改配置工作又要重新进行。某些混淆器能够调整字节码的顺序,使反编译更加困难,但我经历过混淆之后的程序运行出错的情况。


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


Q: 如何安装和运行JOC?
A: 下载joc.jar (http://www.apusic.com/product/cpsy.htm),运行java -jar joc.jar就可以启动Java混淆编译器,joc的命令行参数和javac完全相同,但增加了一个新的参数-Xobfuscate,它的用法如下:
       -Xobfuscate:
其中指定混淆级别,可以是以下几种级别:
       -Xobfuscate:none        不进行混淆
       -Xobfuscate:private     对所有private访问级别的元素进行混淆
       -Xobfuscate:package     对所有private或package private元素进行混淆
       -Xobfuscate:protected   对所有private, package private, protected元素进行混淆
       -Xobfuscate:public      对所有的元素都进行混淆
       -Xobfuscate:all         相当于-Xobfuscate:public
如果使用-Xobfuscate不带级别参数,则相当于-Xobfuscate:package


Q: 如何使用符号保留指令?
A: 除了在命令行用-Xobfuscate参数控制符号混淆级别外,还可以在源代码中使用符号保留指令来控制那些符号需要保留,符号保留指令是一个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() {}
       }
如果没有@preserve指令,则根据混淆级别及成员的访问级别来确定符号是否保留。


对于类的符号保留指令可以附带一个保留级别参数,来控制类成员的符号保留,包括:
       @preserve            仅对类名进行保留,类成员的保留根据-Xobfuscate命令行参数决定
       @preserve public     保留所有public成员
       @preserve protected  保留所有public和protected成员
       @preserve package    保留所有public, protected, package private成员
       @preserve private    保留所有成员
       @preserve all        相当于@preserve private


Q: JOC有哪些限制?
A: 不支持分别编译,必须对所有的源文件进行混淆编译。





|
http://www-900.ibm.com/developerWorks/cn/java/l-protectjava/index.shtml
如何有效的保护JAVA程序

    
 
 

您可能感兴趣的文章:

  • 请问哪个JAVA反编译软件可以反编译加密过的CLASS???
  • 如何加密.class文件而不被反编译?
  • 菜鸟问linux下C编译的问题,涉及到linux加密
  • 反编译一个class,这句话怎么理解:static Class class$jnsoft$manager$Slog;
  • 请问哪里有反编译.class文件的反编译器?
  • Linux下gcc编译时,如何以静态链接的形式编译? iis7站长之家
  • 为什么我的applet编译完,之后除了applet1.class之外,还有一个applet$1.class?
  • 用JCreator写了一个小程序,有十几个class,当修改某个文件重新编译,javac并没有编译修改的文件,请问要如何做javac才会重新编译所有的
  • Jdk+tomcat中编译后的class文件应放哪儿,web-inf下怎么没有class目录,急,在线等待!
  • 用jdk编译Java能不能让编译生成的.class文件自动保存到一个文件夹下?
  • 根据Java提供的.class的文件结构我们可以编写出针对.class文件的反编译程序吗?
  • 有两个:1.class与2.java,2.java继承1.class类,要把2.java编译成2.class给如何书写!
  • 一定要帮我呀,还是有关editplus的使用,为什么我编译没有.class.但可以解释.class呀
  • 谁有JAVA的反编译器?就是把.class反编译成.java的工具?或者有decafe pro的注册机?
  • 用servlet在后台画了一个图形,可是用jdk编译成.class文件以后,这个图形没有生成,好像是必须要在浏览器中执行这个.class文件以后才能生
  • 反编译.class
  • 如何对.class进行反编译
  • 编译后的CLASS文件运行问题
  • ie为什么找不到最新编译过的class文件?
  • 编译前的java文件没有,只有class文件
  • JAVA编译的CLASS文件可以反编译为JAVA文件吗?
  • 请教:有没有把java编译好的.java和.class文件编译成各个平台下的可执行文件??.exe?着急着急
  • 我的jb无法立即更新编译后的class!怎么办啊!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux/centos源码安装nginx编译配置选项参数介绍
  • 请教:JSP编译器编译成字节码,跟别的编译器编译出来的有什么不同呢?
  • CentOS 6内核升级:下载编译启用新内核版本详细过程
  • 编译GCC时能不能只编译C/C++的编译器?
  • 高速的网络抓包库PF_ring介绍及编译安装
  • 关于arm交叉编译器4.3.3编译程序报错,但是3.4.5却能编译通过的问题
  • JB下,我的程序编译得好慢!请问用什么方法编译才可以快一点?或编译顺序改变一下?
  • 请问gdb是不是只能调试gcc编译的程序,在unix下用其它编译器编译的程序是不是不一定能用gdb调试的?
  • 问:关于gcc编译器和g++编译器
  • 嵌入式linux开发:一段代码在windows平台用VC编译运行正常,在linux平台用gcc编译运行正常,但是用arm-linux-gcc编译在嵌入式板子上运行就不正常.
  • 在cygwin编译驱动程序要不要交叉编译?
  • 关于如何把编译进内核的编译成模块
  • C编译器 c++编译器 wieldylcc
  • Linux下gcc编译时,如何以静态链接的形式编译?
  • PROC开发时 //注释编译不通过 如何设置使用cpp编译。
  • 编译失败后如何再继续编译
  • 编译qt-x11,最后编译生成可执行文件时候,make出错
  • 如何查看已编译安装软件的编译命令行
  • 用Jdk编译时出现提示要加 -deprecation 再编译,请教??
  • linux下有没有能编译出16bit代码的C语言编译器?
  • 我使用.net编译通过,但是使用g++编译不能通过。总是提示我undefined reference to ~myclass()


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3