工程文件反编译后,首先查看资源文件与配置文件格式是否对的,将src下的R文件放入gen下,修正src下源文件的编码错误.
R.styleable:R下文件的编码错误通常是由资源文件引起的,修改资源文件
<declare-styleable name="TileView">
<attr name="tileSize" format="integer" />
</declare-styleable>
通常反编译后类型为Object的,修改其编译类型,如int的则修改为int类型.
null值错误,可以看其类型改为0或""
去掉:import dalvik.annotation.Signature;
去掉: @Signature({"Ljava/util/ArrayList", "<", "Lcom/example/android/snake/SnakeView$Coordinate;", ">;"})
这是反编译时dalvik虚拟机自动生成的.
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语句反编译后产生的。下面,就简单介绍一下,一些反编译后的特殊代码的还原规则。
异常
下面的代码前提是类中有如下属性,
显示代码打印1 Calendar cal = Calendar.getInstance();
1、Exceptioin的还原
反编译后的代码如下:
显示代码打印1 public boolean f1() { return cal.getTime().after(new Date());
2 Exception e;
3 e;
4 e.printStackTrace();
5 return false;
6 }
还原后的Java代码
显示代码打印1 public boolean f1() { try { return cal.getTime().after(new Date());
2 } catch (Exception e) { e.printStackTrace();
3 return false;
4 } }
2、finally代码的还原 反编译后的Java代码如下:
显示代码打印01 public boolean f2() { boolean flag = cal.getTime().after(new Date());
02 System.out.println("finally");
03 return flag;
04 Exception e;
05 e;
06 e.printStackTrace();
07 System.out.println("finally");
08 return false;
09 Exception exception;
10 exception;
11 System.out.println("finally");
12 throw exception;
13 }
还原后的代码如下:
显示代码打印1 public boolean f2() { try { return cal.getTime().after(new Date());
2 } catch (Exception e) { e.printStackTrace();
3 return false;
4 } finally { System.out.println("finally");
5 } }
3、MISSING_BLOCK_LABEL_的还原反编译后的代码
显示代码打印01 public Object f22() { Date date = cal.getTime();
02 System.out.println("finally");
03 return date;
04 Exception e;
05 e;
06 e.printStackTrace();
07 System.out.println("finally");
08 break MISSING_BLOCK_LABEL_45;
09 Exception exception;
10 exception;
11 System.out.println("finally");
12 throw exception;
13 return null;
14 }
还原后的Java代码
显示代码打印1 public Object f22() { try { return cal.getTime();
2 } catch (Exception e) { e.printStackTrace();
3 } finally { System.out.println("finally");
4 } return null;
5 }
4、异常中:label的还原反编译后的代码
显示代码打印01 public String f4() throws Exception { label0: { try { Integer i = new Integer(1);
02 if(i.intValue() >
03 0) { System.out.println(i);
04 break label0;
05 } System.err.println(i);
06 } catch(Exception dae) { System.err.println(dae);
07 throw new RuntimeException(dae);
08 } return null;
09 } return "Hello";
10 }
注意,这个代码有点诡异,实际代码如下:
显示代码打印1 public String f4() throws Exception { try { Integer i = new Integer(1);
2 if (i.intValue() >
3 0) { System.out.println(i);
4 } else { System.err.println(i);
5 return null;
6 } return "Hello";
7 } catch (Exception dae) { System.err.println(dae);
8 throw new RuntimeException(dae);
9 } }
5、典型数据库操作代码还原反编译后代码
显示代码打印01 public HashMap f5() { Connection conn = null;
02 HashMap hashmap;
03 HashMap map = new HashMap();
04 Class.forName("");
05 conn = DriverManager.getConnection("jdbc:odbc:");
06 PreparedStatement pstmt = conn.prepareStatement("select * from table");
07 pstmt.setString(1, "param");
08 String columnVallue;
09 for(ResultSet rs = pstmt.executeQuery();
10 rs.next();
11 map.put(columnVallue, "")) columnVallue = rs.getString("column");
12 hashmap = map;
13 if(conn != null) try { conn.close();
14 } catch(SQLException sqlce) { sqlce.printStackTrace();
15 } return hashmap;
16 ClassNotFoundException cnfe;
17 cnfe;
18 cnfe.printStackTrace();
19 if(conn != null) try { conn.close();
20 } catch(SQLException sqlce) { sqlce.printStackTrace();
21 } break MISSING_BLOCK_LABEL_188;
22 SQLException sqle;
23 sqle;
24 sqle.printStackTrace();
25 if(conn != null) try { conn.close();
26 } catch(SQLException sqlce) { sqlce.printStackTrace();
27 } break MISSING_BLOCK_LABEL_188;
28 Exception exception;
29 exception;
30 if(conn != null) try { conn.close();
31 } catch(SQLException sqlce) { sqlce.printStackTrace();
32 } throw exception;
33 return null;
34 }
实际代码如下:
显示代码打印01 public HashMap f5() { Connection conn = null;
02 try { HashMap map = new HashMap();
03 Class.forName("");
04 conn = DriverManager.getConnection("jdbc:odbc:");
05 PreparedStatement pstmt = conn.prepareStatement("select * from table");
06 pstmt.setString(1, "param");
07 ResultSet rs = pstmt.executeQuery();
08 while (rs.next()) { String columnVallue = rs.getString("column");
09 map.put(columnVallue, "");
10 } return map;
11 } catch (ClassNotFoundException cnfe) { cnfe.printStackTrace();
12 } catch (SQLException sqle) { sqle.printStackTrace();
13 } finally { if (conn != null) { try { conn.close();
14 } catch (SQLException sqlce) { sqlce.printStackTrace();
15 } } } return null;
16 }
6、两层异常嵌套代码还原反编译后的代码
显示代码打印01 public int f6() { int i = cal.getTime().compareTo(new Date());
02 System.out.println("finally");
03 return i;
04 Exception e1;
05 e1;
06 e1.printStackTrace();
07 System.out.println("finally");
08 return -1;
09 Exception e2;
10 e2;
11 e2.printStackTrace();
12 System.out.println("finally");
13 return -2;
14 Exception exception;
15 exception;
16 System.out.println("finally");
17 throw exception;
18 }
实际代码
显示代码打印1 public int f6() { try { try { return cal.getTime().compareTo(new Date());
2 } catch (Exception e1) { e1.printStackTrace();
3 return -1;
4 } } catch (Exception e2) { e2.printStackTrace();
5 return -2;
6 } finally { System.out.println("finally");
7 } }
7、非常诡异的代码反编译后的代码
显示代码打印01 public int f7() { int i = cal.getTime().compareTo(new Date());
02 System.out.println("finally");
03 return i;
04 Exception e1;
05 e1;
06 e1.printStackTrace();
07 _L2: System.out.println("finally");
08 return -1;
09 Exception e2;
10 e2;
11 e2.printStackTrace();
12 if(true) goto _L2;
13 else goto _L1 _L1: Exception exception;
14 exception;
15 System.out.println("finally");
16 throw exception;
17 }
原始代码
显示代码打印1 public int f7() { try { try { return cal.getTime().compareTo(new Date());
2 } catch (Exception e1) { e1.printStackTrace();
3 return -1;
4 } } catch (Exception e2) { e2.printStackTrace();
5 return -1;
6 } finally { System.out.println("finally");
7 } }
分享到:
相关推荐
android 反编译工具.
包含android-tool.jar jd-gui.jar和dex2jar等常用android反编译工具
最新的android反编译工具以及相关的使用方法,这个版本为最新的工具。 1、把apk文件重命名为zip或者rar文件格式 2、解压后把classes.dex复制到dex2jar-2.0目录中 3、打开cmd,定位到dex2jar-2.0目录 4、运行d2j-dex2...
里面包含了一个反编译工具,一个查看反编译后的文件工具,一个详细说明文档,可以将一个android的apk文件反编译后查看作者的原代码,由于在代码打包成apk时的编译经过了处理,反编译后的代码不可能恢复到原来的代码...
绝对完整的Android反编译工具 使用Android反编译工具以前得选安装java环境。
android 反编译工具,android 反编译工具 android 反编译工具
Android APK反编译得到Java源代码和资源文件的工具 反编译apk生成程序的源代码和图片、XML配置、语言资源等文件的工具
Android反编译软件 安卓反编译 Android APK反编译详解,有详细说明,简单易学!
包含了 Android反编译用到的所有工具包,不用再去别的地方一点点搜集了,一个下载 全部轻松搞定
Android反编译工具包合集,包含apktool,jd-gui-0.3.5.windows,dex2jar-0.0.9.15
Android反编译工具包 Android反编译工具包
不同平台上的 Android 反编译工具 有 mac linux windows 所有平台的反编译工具 配套讲解博客 : http://blog.csdn.net/shulianghan/article/details/41697821
android反编译套件,对与反编译android很好用.
Android 反编译可视化操作工具,不用在命令行操作,全程可以在操作工具中进行反编译和代码提取,并且可以进行重新签名操作
android 反编译jar包
Android 反编译工具 ,dex2jar ,Android 反编译工具Android 反编译工具 ,dex2jar ,Android 反编译工具
APKDB android反编译工具,安装之后生成鼠标右键菜单。可鼠标右键apk选择反编译,回编译等。