SEH 机制探索2 --- 构建 SEH 链

SEH 机制探索2 --- 构建 SEH 链


下面是异常处理程序的语法结构:

__try 
{
    // 受保护的代码
}
__except(exception filter)
{
    // 异常处理程序
}

__try{} 里的代码是受保护的,编译器会为 __try{} 块构建 SEH 链,__except(){} 块是根据括号里的 exception filter 的值来决定是否执行异常处理程序。

看看下面的简单示例:

int _tmain(int argc, _TCHAR* argv[])
{
 DWORD dwI;
 
 __try
 {
  dwI = 0;
 }
 __except(EXCEPTION_EXECUTE_HANDLER)
 {
  
 }

 return 0;
}

在进入 __try{} 块之前,编译器就会先构造好 SEH 环境,如下所示:

int _tmain(int argc, _TCHAR* argv[])
{
01041360 55                   push        ebp  
01041361 8B EC                mov         ebp,esp  
01041363 6A FE                push        0FFFFFFFEh  
01041365 68 10 6B 04 01       push        offset ___rtc_tzz+108h (1046B10h)  
0104136A 68 73 10 04 01       push        offset @ILT+110(__except_handler4) (1041073h)  
0104136F 64 A1 00 00 00 00    mov         eax,dword ptr fs:[00000000h]  
01041375 50                   push        eax  
... ... 
0104139C 8D 45 F0             lea         eax,[ebp-10h]  
0104139F 64 A3 00 00 00 00    mov         dword ptr fs:[00000000h],eax  
010413A5 89 65 E8             mov         dword ptr [ebp-18h],esp  
 DWORD dwI;
 
 __try
010413A8 C7 45 FC 00 00 00 00 mov         dword ptr [ebp-4],0  
 {
  dwI = 0;
010413AF C7 45 E0 00 00 00 00 mov         dword ptr [ebp-20h],0

这段代码除了构建 SEH 链外,还做了其它的工作,实际上这些工作异常的复杂,关系到整个 SEH 体系的来笼去脉,但是这里只关注标准的 SEH 链构建模式:

  1. 压入 exception handler,在这里是 __except_handler4() 它是缺省的异常处理程序。

    0104136A 68 73 10 04 01       push        offset @ILT+110(__except_handler4) (1041073h)


  2. 压入前一个 TEB 值。

    0104136F 64 A1 00 00 00 00    mov         eax,dword ptr fs:[00000000h]  
    01041375 50                   push        eax  


  3. 设置 FS:[0] 值
    0104139C 8D 45 F0             lea         eax,[ebp-10h]  
    0104139F 64 A3 00 00 00 00    mov         dword ptr fs:[00000000h],eax  

当我们的程序退出时,编译器会做恢复 SEH 链处理:

010413E2 8B 4D F0             mov         ecx,dword ptr [ebp-10h]  
010413E5 64 89 0D 00 00 00 00 mov         dword ptr fs:[0],ecx 

在 [ebp-10h] 里就是放着前一个 SEH 链。


上一页  目录  下一页


版权 mik 所有,转载请注明出处!

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值