当前位置: 代码迷 >> Android >> android 反编译经验
  详细解决方案

android 反编译经验

热度:7   发布时间:2016-05-01 17:10:16.0
android 反编译心得

工程文件反编译后,首先查看资源文件与配置文件格式是否对的,将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 } }

?

1 楼 q694119254 2011-11-09  
  相关解决方案