萍聚社区-德国热线-德国实用信息网

 找回密码
 注册

微信登录

微信扫一扫,快速登录

萍聚头条

查看: 592|回复: 0

1-1-3-5-5 Java混淆编译器

[复制链接]
发表于 2003-2-5 12:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册 微信登录

x
发信人: parasoft (LWKUA), 信区: Java      
标  题: Java混淆编译器(转)
发信站: BBS 水木清华站 (Tue Jul 10 14:51:13 2001)

From: http://www.china-java.net/jsp/67 ... job=read&id=670

最近试用了几个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:<level>
其中<level>指定混淆级别,可以是以下几种级别:
       -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文档注释指令,
可以插入在类和类成员的文档注释中,例如:

  1.        /**
  2.         * This class should preserve.
  3.         * @preserve
  4.         */
  5.        public class Foo {
  6.            /**
  7.             * You can specify which field should be preserved.
  8.             * @preserve
  9.             */
  10.            private int x;


  11.            /**
  12.             * This field is not preserved.
  13.             */
  14.            private int y;


  15.            /**
  16.             * You can also preserve methods.
  17.             * @preserve
  18.             */
  19.            public void hello() {}


  20.            /**
  21.             * This method is not preserved.
  22.             */
  23.            private void collect() {}
  24.        }
  25. 如果没有@preserve指令,则根据混淆级别及成员的访问级别来确定符号是否保留



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

  33.        @preserve private    保留所有成员
  34.        @preserve all        相当于@preserve private


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




  37. 最后给出一个JOC混淆的效果:


  38. 源文件:


  39. import java.awt.event.*;
  40. import javax.swing.*;


  41. public class AboutBox extends JDialog
  42. {
  43.    public AboutBox()
  44.    {
  45.        initForm();
  46.    }


  47.    JPanel panel1 = new JPanel();
  48.    JButton button1 = new JButton();
  49.    JLabel jLabel2 = new JLabel();
  50.    JTextArea jTextArea1 = new JTextArea();


  51.    /**
  52.     * NOTE: The following code is required by the form designer.
  53.     * It can be modified using the form editor.  Do not
  54.     * modify it using the code editor.
  55.     */


  56.    private void initForm()
  57.    {
  58.        this.setDefaultCloseOperation( WindowConstants.DISPOSE_ON_CLOSE
  59. );
  60.        this.getContentPane().setLayout( new java.awt.CardLayout());
  61.        this.setModal( true );
  62.        this.setResizable( false );
  63.        this.setTitle( "About..." );
  64.        panel1.setLayout( null );
  65.        button1.setText( "OK" );
  66.        button1.setBounds( 272, 168, 88, 24 );
  67.        panel1.add( button1 );
  68.        jLabel2.setText( "File System Viewer for Swing 1.1.1" );
  69.        jLabel2.setVerticalAlignment( SwingConstants.TOP );
  70.        jLabel2.setBounds( 64, 32, 240, 56 );
  71.        panel1.add( jLabel2 );
  72.        jTextArea1.setFont( new java.awt.Font( "Dialog", 0, 10 ));
  73.        jTextArea1.setLineWrap( true );
  74.        jTextArea1.setOpaque( false );
  75.        jTextArea1.setText( "This computer program is protected by
  76. copyright law." );
  77.        jTextArea1.setWrapStyleWord( true );
  78.        jTextArea1.setBounds( 8, 112, 256, 80 );
  79.        panel1.add( jTextArea1 );
  80.        this.getContentPane().add( panel1, "Card1" );
  81.        this.setSize( 376, 228 );
  82.        button1.addActionListener( new java.awt.event.ActionListener(){

  83.                public void actionPerformed( java.awt.event.ActionEvent
  84. ev ){
  85.                    button1_actionPerformed( ev );
  86.                }});
  87.    }


  88.    private void button1_actionPerformed(ActionEvent ev)
  89.    {
  90.        this.dispose();
  91.    }
  92. }


  93. 经Javac编译后用JAD反编译的结果:


  94. import java.awt.*;
  95. import java.awt.event.ActionEvent;
  96. import java.awt.event.ActionListener;
  97. import javax.swing.*;
  98. import javax.swing.text.JTextComponent;


  99. public class AboutBox extends JDialog
  100. {


  101.    JPanel panel1;
  102.    JButton button1;
  103.    JLabel jLabel2;
  104.    JTextArea jTextArea1;


  105.    public AboutBox()
  106.    {
  107.        panel1 = new JPanel();
  108.        button1 = new JButton();
  109.        jLabel2 = new JLabel();
  110.        jTextArea1 = new JTextArea();
  111.        initForm();
  112.    }


  113.    private void initForm()
  114.    {
  115.        setDefaultCloseOperation(2);
  116.        getContentPane().setLayout(new CardLayout());
  117.        setModal(true);
  118.        setResizable(false);
  119.        setTitle("About...");
  120.        panel1.setLayout(null);
  121.        button1.setText("OK");
  122.        button1.setBounds(272, 168, 88, 24);
  123.        panel1.add(button1);
  124.        jLabel2.setText("File System Viewer for Swing 1.1.1");
  125.        jLabel2.setVerticalAlignment(1);
  126.        jLabel2.setBounds(64, 32, 240, 56);
  127.        panel1.add(jLabel2);
  128.        jTextArea1.setFont(new Font("Dialog", 0, 10));
  129.        jTextArea1.setLineWrap(true);
  130.        jTextArea1.setOpaque(false);
  131.        jTextArea1.setText("This computer program is protected by
  132. copyright law.");
  133.        jTextArea1.setWrapStyleWord(true);
  134.        jTextArea1.setBounds(8, 112, 256, 80);
  135.        panel1.add(jTextArea1);
  136.        getContentPane().add(panel1, "Card1");
  137.        setSize(376, 228);
  138.        button1.addActionListener(new ActionListener() {


  139.            public void actionPerformed(ActionEvent actionevent)

  140.            {
  141.                button1_actionPerformed(actionevent);
  142.            }


  143.        });
  144.    }


  145.    private void button1_actionPerformed(ActionEvent actionevent)
  146.    {
  147.        dispose();
  148.    }
  149. }


  150. 经JOC混淆编译后用JAD反编译的结果:


  151. import java.awt.*;
  152. import java.awt.event.ActionEvent;
  153. import java.awt.event.ActionListener;
  154. import javax.swing.*;
  155. import javax.swing.text.JTextComponent;


  156. public class AboutBox extends JDialog
  157. {


  158.    JPanel _$1;
  159.    JButton _$2;
  160.    JLabel _$3;
  161.    JTextArea _$4;


  162.    public AboutBox()
  163.    {
  164.        _$1 = new JPanel();
  165.        _$2 = new JButton();
  166.        _$3 = new JLabel();
  167.        _$4 = new JTextArea();
  168.        _$1();
  169.    }


  170.    private void _$1()
  171.    {
  172.        2;
  173.        this;
  174.        JVM INSTR swap ;
  175.        setDefaultCloseOperation();
  176.        getContentPane().setLayout(new CardLayout());
  177.        true;
  178.        this;
  179.        JVM INSTR swap ;
  180.        setModal();
  181.        false;
  182.        this;
  183.        JVM INSTR swap ;
  184.        setResizable();
  185.        "About...";
  186.        this;
  187.        JVM INSTR swap ;
  188.        setTitle();
  189.        _$1.setLayout(null);
  190.        _$2.setText("OK");
  191.        _$2;
  192.        168;
  193.        272;
  194.        JVM INSTR swap ;
  195.        24;
  196.        88;
  197.        JVM INSTR swap ;
  198.        setBounds();
  199.        _$1.add(_$2);
  200.        _$3.setText("File System Viewer for Swing 1.1.1");
  201.        _$3.setVerticalAlignment(1);
  202.        _$3;
  203.        32;
  204.        64;
  205.        JVM INSTR swap ;
  206.        56;
  207.        240;
  208.        JVM INSTR swap ;
  209.        setBounds();
  210.        _$1.add(_$3);
  211.        _$4;
  212.        JVM INSTR new #13  <Class Font>;
  213.        JVM INSTR dup ;
  214.        0;
  215.        "Dialog";
  216.        JVM INSTR swap ;
  217.        10;
  218.        Font();
  219.        setFont();
  220.        _$4.setLineWrap(true);
  221.        _$4.setOpaque(false);
  222.        _$4.setText("This computer program is protected by copyright
  223. law.");
  224.        _$4.setWrapStyleWord(true);
  225.        _$4;
  226.        112;
  227.        8;
  228.        JVM INSTR swap ;
  229.        80;
  230.        256;
  231.        JVM INSTR swap ;
  232.        setBounds();
  233.        _$1.add(_$4);
  234.        getContentPane().add(_$1, "Card1");
  235.        376;
  236.        this;
  237.        JVM INSTR swap ;
  238.        228;
  239.        setSize();
  240.        _$2.addActionListener(new IIlIlIIIIlllIIII(this));
  241.        return;
  242.    }


  243.    private void _$1(ActionEvent actionevent)
  244.    {
  245.        dispose();
  246.    }




  247. /*
  248.    static void access$0(AboutBox aboutbox, ActionEvent actionevent)
  249.    {
  250.        actionevent;
  251.        aboutbox;
  252.        JVM INSTR swap ;
  253.        _$1();
  254.        return;
  255.    }


  256. */


  257. // Unreferenced inner classes:


  258. /* anonymous class */
  259.    final class IIlIlIIIIlllIIII
  260.        implements ActionListener
  261.    {



  262.        public void actionPerformed(ActionEvent actionevent)
  263.        {
  264.            AboutBox.access$0(AboutBox.this, actionevent);
  265.        }


  266.             
  267.            {
  268.                AboutBox.this;
  269.                this;
  270.                JVM INSTR swap ;
  271.                this$0;
  272.            }
  273.    }
  274. }
复制代码
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
您需要登录后才可以回帖 登录 | 注册 微信登录

本版积分规则

手机版|Archiver|AGB|Impressum|Datenschutzerklärung|萍聚社区-德国热线-德国实用信息网 |网站地图

GMT+2, 2024-5-21 21:33 , Processed in 0.054397 second(s), 16 queries , MemCached On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表