Android逆向-手工还原异常处理技巧

原文链接:https://bbs.pediy.com/thread-218702.htm

最近在学习Android的逆向,发现很多工具对Android异常处理方面的反汇编还原效果很差,甚至使用有些工具遇到复杂的情况还会发生错误,所以在对抗层面上,开发者会选择把重要的代码,套在异常处理中,这时候逆向者就需要手工去还原smali代码了,废话不多说,上个小例子,另附上demo一份(知识浅薄,小生本也愚钝,如有错误,还望各位大虾请轻喷)

开发环境:Eclipse

逆向环境:JEB 2.2.7

系统环境:Win 7 64bit


首先来试试一个try 一个 catch 的情况:

 



编译完成,apk直接拖到JEB,按Q即可还原出代码:

 

 

这时候试试复杂点的情况把(try 两句代码会产生异常,并使用两个对象接收):

  


这时候我们再使用JEB的Q功能还原,可以看到,JEB已经还原不完全了,虽然代码经我们稍作修改,也能还原!

但是如果碰到更复杂的,jeb还原的代码,就看得我们不知所措了!!

 


这时候我们再次按Q ,回到samli语法,拖动到该函数最尾部,可以看到catch的管理表:


 

表结构:

.catch Ljava/io/FileNotFoundException; {:10 .. :1A} :30

10 : try开始的地方

1A : 指的是try结束的地方

30 : 指的是catch处理的地方

FileNotFoundException : 指的是接收异常的对象类型

 

接着综合表结构的知识,进行手工分析:

10 - 1A :

 

1
2
3
4
5
6
// File file = new File("/data/local/1.txt"); // try上面的代码
try  {
  
     v4 =  new  FileOutputStream(file);
  
}


1A - 2C :

 

 

我们看到v4 在此代码块直接使用,并且两处的.line相邻着 由此可得知,此代码块跟上面(10 - 1A

)的是同一块

1
2
3
String v5 =  "hello" ;
v4.write(v5.getBytes());
FileOutputStream v3 = v4;


 30 - 3A :

确定范围是因为表项的第2项的“地址为3A”,所以确定第1项的范围到3A

1
2
3
catch  (FileNotFoundException e) {
     e.printStackTrace();
}

 

3A - 44:

 

1
2
3
catch  (IOException e) {
     e.printStackTrace();
}


44 - 4A:

 


综合以上代码可得:

1
2
3
4
5
6
7
8
9
10
11
12
// 3A
catch  (IOException e) {
// 3C
e.printStackTrace();
}
// 44
catch  (IOException e) {
  
FileOutputStream v3 = v4;
// goto 3C
}
// 4A

4A :

 

 

综合上面的代码可得

1
2
3
4
5
6
7
8
9
10
11
12
// 30
catch  (FileNotFoundException e) {
// 32
e.printStackTrace();
}
...
// 4A
catch  (FileNotFoundException e) {
  
FileOutputStream v3 = v4;
// goto 32
}


这时候我们看到44 处先保存v4 然后跳转到3C处,并且44处的.line是45(一个语句),3A处的.line也是45, 代表着 44 和 3A 可以归并为一个catch处理,

4A处,也相同的方式跳到32处,并且4A处的.line是4132处的.line是43(相邻)代表着4A 和 32也可以归并为一个catch,

而FileOutputStream v3 = v4; 这句赋值代码,后面并没有看到v3的使用,可以将其优掉,综合表项以及上述进行分析,10 - 2c 也应该归并为同一个代码块,优化后的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
File file =  new  File( "/data/local/1.txt" );
FileOutputStream v4 =  null ;
  
try  {
v4 =  new  FileOutputStream(file);
String v5 =  "hello" ;
v4.write(v5.getBytes());
}
catch  (FileNotFoundException e) {
e.printStackTrace();
}
catch  (IOException e) {
e.printStackTrace();
  
}

总结:

重点是看表项内容,看try范围和对应接收异常的catch范围

其次综合.line所指的java代码行数和goto xxx看代码顺序,进行归并

最后笔者也仅仅是做个小例子,在实战中,其他没有混淆代码还是可以使用JEB的Q功能还原的,更复杂的情况,还原方法大同小异

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值