JAVA编译后的CLass是很容易被反编译的,网上这类工具也比较多。这里是用了DJ Java Decompiler工具。一般没有被混淆过的JAVA代码反编译后基本上都能正常阅读,也有少部分是工具无法完整反编译出来,会带一些JVM语言和label等。如果被混淆过的JAVA代码反编译后前面的情况会出现的更多一些,同时还会把私有变量、方法、类的名称混淆成不方便阅读。这里就记录一下反编译时常见的一些形式。
一、最常见是new一个对象赋给一个变量
JVM INSTR new #2 <Class ArrayList>;
JVM INSTR dup ;
JVM INSTR swap ;
ArrayList();
List tobeRemove;
tobeRemove;
转化后代码为:
List tobeRemove=new ArrayList();
从上面反编译出来的代码可以看出JAVA里面new一个对象的过程。
二、比较复杂的对象创建语句
JVM INSTR new #48 <Class Area>;
JVM INSTR dup ;
JVM INSTR swap ;
JVM INSTR new #49 <Class java.awt.geom.RoundRectangle2D$Float>;
JVM INSTR dup ;
JVM INSTR swap ;
0.0F;
0.0F;
(float)(getWidth() - 1);
(float)(getHeight() - 10);
10F;
10F;
java.awt.geom.RoundRectangle2D.Float();
Area();
Area area;
area;
转化后为:
Area area=new Area(new java.awt.geom.RoundRectangle2D.Float(0.0F,0.0F,(float)(getWidth() - 1),(float)(getHeight() - 10),10F,10F));
三、同步代码
HashMap hashmap = tasks;
JVM INSTR monitorenter ;
if(tasks.remove(new Integer(iTaskID)) == null)
return false;
hashmap;
JVM INSTR monitorexit ;
return false;
hashmap;
JVM INSTR monitorexit ;
throw ;
转化后为:
synchronized (tasks) {
if(tasks.remove(new Integer(iTaskID)) == null){
return false;
}else{
return true;
}
}