- 浏览: 150437 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
accphc:
String是char[]的包装类,包装类的特质之一就是在对其 ...
Java中String类型的参数传递问题的解析 -
cyq7on:
lz,就最后没大懂,数组不是引用传递吗?
Java中String类型的参数传递问题的解析 -
di1984HIT:
xie de henhao a
Java class反编译后的代码还原 -
润之哥:
额 值传递 和引用传递 很蛋疼啦 ~~~
Java中String类型的参数传递问题的解析
Java class 利用jad 反编译之后,偶尔回碰到一些不正常的代码,例如:label0 :_L1 MISSING_BLOCK_LABEL_30、JVM INSTR ret 7 、JVM INSTR tableswitch 1 3: default 269、 JVM INSTR monitorexit、JVM INSTR monitorenter,这些一般是由特殊的for循环、try catch finally语句块、synchronized语句反编译后产生的。
下面,就简单介绍一下,一些反编译后的特殊代码的还原规则。
本文在Jdk 1.6.0_20+jad 1.58g下测试。
1、普通的循环,原始
public void f1() { boolean flag = false; if (Boolean.getBoolean("sys")) { System.out.println("sys"); } else { for (int i = 0; i < 10; i++) { flag = Boolean.getBoolean("sys"); if (flag) { System.exit(0); } } } }
反编译后的代码
public void f1() { boolean flag = false; if(Boolean.getBoolean("sys")) { System.out.println("sys"); } else { for(int i = 0; i < 10; i++) { flag = Boolean.getBoolean("sys"); if(flag) System.exit(0); } } }
2、反编译后代码变的很古怪,这是java原代码
public void f2() { int[] list = new int[] { 1, 2, 3, 4 }; if (Boolean.getBoolean("sys")) { System.out.println("sys"); } else { check: while (true) { for (int i = 0; i < list.length; i++) { if (list[i] == 2) { continue check; } else { break; } } } } }
Java反编译后的代码,部分逻辑丢失。
public void f2() { int list[] = { 1, 2, 3, 4 }; if(Boolean.getBoolean("sys")) System.out.println("sys"); else do { int i = 0; if(i >= list.length || list[i] != 2); } while(true); }
就是比f2()多了一行System.out.println("list[i]");,反编译后也挺怪的。源码如下 public void f3() {
int[] list = new int[] { 1, 2, 3, 4 }; if (Boolean.getBoolean("sys")) { System.out.println("sys"); } else { check: while (true) { for (int i = 0; i < list.length; i++) { System.out.println("list[i]"); if (list[i] == 2) { continue check; } else { break; } } } } }
反编译后的代码:
public void f3() { int list[] = { 1, 2, 3, 4 }; if(Boolean.getBoolean("sys")) System.out.println("sys"); else do { int i; do i = 0; while(i >= list.length); System.out.println("list[i]"); if(list[i] != 2); } while(true); }
4、 f2()中的break语言,移动了位置。源码如下
public void f4() { int[] list = new int[] { 1, 2, 3, 4 }; if (Boolean.getBoolean("sys")) { System.out.println("sys"); } else { check: while (true) { for (int i = 0; i < list.length; i++) { if (list[i] == 2) { continue check; } } break; } } }
反编译后代码:
public void f4() { int list[] = { 1, 2, 3, 4 }; int i; if(Boolean.getBoolean("sys")) System.out.println("sys"); else label0: do { for(i = 0; i < list.length; i++) if(list[i] == 2) continue label0; break; } while(true); }
5、就是比f4()多了一行System.out.println("list[i]");,反编译后相当怪的。源码如下:
public void f5() { int[] list = new int[] { 1, 2, 3, 4 }; if (Boolean.getBoolean("sys")) { System.out.println("sys"); } else { check: while (true) { for (int i = 0; i < list.length; i++) { System.out.println("list[i]"); if (list[i] == 2) { continue check; } } break; } } }
反编译后比较晕的代码:
public void f5() { int list[] = { 1, 2, 3, 4 }; if(!Boolean.getBoolean("sys")) goto _L2; else goto _L1 _L1: System.out.println("sys"); goto _L3 _L2: int i = 0; goto _L4 _L6: System.out.println("list[i]"); if(list[i] != 2) goto _L5; else goto _L2 _L5: i++; _L4: if(i < list.length) goto _L6; else goto _L3 _L3: }
6、就是比f5()多了一行System.exit(0);代码,但是差异确很大。源码如下:
public void f6() { int[] list = new int[] { 1, 2, 3, 4 }; if (Boolean.getBoolean("sys")) { System.out.println("sys"); } else { check: while (true) { for (int i = 0; i < list.length; i++) { System.out.println("list[i]"); if (list[i] == 2) { continue check; } } System.exit(0); break; } } }
反编译后代码,比f5()差异太大了。
public void f6() { int list[]; list = (new int[] { 1, 2, 3, 4 }); if(Boolean.getBoolean("sys")) { System.out.println("sys"); break MISSING_BLOCK_LABEL_75; } _L2: int i = 0; goto _L1 _L5: System.out.println("list[i]"); if(list[i] != 2) goto _L3; else goto _L2 _L3: i++; _L1: if(i < list.length) goto _L5; else goto _L4 _L4: System.exit(0); }
7、差异就是f6()中的System.exit(0);移动了位置,但是差异确很大。源码如下:
public void f7() { int[] list = new int[] { 1, 2, 3, 4 }; if (Boolean.getBoolean("sys")) { System.out.println("sys"); } else { check: while (true) { for (int i = 0; i < list.length; i++) { System.out.println("list[i]"); if (list[i] == 2) { continue check; } } break; } System.exit(0); } }
反编译后代码,比f6()差异太大了。
public void f7() { int list[]; list = (new int[] { 1, 2, 3, 4 }); if(Boolean.getBoolean("sys")) { System.out.println("sys"); break MISSING_BLOCK_LABEL_75; } _L2: int i = 0; goto _L1 _L5: System.out.println("list[i]"); if(list[i] != 2) goto _L3; else goto _L2 _L3: i++; _L1: if(i < list.length) goto _L5; else goto _L4 _L4: System.exit(0); }
8、逻辑和f7比没有变,只是多了一些System.out.println()代码。
public void f8() { int[] list = new int[] { 1, 2, 3, 4 }; if (Boolean.getBoolean("sys")) { System.out.println("sys"); } else { System.out.println(":check while"); check: while (true) { System.out.println("for"); for (int i = 0; i < list.length; i++) { System.out.println("list[i]"); if (list[i] == 2) { continue check; } } System.out.println("break"); break; } System.out.println("exit(0)"); System.exit(0); } }反编译后的代码:和f7()比较一下,基本就可以确定反编译后的代码对应关系了。
public void f8() { int list[]; list = (new int[] { 1, 2, 3, 4 }); if(Boolean.getBoolean("sys")) { System.out.println("sys"); break MISSING_BLOCK_LABEL_107; } System.out.println(":check while"); _L2: int i; System.out.println("for"); i = 0; goto _L1 _L5: System.out.println("list[i]"); if(list[i] != 2) goto _L3; else goto _L2 _L3: i++; _L1: if(i < list.length) goto _L5; else goto _L4 _L4: System.out.println("break"); System.out.println("exit(0)"); System.exit(0); }
9、逻辑和f8比没有变,只是多了一行System.out.println()代码,导致了反编译后的/* Loop/switch isn't completed */
public void f9() { int[] list = new int[] { 1, 2, 3, 4 }; if (Boolean.getBoolean("sys")) { System.out.println("sys"); } else { System.out.println(":check while"); check: while (true) { System.out.println("for"); for (int i = 0; i < list.length; i++) { System.out.println("list[i]"); if (list[i] == 2) { System.out.println("continue check"); continue check; } } System.out.println("break"); break; } System.out.println("exit(0)"); System.exit(0); } } }
反编译后的代码:
public void f9() { int list[] = { 1, 2, 3, 4 }; if(!Boolean.getBoolean("sys")) goto _L2; else goto _L1 _L1: System.out.println("sys"); goto _L3 _L2: System.out.println(":check while"); _L5: System.out.println("for"); for(int i = 0; i < list.length; i++) { System.out.println("list[i]"); if(list[i] != 2) continue; System.out.println("continue check"); continue; /* Loop/switch isn't completed */ } System.out.println("break"); System.out.println("exit(0)"); System.exit(0); _L3: return; if(true) goto _L5; else goto _L4 _L4: } }
发表评论
-
mina源码阅读1
2013-09-30 12:18 0服务端总体类结构如下:1. IoService接口: ... -
Address already in use:JVM_Bind 错误解决
2013-04-23 16:54 24552环境:win7 启动web工程的时候,报错: ... -
java回调函数的例子
2013-03-26 17:13 15877/** * * @author hongye.hw ... -
java 中annotation的使用
2013-03-10 18:32 4654最近在看一个同事写的web框架,其中大量使用了annotat ... -
jsoup使用
2013-01-14 11:09 971jsoup是一个开源的html解 ... -
jmock 中unexpected invocation错误
2012-02-29 14:58 4692远程服务接口 public interface Rem ... -
生产者消费者模式
2011-10-22 18:15 910import java.util.Random; im ... -
java timeTask
2011-10-09 11:28 1616项目中要使用时间程序,定时执行一段代码。google一下 ... -
Java对象序列化(整理篇) 选择自 hdAptechIvan 的 Blog
2011-03-15 18:08 855在网上看了很多有关 ... -
String作为参数传递
2010-10-06 21:48 2263import java.util.Arrays; ... -
继承与初始化
2010-09-30 17:27 883/** * @author hwy1782@gm ... -
线程池技术
2010-09-28 00:09 944转自:http://dev.csdn.net/ht ... -
堆排序
2010-09-23 10:24 961import org.junit.Test; /* ... -
数组的一个问题
2010-09-11 14:46 811一道基础题 int[] ... -
java中初始化顺序
2010-09-05 16:04 995假设有个Dog类 一个例子: ... -
堆和堆栈的区别
2010-09-05 15:32 1434堆和堆栈的区别 ... -
synchronized的用法(转)
2010-09-01 13:55 1002synchronized 关键字,它包括两种用法:sy ... -
java synchronized 用法
2010-09-01 13:51 858synchronized 的语法: sync ... -
关于String pool转自CSDN的一篇文章
2010-06-19 08:09 1113(原创)深入研究java对Stri ... -
String Pool
2010-06-18 22:29 1141在jvm中存在着String Pool String对象是 ...
相关推荐
java class反编译后的代码还原 java class反编译后的代码还原
JAVA反编译软件(可将class文件反编译为java文件)
java反编译工具(.class文件反编译成.java文件) 解压后点击exe文件打开工具,点击open菜单选择.class文件执行后即生成.java文件 一直在使用的,方便,系统维护必不可少
XJad是一款高效的Java源程序反编译软件,可以把.class文件还原成.java文件,精确度很高,内置Jad1.5.8e2,同时可处理多个*.class文件,也可以同时编译文件夹内的所有的CLASS文件,甚至可以处理*.jar文件;...
有时候,为了学习源码,我们希望将.java已经编译成.class的文件反编译为.java文件,如何还原为.java文件呢? 此款软件可以帮您将.class文件反编译为.java文件。 —好不好? ——谁用谁知道!
1、打开一个或者多个*.class文件,XJad反编译后,重命名为*.java文件, 保存至当前文件夹,并在编辑器中打开查看; 2、打开一个文件夹,XJad将该文件夹下所有*.class文件进行反编译,并保存至该文件夹下, 依据包...
1、打开一个或者多个*.class文件,XJad反编译后,重命名为*.java文件, 保存至当前文件夹,并在编辑器中打开查看; 2、打开一个文件夹,XJad将该文件夹下所有*.class文件进行反编译,并保存至该文件夹下, 依据包...
java class反编译后的代码还原常见的编译后代码以及还原代码
DJ Java Decompiler 是个反编译的工具,可以将编译过的CLASS文件编译还原成为Java原始文件,并且不需要额外安装JVM(Java Virtual Machine)或是Java SDK的工具模组即可使用。不单如此,DJJava Decompiler也兼具有...
JD-GUI 是一个用 C++ 开发的 Java 反编译工具,仅支持Windows平台。JD-GUI不需要安装,直接点击运行,可以反编译jar,class文件。
luyten是Procyon-Decompiler的GUI,是一款操作简单、功能实用的java反编译工具,软件支持*.JAR、*.zip、*.class等类型文件的反编译操作,还原度非常高,支持更多功能设置,如显式导入、类型、合成组件等等;...
JAVA 反编译工具 DJ DJ Java Decompiler是个反编译的工具,可以将编译过的CLASS文件编译还原成为Java原始文件,并且不需要额外安装JVM
把经过java文件编译后的可执行的class文件再反编译为java文件,因为经过编译的class文件是不可阅读的!但是由于java文件一般都不是单独运行的,会有类之间的相互调用,所以反编译工具反编译后只能大体上还原原来java文件...
当我们编写完成一个java类后,运行结果会得到一个class文件,这种二进制文件如果用普通记事本打开,就会出现各种乱码现象,令人十分头疼,当我们要查看.class文件的源代码时,可以通过反编译工具jd-gui实现。...
它支持Java applets,JAR和ZIP文件的反编译,从中还原出你所需要的源代码,之后你就可以通过Java编程工具中的Class浏览器查看,或进行相关操作。 Cavaj Java Decompiler是独立的Windows应用程序,即使没有安装Java...
1、打开一个或者多个*.class文件,XJad反编译后,重命名为*.java文件, 保存至当前文件夹,并在编辑器中打开查看; 2、打开一个文件夹,XJad将该文件夹下所有*.class文件进行反编译,并保存至该文件夹下, 依据包...
luyten是Procyon的GUI,是一款操作简单、功能实用的java反编译工具,软件支持*.JAR、*.zip、*.class等类型文件的反编译操作,还原度非常高,支持更多功能设置,如显式导入、类型、合成组件等等,用户可根据不同的...
此资源只包含一个工具, java反编译工具,将class还原成,java未编译文件。还原原始文件
经典的Java反编译工具,可以直接打开.class文件进行还原,需要的朋友下来看看