`

java_class反编译后的代码还原

    博客分类:
  • java
 
阅读更多

 

java class 利用jad 反编译之后,偶尔回碰到一些不正常的代码,例如:label0 :_L1 MISSING_BLOCK_LABEL_30JVM INSTR ret 7JVM INSTR tableswitch 1 3: default 269 JVM INSTR monitorexitJVM INSTR monitorenter,这些一般是由特殊的for循环、try catch finally语句块、synchronized语句反编译后产生的。下面,就简单介绍一下,一些反编译后的特殊代码的还原规则。

 

异常 

 

下面的代码前提是类中有如下属性,

Calendar cal = Calendar.getInstance();

 

1Exceptioin的还原 

 

反编译后的代码如下: 

 

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;
	} 
}
 

 

 

2finally代码的还原 反编译后的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");
	} 
}
 
 

 

 

3MISSING_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");
	} 
} 
 

 

分享到:
评论
1 楼 roronjavaeye 2013-09-07  
不错,受教了

相关推荐

    java class反编译后的代码还原

    Java类反编译后的代码还原是指将编译后的Java类文件(.class)转换回Java源代码的过程。在这个过程中,可能会出现一些不正常的代码,例如label0 :_L1 MISSING_BLOCK_LABEL_30、JVM INSTR ret 7、JVM INSTR ...

    java class反编译工具

    Java Class反编译工具是程序员在处理已编译的字节码文件时不可或缺的辅助工具。这类工具的主要功能是将`.class`文件转换回可读性强的`.java`源代码,帮助开发者理解或修改已有的Java程序,尤其在没有源代码的情况下...

    java .class 类反编译软件

    Java编程语言以其跨平台、面向对象的特性深受开发者喜爱,但在某些情况下,我们可能需要将已编译的`.class`文件还原为可读的`.java`源代码,这就是所谓的反编译。在这种需求下,出现了专门用于反编译Java字节码的...

    Java类class反编译工具

    Java类class反编译工具是开发者在理解和学习Java字节码或者进行逆向工程时必不可少的辅助工具。这些工具能够将已经编译过的.class文件转换回可读性强的.java源代码,帮助我们查看和理解已有的Java类结构,尤其是在...

    JAVA反编译软件(可将class文件反编译为java文件)

    Java反编译是Java开发中一个重要的辅助工具,它能够帮助开发者查看已编译的`.class`文件中的源代码,即使原始的`.java`源文件已经丢失或未被提供。这个过程对于理解类库的工作原理、逆向工程、调试、学习或者分析...

    java反编译工具(.class文件反编译成.java文件)

    Java反编译是将已编译的字节码(.class文件)转换回源代码(.java文件)的过程,这对于理解和学习已有的Java程序、逆向工程或调试都是很有用的。标题提到的"java反编译工具"是用于这个目的的软件,它能够帮助开发者...

    Java Class文件反编译工具 jd-gui

    3. 反编译细节:它可以解析出大部分的Java语法,如循环、条件语句、异常处理等,尽管可能无法完美还原原始源代码的注释和精确格式。 4. 内存友好:jd-gui运行时占用的内存资源相对较少,适合开发者日常使用。 5. ...

    Class文件反编译工具

    1. **源代码丢失**:如果你只有编译后的`.class`或`.jar`文件,而没有原始的Java源代码,反编译工具可以帮助你恢复代码的逻辑,尽管生成的代码可能不完全与原始代码一致。 2. **学习和分析**:通过反编译,你可以...

    javaClass反编译: jd-gui

    JavaClass反编译是开发者在探索和理解Java代码运行机制时常用的一种技术。jd-gui是一款功能强大的开源工具,专门用于将编译后的.class文件转换回可读的Java源代码,帮助开发者查看和理解二进制字节码背后的逻辑。在...

    java反编译工具,class文件 反编译成代码

    Java反编译工具是开发人员在理解和学习Java代码或者对已有的.class文件进行逆向工程时经常使用的工具。这些工具可以将Java字节码(.class文件)转换回可读的源代码形式,帮助我们查看并理解那些无法获得源代码的二...

    java_eclipse反编译插件DeComiler

    Java Eclipse反编译插件DeComiler是一款专为Eclipse集成开发环境设计的工具,它允许开发者查看和理解已编译的Java字节码,从而帮助他们在没有源代码的情况下进行调试、学习或逆向工程。在Java编程中,源代码通常被...

    jd-gui-0.3.3.windows_Java反编译工具_JAVA语言_反编译工具_

    Java反编译工具是开发人员在理解和学习已编译的Java类文件时的重要辅助工具,因为Java的字节码(.class文件)是经过编译后的机器不可读的形式。JD-GUI是其中的一款流行工具,它能将这些字节码转换回可读的Java源代码...

    jad_command.rar_DECOMPILE_jad_jad g_jadgui_java 反编译

    3. 使用jad:用户需通过命令行或jadGUI选择要反编译的.class文件,jad会尝试还原出尽可能接近原生的.java代码。 4. 输出格式:反编译结果通常是可读的Java源代码,可以保存为.java文件供进一步研究或修改。 5. ...

    java_反编译工具

    标题“java_反编译工具”暗示了我们将讨论的是一个用于处理Java字节码的软件,它能够将编译后的类文件还原为可读的源代码形式。这种工具对于那些想要查看已加密或未公开源代码的Java库的开发者来说非常有用。 描述...

    一款相当好用的JAVA CLASS文件反编译软件

    本文将详细介绍一款相当好用的JAVA反编译软件,它能帮助我们高效地从CLASS文件中恢复源代码。这款软件的高正确度高达99%,确保了反编译结果的准确性,使得开发者可以方便地理解和修改反编译出的代码。 首先,反编译...

    class文件反编译工具

    然而,由于`.class`文件是二进制格式,对于开发者来说,直接阅读它们并不直观,因此出现了“类文件反编译工具”,如标题提到的,用于将`.class`文件转换回可读的Java源代码。 “class文件反编译工具”是一种实用的...

    Java反编译工具把.class文件转换为.java文件

    Java反编译工具能够将编译后的字节码文件还原为接近原始Java源代码的形式。这对于学习、研究、调试以及在某些情况下复原丢失的源代码等方面具有重要意义。通过反编译工具,开发者不仅能够了解其他项目的实现细节,还...

    Class反编译工具

    使用XJad或其他现代的Class反编译工具,开发者通常会得到一个与原始源代码相似但不完全一样的结果,因为反编译过程无法完美地还原所有的细节,比如注释、变量名、原始排版等。尽管如此,反编译结果依然足够理解代码...

    jd_gui java class文件反编译工具

    Java开发过程中,有时候我们需要对已有的`.class`字节码文件进行反编译,以便查看其源代码,理解和学习其中的实现逻辑。`jd_gui`就是一款强大的Java反编译工具,专门用于将`.class`文件转换回可读性强的`.java`源...

    javaClass反编译.pdf

    ### JavaClass反编译原理深度解析 #### 引言 在IT领域,特别是软件开发行业中,反编译技术是一项至关重要的技能,它不仅能够帮助开发者理解其他程序的内部逻辑,还能用于逆向工程、安全审计及版权分析等多个方面。...

Global site tag (gtag.js) - Google Analytics