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");
} }
分享到:
相关推荐
总结起来,Xjar jar反编译软件和XJad是两种用于Java反编译的工具,它们帮助开发者理解已编译的代码,但需要注意的是,反编译的准确性受多种因素影响,且应尊重他人的知识产权。在实际使用中,选择合适的反编译工具并...
2. **元数据丢失:** 反编译无法还原注释、变量名、函数命名等元数据,这降低了代码的可读性和可维护性。 3. **版权问题:** 反编译他人的代码可能涉及版权法律问题,必须确保合法使用。 4. **加密保护:** 对于经过...
使用XJad或其他现代的Class反编译工具,开发者通常会得到一个与原始源代码相似但不完全一样的结果,因为反编译过程无法完美地还原所有的细节,比如注释、变量名、原始排版等。尽管如此,反编译结果依然足够理解代码...
总结来说,VB版EXE反编译工具是软件逆向工程中的一个重要工具,它可以帮助开发者理解已编译的VB程序,但也需要在合法的范围内使用。掌握反编译技术,不仅可以提升编程技能,还能在故障排查、软件安全分析等方面发挥...
总结,E语言E模块反编译工具是编程领域中一个实用的辅助工具,它为开发者提供了探索E语言模块内部实现的可能。在实际应用中,我们需要了解其原理,合理使用,并遵守相关法律法规,以推动技术的健康发展。同时,对于...
总结起来,这个最完整的Android反编译工具包是开发者和安全研究员的宝贵资源,包含了一系列用于解包、反编译和分析APK文件的工具。通过熟练掌握这些工具,可以深入了解Android应用程序的内部机制,提高开发技能,...
反编译是将字节码还原为接近原生的源代码的过程,常用工具有JD-GUI,它是一款直观的Java反编译器。然而,当这些.class文件中包含中文字符时,如果没有正确处理编码,可能会出现中文乱码的问题。本文将详细介绍如何...
总结来说,C#反编译工具为开发者提供了查看和理解.NET程序集内部工作方式的途径,它们在学习、调试、代码审查和逆向工程等多个方面都有应用。然而,正确使用这些工具并尊重知识产权是每个开发者应具备的职业素养。
除此之外,FernFlower是另一个开源的Java反编译器,它提供了一种更为细致的反编译策略,以尽可能地还原源代码结构。你可以通过下载源代码,然后在命令行调用相应的编译脚本来使用FernFlower。 对于更高级的场景,...
Apktool是一个强大的Android反编译工具,它可以解析APK文件中的资源文件、布局文件、图片等,并将其还原为人类可读的XML格式。而dex2jar则是将.dex文件(Dalvik虚拟机执行的字节码文件)转换成.jar文件,使得我们...
总结来说,解决Lua文件反编译后汉字乱码问题,关键在于识别和处理正确的字符编码。通过检查和配置反编译工具、转换文件编码、自定义解码算法以及调整开发环境设置,都可以有效地应对这一挑战。对于开发者来说,理解...
反编译工具的目标是尽可能地还原源代码的结构和逻辑,尽管生成的代码可能无法完全匹配原始代码,但通常可以理解和重构。 2. **常见的C#反编译工具** - **ILSpy**: 开源的C#反编译器,支持.NET Framework和.NET ...
总结来说,jd-gui作为一款强大的Java Class文件反编译工具,为开发者提供了便利,使他们能够在没有源代码的情况下理解和分析Java程序。然而,对于商业项目,尊重知识产权,未经许可不要擅自反编译他人的代码。在开发...
总结,DeZender作为一款专业的PHP反编译工具,为开发者提供了强大的辅助功能。然而,正确使用这类工具,需要我们充分理解其原理、合理运用,并始终尊重他人的知识产权。在软件开发的世界里,了解反编译技术不仅可以...
JAD的反编译能力得益于其复杂的语法恢复算法,这些算法尽可能地还原了Java源代码的结构和风格,包括注释、变量名和方法签名等。尽管无法保证完全与原始源代码一致,但JAD的反编译结果通常可读性很高,对于理解和修改...
反编译是指将字节码还原为接近源代码的形式。由于字节码并不包含原始的变量名、方法名或注释,因此反编译的结果通常不能完全与原源代码相同,尤其是对于复杂的代码结构。反编译过程涉及到对字节码的解析,重构控制流...
.NET DLL反编译工具是一种专门...总结,.NET DLL反编译工具是开发者的重要辅助工具,它们揭示了隐藏在DLL背后的代码逻辑,为学习、调试和分析.NET程序提供了便利。不过,使用这些工具时必须尊重版权和合法使用原则。
总结来说,Java反编译工具是开发者的重要辅助工具,它们使得我们可以洞察那些隐藏在.class和.jar文件背后的逻辑。在选择和使用反编译工具时,应确保合理合法,同时结合其他开发工具,如调试器、静态代码分析器等,以...
总结而言,DLL反编译工具如“Reflector.exe”是开发者的重要辅助工具,它揭示了隐藏在DLL背后的代码逻辑,为学习、调试和研究提供了便利。但在使用过程中,我们应保持对知识产权的尊重,遵循合法合规的原则。