以下摘录于delphibbs中dr.yysun 的回答,希望对你有帮助
用 java 编程的人, 如果不想公开源程序, 就得与反编译器作斗争,
必须使用反编译器,先看看别人将会如何看你的程序,再看看obfuscators(扰乱器)的效果.
jad 是 windows 下效果极佳的反编译器 http://www.geocities.com/siliconvalley/bridge/8617/jad.html
围绕这个引擎, 有很多图形界面, 例如 frontend. (我常用)
jode 是免费的 java 反编译器和优化器.
http://jode.sourceforge.net/
intr@byte 是个 jbuilder 的外挂工具 (opentool), 使得您在 jb 中能打开 *.class
http://www.webappcabaret.com/bjb/index.jsp
它也使用 jad 引擎, 并限制为只反编译器类的定义部分.
有些网站可以帮您反编译, 您给个 url, 它分析出其中有多少个 applet,
然后, 再反编译掉. http://www.jreveal.org/
最后, 您想了解反编译原理, 想自己编个反编译器和扰乱器, 这里有本免费得书 .
http://www.riis.com/depile.html
其他到 yahoo 里找吧, 太多了.
jjams_king: 扰乱器就是把 bytecode 中的类名,方法名,变量名等变成无意义的符号。
例如,以下源程序:
package temp;
public class helloworld {
string helloworld = "hello world";
string byeworld = "bye world";
public static void main(string[] args) {
new helloworld(true);
new helloworld(false);
}
helloworld(boolean ishappy) {
if (ishappy) {
system.out.println(helloworld);
}
else {
system.out.println(byeworld);
}
}
}
加扰后,再反编译出来是:
package a;
import java.io.printstream;
public class a
{
string a;
string b;
a(boolean flag)
{
a = "hello world";
b = "bye world";
if (flag)
system.out.println(a);
else
system.out.println(b);
}
public static void main(string astring[])
{
new a(true);
new a(false);
}
}
而更高级的扰乱器,还能加密字符常量和扰乱程序流。加扰后,再反编译后变成这样:
package a;
import java.io.printstream;
public class a
{
string a;
string b;
public static boolean c;
a(boolean flag)
{
a = a("q\0041\033/\03162\005,]");
b = a("{\0308w\027v\0231\023");
if (!flag) goto 42 else 26;
system.out.println(a);
if (!c) goto 52 else 42;
system.out.println(b);
}
public static void main(string astring[])
{
new a(1);
new a(0);
}
private static string a(string string)
{
char ach[];
int i;
int j;
int k;
ach = string.tochararray();
i = ach.length;
j = 0;
k = 0;
expression 57
expression ach
expression j
expression 97
expression ach
expression j
expression 93
expression ach
expression j
expression 119
expression ach
expression j
expression 64
expression ach
expression j
dup 2 over 1
push []
^
pop []
j++;
k++;
if (i == j)
return new string(ach);
expression k
switch
case 1: goto 21
case 2: goto 29
case 3: goto 37
case 4: goto 45
case 5: goto 10
default: goto 54
}
}
你想破译其中的思路可就难了 🙂
以上资料摘自:http://www.zelix.com/klassmaster/
