`
艳过留痕
  • 浏览: 40519 次
社区版块
存档分类

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

分享到:
评论

相关推荐

    android 学习心得

    ### 十三、Android程序反编译的方法 - **使用工具**:如dex2jar、JD-GUI、apktool等,可以将APK文件反编译为Java源码或XML布局文件。 - **分析代码**:通过对反编译出的代码进行分析,可以了解应用的内部实现细节。...

    android电子书汇总

    《Google Android SDK开发范例大全(第3版)》 Android应用开发揭秘高清版 Android应用程序开发36技(pdf完整版359页) Android手机平台移植与底层开发 ...Android反编译工具 深入浅出_Google_Android(PDF格式高清中文版)

    android电子书汇总2

    《Google Android SDK开发范例大全(第3版)》 Android应用开发揭秘高清版 Android应用程序开发36技(pdf完整版359页) Android手机平台移植与底层...Android反编译工具 深入浅出_Google_Android(PDF格式高清中文版)

    android电子书汇总3

    一共4个压缩包 《Google Android SDK开发范例大全(第3版)》 Android应用开发揭秘高清版 Android应用程序开发36技(pdf完整版359页) ...Android反编译工具 深入浅出_Google_Android(PDF格式高清中文版)

    android电子书汇总part4

    《Google Android SDK开发范例大全(第3版)》 Android应用开发揭秘高清版 Android应用程序开发36技(pdf完整版359页) Android手机平台移植与底层...Android反编译工具 深入浅出_Google_Android(PDF格式高清中文版)

    android开发资料大全

    Android如何防止apk程序被反编译 Android 之 AIDL 和远程 Service 调用 Android 相对布局技巧 android开发环境之Logcat(日志)教程实例汇总 android网络通信之socket教程实例汇总 AsyncTask进度条加载网站数据到...

    我的android应用(提供源码)

    通过反编译或使用工具(如apktool)分析这个APK,我们可以了解到应用的架构、使用的库、资源文件(如图片、字符串、布局)等信息。 从源码到APK的构建过程涉及许多Android开发的关键知识点,包括: 1. **Android ...

    APKTOOLGUI.rar

    这个工具主要用于帮助开发者或者安全研究人员对APK(Android应用程序)进行反编译,以便查看其源代码、资源文件和XML配置,从而进行调试、修改或学习。 【描述】"嘻嘻 可以用哦!下载解压,直接运行就好了!"说明这...

    记录一些我自己在学习Android逆向过程中的有意思的东西.zip

    这些知识点涵盖了从基本的APK分析到复杂的代码反编译、调试以及安全防护等多方面内容。在这个"记录一些我自己在学习Android逆向过程中的有意思的东西.zip"压缩包中,有两个主要文件:说明.txt和MobileSec_master.zip...

    MobSFAndroid静态分析使用心得

    由于这个框架是基于Python开发的,而且需要反编译Apk,所以我们列下需要的环境清单:Python2.7(不能使3.x版本,低于2.7我也没有试过)OracleJDK1.7+MobSF源码以上是静态分析需要的环境,另外再官方的文档中写了一句...

    乐玩拼图 我自己开发的第二款游戏

    通过反编译或使用APK分析工具,开发者可以查看游戏的结构、资源文件和编译后的代码,从而学习和借鉴其设计思路和实现方法。 总结来说,“乐玩拼图”这款游戏的开发过程涵盖了从概念设计到编码实现,再到测试和发布...

    APKTool批处理版l

    第三种就是我在这里要向大家推荐的APKTOOL,他的原理是把APK进行反编译,生成程序的源代码和图片、XML配置、语言资源等文件。我们秩序对有关图片和语言资源等文件进行修改,再编译打包成APK并签名,就可以得到汉化版...

    Lichee Pi 荔枝派 全流程指南

    荔枝派是一款开源且低成本的基于Cortex-A8处理器的评估板,专门设计来帮助嵌入式工程师学习复杂的...Smali是安卓平台上的一个中间语言,通常用于应用的反编译过程,对于安卓开发者而言,了解smali语言也是很有帮助的。

    2000个apk下载链接

    它包含了应用程序的所有组件,包括代码、资源文件(如图片、音频文件等)、资产文件(非编译资源文件,如文本文件、数据库文件等)、AndroidManifest.xml(应用程序配置文件)、以及证书文件。当用户在设备上安装一...

Global site tag (gtag.js) - Google Analytics