您的位置:程序门 -> java -> j2se / 基础类



java代码加密


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


java代码加密[已结贴,结贴人:beauty4]
发表于:2007-02-26 12:06:35 楼主
怎样给java源码加密呢,我一点方向感也没有,希望大家提提意见。
发表于:2007-02-26 12:15:101楼 得分:10
加密源码?......

加密字节码的话,现在有不少的混淆工具,用来防止反编译,但java的混淆/加密效果实在很差劲,一般都比较容易破解。

因为字节码本身太容易阅读了!!即使没有专门的破解工具,单单eclipse就足够强大了,
即使没有源代码,也可以在任何一个方法上加断点,可以在任何一个字段上加存、取断点,
又加上你可以控制classloader。。。
发表于:2007-02-26 12:20:202楼 得分:0
用混淆工具加密.class文件.
发表于:2007-02-26 13:28:183楼 得分:20
有多个工具:
1)proguard   是一个免费的   java类文件的压缩,优化,混肴器。它删除没有用的类,字段,方法与属性。使字节码最大程度地优化,使用简短且无意义的名字来重命名类、字段和方法   。
2)javaguard是一个通用的字节码模糊器,旨在容易地适合你的规则建造和测试进程,保证你的有价值的代码更安全,使其不易被反编译以及其它形式的反向处理。
3)retroguard是不错的java混淆器,在jbuilder7的企业版中也带了这个混淆器。
4)jode包含一个java混淆器与一个java优化器。通过一个脚本文件可以控制class文件的多种优化方式。
发表于:2007-02-26 13:28:554楼 得分:0
补充:用google去搜吧。
发表于:2007-02-26 13:38:065楼 得分:20
重写classloader的部分方法,对加载进来的.class进行字节加减来实现基本的加密和解秘
import   java.util.*;
import   java.io.*;
import   java.lang.reflect.*;
import   java.awt.*;
import   java.awt.event.*;
import   javax.swing.*;

/**
      this   program   demonstrates   a   custom   class   loader   that   decrypts
      class   files.
*/
public   class   classloadertest
{
      public   static   void   main(string[]   args)
      {
            jframe   frame   =   new   classloaderframe();
            frame.setdefaultcloseoperation(jframe.exit_on_close);
            frame.setvisible(true);
      }
}

/**
      this   frame   contains   two   text   fields   for   the   name   of   the   class
      to   load   and   the   decryption   key.
*/
class   classloaderframe   extends   jframe
{
      public   classloaderframe()
      {
            settitle( "classloadertest ");
            setsize(default_width,   default_height);
            setlayout(new   gridbaglayout());
            add(new   jlabel( "class "),   new   gbc(0,   0).setanchor(gbc.east));
            add(namefield,   new   gbc(1,   0).setweight(100,   0).setanchor(gbc.west));
            add(new   jlabel( "key "),   new   gbc(0,   1).setanchor(gbc.east));
            add(keyfield,   new   gbc(1,   1).setweight(100,   0).setanchor(gbc.west));
            jbutton   loadbutton   =   new   jbutton( "load ");
            add(loadbutton,   new   gbc(0,   2,   2,   1));
            loadbutton.addactionlistener(new
                  actionlistener()
                  {
                        public   void   actionperformed(actionevent   event)
                        {
                              runclass(namefield.gettext(),   keyfield.gettext());
                        }
                  });
            pack();
      }

      /**
            runs   the   main   method   of   a   given   class.
            @param   name   the   class   name
            @param   key   the   decryption   key   for   the   class   files
      */
      public   void   runclass(string   name,   string   key)
      {
            try
            {
                  classloader   loader   =   new   cryptoclassloader(integer.parseint(key));
                  class   c   =   loader.loadclass(name);
                  string[]   args   =   new   string[]   {};

                  method   m   =   c.getmethod( "main ",   args.getclass());
                  m.invoke(null,   (object)   args);  
            }
            catch   (throwable   e)
            {
                  joptionpane.showmessagedialog(this,   e);
            }
      }

      private   jtextfield   keyfield   =   new   jtextfield( "3 ",   4);
      private   jtextfield   namefield   =   new   jtextfield(30);
      private   static   final   int   default_width   =   300;
      private   static   final   int   default_height   =   200;
}

/**
      this   class   loader   loads   encrypted   class   files.
*/
class   cryptoclassloader   extends   classloader
{
      /**
            constructs   a   crypto   class   loader.
            @param   k   the   decryption   key
      */
      public   cryptoclassloader(int   k)
      {
            key   =   k;
      }

      protected   class   findclass(string   name)
            throws   classnotfoundexception
      {
            byte[]   classbytes   =   null;
            try
            {
                  classbytes   =   loadclassbytes(name);
            }
            catch   (ioexception   e)
            {
                  throw   new   classnotfoundexception(name);
            }

            class   cl   =   defineclass(name,   classbytes,   0,   classbytes.length);
            if   (cl   ==   null)
                  throw   new   classnotfoundexception(name);
            return   cl;
      }

      /**
            loads   and   decrypt   the   class   file   bytes.
            @param   name   the   class   name
            @return   an   array   with   the   class   file   bytes
      */
      private   byte[]   loadclassbytes(string   name)
            throws   ioexception
      {
            string   cname   =   name.replace( '. ',   '/ ')   +   ".caesar ";
            fileinputstream   in   =   null;
            in   =   new   fileinputstream(cname);
            try
            {
                  bytearrayoutputstream   buffer   =   new   bytearrayoutputstream();
                  int   ch;
                  while   ((ch   =   in.read())   !=   -1)
                  {
                        byte   b   =   (byte)   (ch   -   key);
                        buffer.write(b);
                  }
                  in.close();
                  return   buffer.tobytearray();
            }
            finally
            {
                  in.close();
            }
      }

      private   int   key;
}
发表于:2007-02-26 13:46:366楼 得分:0
搜一下java混淆器
发表于:2007-02-27 13:23:417楼 得分:0
谢谢大家:)
发表于:2007-05-28 22:46:088楼 得分:0
关注一下!!!!!!!!


快速检索

最新资讯
热门点击