- 浏览: 153370 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
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 24621环境:win7 启动web工程的时候,报错: ... -
java回调函数的例子
2013-03-26 17:13 15936/** * * @author hongye.hw ... -
java 中annotation的使用
2013-03-10 18:32 4700最近在看一个同事写的web框架,其中大量使用了annotat ... -
jsoup使用
2013-01-14 11:09 1011jsoup是一个开源的html解 ... -
jmock 中unexpected invocation错误
2012-02-29 14:58 4793远程服务接口 public interface Rem ... -
生产者消费者模式
2011-10-22 18:15 954import java.util.Random; im ... -
java timeTask
2011-10-09 11:28 1654项目中要使用时间程序,定时执行一段代码。google一下 ... -
Java对象序列化(整理篇) 选择自 hdAptechIvan 的 Blog
2011-03-15 18:08 926在网上看了很多有关 ... -
String作为参数传递
2010-10-06 21:48 2300import java.util.Arrays; ... -
继承与初始化
2010-09-30 17:27 918/** * @author hwy1782@gm ... -
线程池技术
2010-09-28 00:09 980转自:http://dev.csdn.net/ht ... -
堆排序
2010-09-23 10:24 994import org.junit.Test; /* ... -
数组的一个问题
2010-09-11 14:46 847一道基础题 int[] ... -
java中初始化顺序
2010-09-05 16:04 1036假设有个Dog类 一个例子: ... -
堆和堆栈的区别
2010-09-05 15:32 1506堆和堆栈的区别 ... -
synchronized的用法(转)
2010-09-01 13:55 1039synchronized 关键字,它包括两种用法:sy ... -
java synchronized 用法
2010-09-01 13:51 897synchronized 的语法: sync ... -
关于String pool转自CSDN的一篇文章
2010-06-19 08:09 1206(原创)深入研究java对Stri ... -
String Pool
2010-06-18 22:29 1179在jvm中存在着String Pool String对象是 ...
相关推荐
Java类反编译后的代码还原是指将编译后的Java类文件(.class)转换回Java源代码的过程。在这个过程中,可能会出现一些不正常的代码,例如label0 :_L1 MISSING_BLOCK_LABEL_30、JVM INSTR ret 7、JVM INSTR ...
Java Class反编译工具是程序员在处理已编译的字节码文件时不可或缺的辅助工具。这类工具的主要功能是将`.class`文件转换回可读性强的`.java`源代码,帮助开发者理解或修改已有的Java程序,尤其在没有源代码的情况下...
Java编程语言以其跨平台、面向对象的特性深受开发者喜爱,但在某些情况下,我们可能需要将已编译的`.class`文件还原为可读的`.java`源代码,这就是所谓的反编译。在这种需求下,出现了专门用于反编译Java字节码的...
Java反编译是Java开发中一个重要的辅助工具,它能够帮助开发者查看已编译的`.class`文件中的源代码,即使原始的`.java`源文件已经丢失或未被提供。这个过程对于理解类库的工作原理、逆向工程、调试、学习或者分析...
JavaClass反编译是开发者在探索和理解Java代码运行机制时常用的一种技术。jd-gui是一款功能强大的开源工具,专门用于将编译后的.class文件转换回可读的Java源代码,帮助开发者查看和理解二进制字节码背后的逻辑。在...
Java类class反编译工具是开发者在理解和学习Java字节码或者进行逆向工程时必不可少的辅助工具。这些工具能够将已经编译过的.class文件转换回可读性强的.java源代码,帮助我们查看和理解已有的Java类结构,尤其是在...
Java反编译是将已编译的字节码(.class文件)转换回源代码(.java文件)的过程,这对于理解和学习已有的Java程序、逆向工程或调试都是很有用的。标题提到的"java反编译工具"是用于这个目的的软件,它能够帮助开发者...
3. 反编译细节:它可以解析出大部分的Java语法,如循环、条件语句、异常处理等,尽管可能无法完美还原原始源代码的注释和精确格式。 4. 内存友好:jd-gui运行时占用的内存资源相对较少,适合开发者日常使用。 5. ...
Java反编译工具是开发人员在理解和学习Java代码或者对已有的.class文件进行逆向工程时经常使用的工具。这些工具可以将Java字节码(.class文件)转换回可读的源代码形式,帮助我们查看并理解那些无法获得源代码的二...
1. **源代码丢失**:如果你只有编译后的`.class`或`.jar`文件,而没有原始的Java源代码,反编译工具可以帮助你恢复代码的逻辑,尽管生成的代码可能不完全与原始代码一致。 2. **学习和分析**:通过反编译,你可以...
### JavaClass反编译原理深度解析 #### 引言 在IT领域,特别是软件开发行业中,反编译技术是一项至关重要的技能,它不仅能够帮助开发者理解其他程序的内部逻辑,还能用于逆向工程、安全审计及版权分析等多个方面。...
然而,由于`.class`文件是二进制格式,对于开发者来说,直接阅读它们并不直观,因此出现了“类文件反编译工具”,如标题提到的,用于将`.class`文件转换回可读的Java源代码。 “class文件反编译工具”是一种实用的...
使用XJad或其他现代的Class反编译工具,开发者通常会得到一个与原始源代码相似但不完全一样的结果,因为反编译过程无法完美地还原所有的细节,比如注释、变量名、原始排版等。尽管如此,反编译结果依然足够理解代码...
本文将详细介绍一款相当好用的JAVA反编译软件,它能帮助我们高效地从CLASS文件中恢复源代码。这款软件的高正确度高达99%,确保了反编译结果的准确性,使得开发者可以方便地理解和修改反编译出的代码。 首先,反编译...
Java Class反编译是将已经编译好的Java字节码(.class文件)转换回可读的Java源代码(.java文件)的过程。这在进行逆向工程、学习开源库的内部实现或调试已丢失源代码的类时非常有用。在Java领域,有一些工具专门...
标题提及的“jdk1.8 class反编译”是指利用特定的工具对JDK 1.8环境下生成的.class文件进行反编译的过程。这个过程中,我们通常会使用到反编译器,例如Procyon。 Procyon是一款开源的Java和.NET编译器及反编译器,...
Java反编译工具是程序员在开发和调试过程中经常会用到的一种实用软件,它能够将已编译的Java字节码(.class文件)转换回源代码格式,这对于查看和理解第三方库或者研究已有的二进制代码非常有帮助。本绿色版的Java反...
Java Class反编译工具是程序员在开发和调试Java应用程序时常用的一种辅助工具。它能够将已编译的Java字节码(.class文件)转换回源代码格式,这对于查看或理解无法获取源代码的库或者研究已有的二进制代码非常有用。...
使用JD-GUI非常简单,只需将.jar或.class文件拖放到应用程序窗口,它就会立即显示反编译后的源代码。这个工具的特点包括代码高亮、折叠功能,以及可以方便地查看类、方法和变量等元素。对于程序员来说,它是一款强大...