obfuscated.rar   2.6 KB 这是混淆后的类文件, 内含原始代码. 执行方式 java –jar hello.jar 即可.

众所周知, Java的最大缺陷就是编译后的代码很容易被反编译, 从而使辛辛苦苦交付给客户的项目或者是客户端软件, 例如RCP/IM客户端, 很容易的就被人破解掉. 保护代码的方式, 相对来说要比C/C++困难的多, 而且加密/保护后的类文件运行时比较容易出现一些问题. 最常见的方式就是混淆, 例如国产的Jocky, 国外的各种Guard等, 不过, JVM 实际上也支持数字格式的类名, 甚至是以空格命名的包名和变量名, 唯一的约束只是在编译时所产生的.

混淆效果演示:

原始程序:

代码1

import util.Tools;

public class Hello {
    private int a = 1;
    private int b = 2;

    public int result() {
        return Tools.add(a, b);
    }
    /**
     * 日期: 2010-7-1
     * @param args
     */
    public static void main(String[] args) {
        System.out.println(“simple test:” + new Hello().result());
    }

}

代码2

package util;

public class Tools {
    public static int add(int a, int b) {
        System.out.println(“Call for Tools.add()”);
        return a + b;
    }
}

混淆后的 hello.jar

image

反编译后的代码(基本上无法编译欢迎回去, 变量名,方法名和类名都是数字, 可正常执行)

import java.io.PrintStream;

public class 0
{
  private int 0 = 1;
  private int 1 = 2;

  public int 0()
  {
    return 0.0.0(this.0, this.1);
  }

  public static void main(String[] paramArrayOfString)
  {
    System.out.println(“simple test:” + new 0().0());
  }
}

package 0;

import java.io.PrintStream;

public class 0
{
  public static int 0(int paramInt1, int paramInt2)
  {
    System.out.println(“Call for Tools.add()”);
    return paramInt1 + paramInt2;
  }
}

混淆后的hello1.jar

image

反编译后的代码(包名和变量名为空格或者字符串,增加还原难度, 可正常执行)

import java.io.PrintStream;

public class 0
{
  private int   = 1;
  private int  “wlstat” = 2;

  public int  ()
  {
    return  .0. (this. , this. “wlstat”);
  }

  public static void main(String[] paramArrayOfString)
  {
    System.out.println(“simple test:” + new 0(). ());
  }
}

 

package  ;

import java.io.PrintStream;

public class 0
{
  public static int  (int paramInt1, int paramInt2)
  {
    System.out.println(“Call for Tools.add()”);
    return paramInt1 + paramInt2;
  }
}

 

此文仅为展示一种可能性, 不推荐在项目中使用.

转载请注明:WebLogic Android 博客 » Java混淆器探索: 支持以数字和空格命名的类名,包名和变量方法名