首页
社区
课程
招聘
[原创]15pb调试器学习总结_except_handler4以及栈展开分析
发表于: 2015-12-20 18:52 15978

[原创]15pb调试器学习总结_except_handler4以及栈展开分析

2015-12-20 18:52
15978

分析这个函数的原因
前段时间任老师讲了安全编程后布置了调试器的项目,随后自己在做项目时候把《软件调试》里面和调试直接相关的几个章节又看了一遍,其它的地方倒还是好说,讲的很详细,而且wrk里面都有源码。但是第24章编译器对try的编译,关于_except_handler4函数就不是很详细了,自己也确实好奇这个函数是如何协调系统和程序员注册的异常处理函数。看了这篇帖子http://bbs.pediy.com/showthread.php?t=140970后,虽然对如何调用自己注册的异常处理函数有了一点了解,但是对栈展开又是一个新问题了。也没看明白,就自己写了个测试程序在ida和od里面一点点读,果然还是以像薛老师说的苦行僧那样去一点点成长,才能对运行原理背后的支撑有清晰的把握。
本文对实际的编程和调试应该没有什么助益,只是自己好奇编译器和系统在背后做了什么而自己做的分析,也算是自己对在15pb学习调试相关知识的一个总结吧。自己思考问题肯定有疏漏,希望大家指正。
本文将按照下面的顺序写。
1.手工注册和用try模型注册的差异。
2.实验程序代码
3._except_handler4函数分析
4.全局展开
5.局部展开
----------------------------------------------------------------------------------------------------------------------------------------
正文

1.两种异常注册方式的差异
对于编译器做了支持的try块,要求我们将异常处理器分成过滤和处理两个部分,由编译器提供的_except_handler4来调用过滤函数,根据过滤函数的返回值(过滤函数的返回值为1、0或者-1)来决定返回EXCEPTION_DISPOSITON类型的值或者调用处理函数。
对于手工注册函数,在SEH链上直接指向了异常处理函数,返回值是直接返回给系统的异常分发函数,所以返回值类型是EXCEPTION_DISPOSITON。
不过和《软件调试》里面关于过滤函数返回值有点不一样,msdn上给出的是:
EXCEPTION_CONTINUE_EXECUTION(-1)    继续执行在发生异常的地方。
EXCEPTION_CONTINUE_SEARCH(0)    异常无法识别。继续搜索堆栈为一个处理程序。EXCEPTION_EXECUTE_HANDLER(1)    异常被识别。通过执行控制转移到异常处理程序__except复合语句,然后继续执行后__except块。
注意:在《软件调试》319页,关于-1和1的解释却是正好相反的,在读_except_handler4代码的时候要注意一点。应该是微软对函数的流程做了改变;或者编译器不一样吧。

2.实验用的程序
(1)程序c代码

#include "stdafx.h"
#include <excpt.h>
void a()
{
  int *m = 0;
  __try{
    *m = 0;
  }
  __except (EXCEPTION_CONTINUE_SEARCH){
  }
}
void b()
{
  __try{
    a();
  }
  __except (EXCEPTION_CONTINUE_SEARCH){
  }
}
void c()
{
  __try{
    b();
  }
  __except (EXCEPTION_EXECUTE_HANDLER){
  }
}
int _tmain(int argc, _TCHAR* argv[])
{
  c();
  return 0;
}
003C10C0 > $  55            PUSH EBP                                 ;  c
003C10C1   .  8BEC          MOV EBP,ESP
003C10C3   .  6A FE         PUSH -2
003C10C5   .  68 C0933E00   PUSH ConsoleA.003E93C0//这个就是编译器存放scopeTable的地方
003C10CA   .  68 D05B3C00   PUSH ConsoleA._except_handler4//用try模型注册异常,编译器都是用_except_handler4作为直接的异常处理函数。
003C10CF   .  64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
003C10D5   .  50            PUSH EAX
003C10D6   .  83EC 08       SUB ESP,8
003C10D9   .  53            PUSH EBX
003C10DA   .  56            PUSH ESI
003C10DB   .  57            PUSH EDI
003C10DC   .  A1 00B03E00   MOV EAX,DWORD PTR DS:[__security_cookie]
003C10E1   .  3145 F8       XOR DWORD PTR SS:[EBP-8],EAX
003C10E4   .  33C5          XOR EAX,EBP
003C10E6   .  50            PUSH EAX
003C10E7   .  8D45 F0       LEA EAX,DWORD PTR SS:[EBP-10]
003C10EA   .  64:A3 0000000>MOV DWORD PTR FS:[0],EAX
003C10F0   .  8965 E8       MOV DWORD PTR SS:[EBP-18],ESP
003C10F3   .  C745 FC 00000>MOV DWORD PTR SS:[EBP-4],0//ebp-4是trylevel,进入第一个try块,所以赋值为0,离开一个try块的时候,编译器也会插入语句改变这个值
003C10FA   .  E8 61FFFFFF   CALL ConsoleA.b
003C10FF   .  EB 09         JMP SHORT ConsoleA.003C110A
003C1101   .  B8 01000000   MOV EAX,1
003C1106   .  C3            RETN
003C1107   .  8B65 E8       MOV ESP,DWORD PTR SS:[EBP-18]
003C110A   >  C745 FC FEFFF>MOV DWORD PTR SS:[EBP-4],-2//这个时候就是离开一个try块,赋值为上一层try块的编号。
003C1111   .  8B4D F0       MOV ECX,DWORD PTR SS:[EBP-10]
003C1114   .  64:890D 00000>MOV DWORD PTR FS:[0],ECX
003C111B   .  59            POP ECX
003C111C   .  5F            POP EDI
003C111D   .  5E            POP ESI
003C111E   .  5B            POP EBX
003C111F   .  8BE5          MOV ESP,EBP
003C1121   .  5D            POP EBP
003C1122   .  C3            RETN
_EH4_EXCEPTION_REGISTRATION_RECORD
   +0x000 SavedESP         : Ptr32 Void
   +0x004 ExceptionPointers : Ptr32 _EXCEPTION_POINTERS
   +0x008 SubRecord        : _EXCEPTION_REGISTRATION_RECORD
   +0x010 EncodedScopeTable : Uint4B
   +0x014 TryLevel         : Uint4B
