首页
社区
课程
招聘
[原创]逆向进阶——复杂分支结构逆向
发表于: 2011-2-22 12:39 7685

[原创]逆向进阶——复杂分支结构逆向

2011-2-22 12:39
7685
熟知if-else的典型结构是逆向入门的必经路程,然而我们实际逆向时,遇到的情况远比这要复杂
一、条件分支的逆向基础——典型的if-else结构
    我们知道简单的if-else的跳转结构是这样的。
例如:
if(i1<x1)
     ……;
else
     ……;
在反汇编结果中我们会看到类似下面的结果

两点说明::
①jxx AAAAAAAA 这句由于false则跳转,因此还原为if代码时,要注意。
②jmp BBBBBBBB 这句在功能上属于if的部分,但是如果没有else,编译器不会填写此句。

二、多层嵌套if-else
if(i<x1)
{…
 if(i<x2)
   {…
   if(i<x3)
    …..
   else
    …..
   }
 else
  ……
}
对应反汇编形态:(地址A、B、C、D从小到大分布)
Debug版:

说明:
  这里我们看到在Debug版里,多层嵌套if-else只是简单重复单层if-else的结构。另外,jxx仍然是false则跳转,翻译为if时,要注意。
Release版:

说明:
    我们看到Release版对Debug改进,避免了jmp的多次运行。

三、复合条件的条件分支
(1)与——&&
if(i1<x1 && i2<x2 && i3<x3)
  ……
else
  ……
反汇编形态:

说明:
    N条分支全部向Jmp后跳转。

(2)或——||
if(i1<x1 || i2<x2 || i3<x3)
  ……
else
  ……
反汇编形态:

说明:
    只有N-1个分支向jmp后跳转。

(3)混合
if(i1<x1||i2<x2&&i3<x3)
  ……
else
  ……
反汇编形态:


if(i1<x1&&i2<x2||i3<x3)
  ……
else
  ……
反汇编形态:

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (9)
雪    币: 27
活跃值: (90)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
2
总结得不错啊, 支持下
2011-2-22 13:44
0
雪    币: 116
活跃值: (70)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
3
支持下,精神可嘉
2011-2-22 19:28
0
雪    币: 258
活跃值: (84)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
过来支持一下!!!!!!!!!!!!
2011-2-23 02:41
0
雪    币: 213
活跃值: (147)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
比有些反汇编的书籍讲得更容易让人理解接受。支持继续下去。
2011-2-23 10:45
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
6
/O2 编译出来的很让人蛋疼。
2011-2-23 13:22
0
雪    币: 44229
活跃值: (19965)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
7
这篇文章适合初学者,鼓励一下!
2011-2-23 22:41
0
雪    币: 149
活跃值: (126)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
一直在自己探索,看到这篇文件头脑清醒多了。
2011-2-24 17:44
0
雪    币: 411
活跃值: (247)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
恩,实际情况是类似这样的分支代码:

if(i<x1)
{…
if(i<x2)
   {…
   if(i<x3)
    …..
   else
    …..
   }
else
  ……
}

比如其中的else部份,及可能编译后else部份的代码已经不在整个分支代码的地址范围内,编译器采用至少两个跳转来调用else部份的代码,也就是这样

if(i<x1)
{…
if(i<x2)
   {…
   if(i<x3)
    …..
   else    ; jxx aaaaaaaa 编译后的代码并未顺序排列,而是跳转到别处运行,但是总会jmp回来
    …..
   }
else
  ……

         ; 地址 bbbbbbbb
}

第一个else部份的代码:
地址 aaaaaaaa

jmp bbbbbbbb ;此处再跳回分支代码的最后

当然,实际情况中还会有更多的jmp,不过总会jmp回程序正常的逻辑范围内
2011-2-24 20:21
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
10
MS 自身的程序编译后基本是这种情况。
2011-2-24 21:22
0
游客
登录 | 注册 方可回帖
返回
//