- 浏览: 373716 次
- 性别:
- 来自: 青岛
文章分类
最新评论
-
lippeng:
楼主,你好!这篇中提到的一个话题,是我现在非常关心的,我自己还 ...
使用JUnit测试通过 HttpClient(https协议)访问支付宝接口时不能自动获得证书的解决办法 -
snoopy7713:
[2014-03-14 17:55:06.651] TCP ...
刚完成Struts的Virgo插件,分享一下设计思路和Virgo OSGi内部的独特机制 -
snoopy7713:
需要看一下,你的代码说的挺模糊的。我的联系方式QQ 16200 ...
刚完成Struts的Virgo插件,分享一下设计思路和Virgo OSGi内部的独特机制 -
roronjavaeye:
不错,受教了
java_class反编译后的代码还原 -
daoyongyu:
讲的很好,很详细。
Struts2配置文件详解——struts.properties
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语句反编译后产生的。下面,就简单介绍一下,一些反编译后的特殊代码的还原规则。
异常
下面的代码前提是类中有如下属性,
Calendar cal = Calendar.getInstance();
1、Exceptioin的还原
反编译后的代码如下:
public boolean f1() { return cal.getTime().after(new Date()); Exception e; e; e.printStackTrace(); return false; }
还原后的Java代码
public boolean f1() { try { return cal.getTime().after(new Date()); } catch (Exception e) { e.printStackTrace(); return false; } }
2、finally代码的还原 反编译后的Java代码如下:
public boolean f2() { boolean flag = cal.getTime().after(new Date()); System.out.println("finally"); return flag; Exception e; e; e.printStackTrace(); System.out.println("finally"); return false; Exception exception; exception; System.out.println("finally"); throw exception; }
还原后的代码如下:
public boolean f2() { try { return cal.getTime().after(new Date()); } catch (Exception e) { e.printStackTrace(); return false; } finally { System.out.println("finally"); } }
3、MISSING_BLOCK_LABEL_的还原反编译后的代码
public Object f22() { Date date = cal.getTime(); System.out.println("finally"); return date; Exception e; e; e.printStackTrace(); System.out.println("finally"); break MISSING_BLOCK_LABEL_45; Exception exception; exception; System.out.println("finally"); throw exception; return null; }
还原后的Java代码
public Object f22() { try { return cal.getTime(); } catch (Exception e) { e.printStackTrace(); } finally { System.out.println("finally"); } return null; }
4、异常中:label的还原反编译后的代码
public String f4() throws Exception { label0: { try { Integer i = new Integer(1); if(i.intValue() > 0) { System.out.println(i); break label0; } System.err.println(i); } catch(Exception dae) { System.err.println(dae); throw new RuntimeException(dae); } return null; } return "Hello"; }
注意,这个代码有点诡异,实际代码如下:
public String f4() throws Exception { try { Integer i = new Integer(1); if (i.intValue() > 0) { System.out.println(i); } else { System.err.println(i); return null; } return "Hello"; } catch (Exception dae) { System.err.println(dae); throw new RuntimeException(dae); } }
5、典型数据库操作代码还原反编译后代码
public HashMap f5() { Connection conn = null; HashMap hashmap; HashMap map = new HashMap(); Class.forName(""); conn = DriverManager.getConnection("jdbc:odbc:"); PreparedStatement pstmt = conn.prepareStatement("select * from table"); pstmt.setString(1, "param"); String columnVallue; for(ResultSet rs = pstmt.executeQuery(); rs.next(); map.put(columnVallue, "")) columnVallue = rs.getString("column"); hashmap = map; if(conn != null) try { conn.close(); } catch(SQLException sqlce) { sqlce.printStackTrace(); } return hashmap; ClassNotFoundException cnfe; cnfe; cnfe.printStackTrace(); if(conn != null) try { conn.close(); } catch(SQLException sqlce) { sqlce.printStackTrace(); } break MISSING_BLOCK_LABEL_188; SQLException sqle; sqle; sqle.printStackTrace(); if(conn != null) try { conn.close(); } catch(SQLException sqlce) { sqlce.printStackTrace(); } break MISSING_BLOCK_LABEL_188; Exception exception; exception; if(conn != null) try { conn.close(); } catch(SQLException sqlce) { sqlce.printStackTrace(); } throw exception; return null; }
实际代码如下:
public HashMap f5() { Connection conn = null; try { HashMap map = new HashMap(); Class.forName(""); conn = DriverManager.getConnection("jdbc:odbc:"); PreparedStatement pstmt = conn.prepareStatement("select * from table"); pstmt.setString(1, "param"); ResultSet rs = pstmt.executeQuery(); while (rs.next()) { String columnVallue = rs.getString("column"); map.put(columnVallue, ""); } return map; } catch (ClassNotFoundException cnfe) { cnfe.printStackTrace(); } catch (SQLException sqle) { sqle.printStackTrace(); } finally { if (conn != null) { try { conn.close(); } catch (SQLException sqlce) { sqlce.printStackTrace(); } } } return null; }
6、两层异常嵌套代码还原反编译后的代码
public int f6() { int i = cal.getTime().compareTo(new Date()); System.out.println("finally"); return i; Exception e1; e1; e1.printStackTrace(); System.out.println("finally"); return -1; Exception e2; e2; e2.printStackTrace(); System.out.println("finally"); return -2; Exception exception; exception; System.out.println("finally"); throw exception; }
实际代码
public int f6() { try { try { return cal.getTime().compareTo(new Date()); } catch (Exception e1) { e1.printStackTrace(); return -1; } } catch (Exception e2) { e2.printStackTrace(); return -2; } finally { System.out.println("finally"); } }
7、非常诡异的代码反编译后的代码
public int f7() { int i = cal.getTime().compareTo(new Date()); System.out.println("finally"); return i; Exception e1; e1; e1.printStackTrace(); _L2: System.out.println("finally"); return -1; Exception e2; e2; e2.printStackTrace(); if(true) goto _L2; else goto _L1 _L1: Exception exception; exception; System.out.println("finally"); throw exception; }
原始代码
public int f7() { try { try { return cal.getTime().compareTo(new Date()); } catch (Exception e1) { e1.printStackTrace(); return -1; } } catch (Exception e2) { e2.printStackTrace(); return -1; } finally { System.out.println("finally"); } }
发表评论
-
ThreadLocal的几种误区
2012-01-10 09:48 886最近由于需要用到ThreadLocal,在网上搜索 ... -
深入解析OGNL投影
2011-12-16 15:15 1911先看这个表达式:list.{#me=#this,#root.m ... -
浅谈JAVA ThreadPoolExecutor
2011-01-28 16:36 1335这篇文章分为两部分 ... -
ant echo message 特殊字符转换
2011-01-27 11:54 1730< < > &a ... -
hibernate------hql总结
2010-08-24 12:52 8581. 查询整个映射对象所 ... -
log4j additivity 作用
2010-08-11 22:15 1980log4j.rootLogger=debug,stdout ... -
Log4j 集群环境下的 处理方案
2010-08-11 21:17 3220需求:近期有个项目要 ... -
构建Java并发模型框架
2010-07-12 17:04 921Java的多线程特性为构建 ... -
Java 程序中的多线程
2010-07-12 17:03 821由于在语言级提供了线 ... -
JAVA 线程 基础概念
2010-07-12 17:00 1036Java 有几程方法可以实 ... -
在 Java 平台上进行多线程编程的缺陷
2010-07-12 16:58 971Java 语言的并发编程 就其自身来说,并发编程是一种 ... -
c3p0-0.9.1.2数据库连接池
2010-06-17 11:46 1382C3PO是一个开放源代码的JDBC数据源实现项目,它在li ... -
Axis2快速上手指南
2010-06-03 17:59 822http://hideto.iteye.com/blog/56 ... -
C3P0连接池详细配置与实现
2010-05-31 17:33 1052<c3p0-config> <defau ... -
实例讲解:JAVA SOAP技术
2010-05-25 18:19 2390Very Simple Object Access Proto ... -
Tomcat 5.5 JNDI Resource 配置
2010-05-25 11:14 1659本文来自CSDN博客,转载请标明出处:http://blog. ... -
SSH2 jar
2010-05-21 14:51 1697在JavaEE企业级开发中, ... -
让httpclient接受所有ssl证书https 分享
2010-04-29 11:21 5096访问https 资源时,让httpclient接受所有ssl证 ... -
使用JUnit测试通过 HttpClient(https协议)访问支付宝接口时不能自动获得证书的解决办法
2010-04-29 11:17 5257最近在做一个通过 HttpCl ... -
httpclient关于https的使用
2010-04-29 11:04 2818用了大半天时间才了解如何使用httpclient来进行 ...
相关推荐
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类class反编译工具是开发者在理解和学习Java字节码或者进行逆向工程时必不可少的辅助工具。这些工具能够将已经编译过的.class文件转换回可读性强的.java源代码,帮助我们查看和理解已有的Java类结构,尤其是在...
Java反编译是Java开发中一个重要的辅助工具,它能够帮助开发者查看已编译的`.class`文件中的源代码,即使原始的`.java`源文件已经丢失或未被提供。这个过程对于理解类库的工作原理、逆向工程、调试、学习或者分析...
Java反编译是将已编译的字节码(.class文件)转换回源代码(.java文件)的过程,这对于理解和学习已有的Java程序、逆向工程或调试都是很有用的。标题提到的"java反编译工具"是用于这个目的的软件,它能够帮助开发者...
3. 反编译细节:它可以解析出大部分的Java语法,如循环、条件语句、异常处理等,尽管可能无法完美还原原始源代码的注释和精确格式。 4. 内存友好:jd-gui运行时占用的内存资源相对较少,适合开发者日常使用。 5. ...
1. **源代码丢失**:如果你只有编译后的`.class`或`.jar`文件,而没有原始的Java源代码,反编译工具可以帮助你恢复代码的逻辑,尽管生成的代码可能不完全与原始代码一致。 2. **学习和分析**:通过反编译,你可以...
JavaClass反编译是开发者在探索和理解Java代码运行机制时常用的一种技术。jd-gui是一款功能强大的开源工具,专门用于将编译后的.class文件转换回可读的Java源代码,帮助开发者查看和理解二进制字节码背后的逻辑。在...
Java反编译工具是开发人员在理解和学习Java代码或者对已有的.class文件进行逆向工程时经常使用的工具。这些工具可以将Java字节码(.class文件)转换回可读的源代码形式,帮助我们查看并理解那些无法获得源代码的二...
Java Eclipse反编译插件DeComiler是一款专为Eclipse集成开发环境设计的工具,它允许开发者查看和理解已编译的Java字节码,从而帮助他们在没有源代码的情况下进行调试、学习或逆向工程。在Java编程中,源代码通常被...
Java反编译工具是开发人员在理解和学习已编译的Java类文件时的重要辅助工具,因为Java的字节码(.class文件)是经过编译后的机器不可读的形式。JD-GUI是其中的一款流行工具,它能将这些字节码转换回可读的Java源代码...
3. 使用jad:用户需通过命令行或jadGUI选择要反编译的.class文件,jad会尝试还原出尽可能接近原生的.java代码。 4. 输出格式:反编译结果通常是可读的Java源代码,可以保存为.java文件供进一步研究或修改。 5. ...
标题“java_反编译工具”暗示了我们将讨论的是一个用于处理Java字节码的软件,它能够将编译后的类文件还原为可读的源代码形式。这种工具对于那些想要查看已加密或未公开源代码的Java库的开发者来说非常有用。 描述...
本文将详细介绍一款相当好用的JAVA反编译软件,它能帮助我们高效地从CLASS文件中恢复源代码。这款软件的高正确度高达99%,确保了反编译结果的准确性,使得开发者可以方便地理解和修改反编译出的代码。 首先,反编译...
然而,由于`.class`文件是二进制格式,对于开发者来说,直接阅读它们并不直观,因此出现了“类文件反编译工具”,如标题提到的,用于将`.class`文件转换回可读的Java源代码。 “class文件反编译工具”是一种实用的...
Java反编译工具能够将编译后的字节码文件还原为接近原始Java源代码的形式。这对于学习、研究、调试以及在某些情况下复原丢失的源代码等方面具有重要意义。通过反编译工具,开发者不仅能够了解其他项目的实现细节,还...
使用XJad或其他现代的Class反编译工具,开发者通常会得到一个与原始源代码相似但不完全一样的结果,因为反编译过程无法完美地还原所有的细节,比如注释、变量名、原始排版等。尽管如此,反编译结果依然足够理解代码...
Java开发过程中,有时候我们需要对已有的`.class`字节码文件进行反编译,以便查看其源代码,理解和学习其中的实现逻辑。`jd_gui`就是一款强大的Java反编译工具,专门用于将`.class`文件转换回可读性强的`.java`源...
### JavaClass反编译原理深度解析 #### 引言 在IT领域,特别是软件开发行业中,反编译技术是一项至关重要的技能,它不仅能够帮助开发者理解其他程序的内部逻辑,还能用于逆向工程、安全审计及版权分析等多个方面。...