ScopeTableRecord
   +0x000 EnclosingLevel   : Uint4B
   +0x004 FilterFunc       : Uint4B
   +0x008 HandlerAddress   : Uint4B
   +0x008 FinallyFunc      : Uint4B

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 9
支持
分享
最新回复 (23)
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不错  顶起
2015-12-20 19:29
0
雪    币: 49
活跃值: (118)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
痒痒啊,写的不错,要毕业了,要加油哦,争取能够拿到一个B级的15PB毕业证
2015-12-20 19:34
0
雪    币: 10
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
苦行僧那样去一点点成长       话糙理不糙!LZ加油
2015-12-20 22:58
0
雪    币: 341
活跃值: (143)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
5
好厉害好深入
2015-12-20 23:26
0
雪    币: 191
活跃值: (848)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
6
感谢分享
2015-12-21 20:59
0
雪    币: 3725
活跃值: (619)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
从最近发出的几篇帖子感觉好像有一群狼要出山了?
2015-12-21 21:50
0
雪    币: 89
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
总感觉要出来N多牛人了
2015-12-22 09:13
0
雪    币: 274
活跃值: (30)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
顶这句 : 像苦行僧一样的一点一点去成长
2015-12-22 11:07
0
雪    币: 6526
活跃值: (3661)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
这个分析得太透彻了...功力了得
2015-12-22 17:06
0
雪    币: 118
活跃值: (72)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
mark一下。。
2015-12-22 19:00
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
学习总结,不错。能依据现有资料,文档,动手实践分析一遍,写出此等总结,确实非常用心,值得鼓励。另依据观察,能查阅《软件调试》并认真阅读去理解了相关章节内容的,都值得鼓励赏赐精华帖。毕竟,不单是培训班包括整个社会能静下心来认真深入阅读并理解技术背后原理的相关书籍的人是很少的。 工作,挣钱,创业,恋爱,以后有的是时间和机会,能静下心来学习的时间是很少的啦。愿楼主能坚持走下去。
2015-12-22 22:28
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
mark................
2015-12-22 22:50
0
雪    币: 129
活跃值: (407)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
14
恩,多谢兄台肯定。学习的黄金时间多是在20岁到30岁之间,自然是要多看书,多学原理,哪怕如今看起来是冷门的,哪怕困难重重。不是有句话说:在你所立足处深挖下去,将有泉水涌出。
2015-12-23 13:53
1
雪    币: 14
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
支持,学习下
2015-12-24 09:29
0
雪    币: 346
活跃值: (25)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
16
学习! 顶!
2015-12-24 13:28
0
雪    币: 105
活跃值: (549)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
顶下。。。。。。。。。。!
2015-12-26 12:44
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
mark,希望楼主多发一些这样的帖子
2015-12-28 09:24
0
雪    币: 136
活跃值: (65)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
19
感谢分享,顶起
2015-12-28 10:28
0
雪    币: 284
活跃值: (250)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
20
感谢分享!收藏了
2015-12-29 20:33
0
雪    币: 151
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
楼主研究的很深入.愿意花费时间来做这样的意见事情.足见楼主对于这件事情的喜爱程度.希望你能够长久的坚持下去.技术的道路很坎坷.很崎岖.与你共勉
2016-1-5 08:16
0
雪    币: 43
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
动手实践党,赞
2016-1-18 17:33
0
雪    币: 201
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
先马后看,不过感觉写的好深入
2016-1-20 08:39
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
24
师哥牛哇
2023-3-14 09:53
0
游客
登录 | 注册 方可回帖
返回
//