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
    评论
### 回答1: mingw-w64是一个开源的工具,它可以将GNU编译器集合(GCC)用于Microsoft Windows操作系统。此工具对于开发Windows应用程序和库非常有用。 gcc-8.1.0是mingw-w64中包含的GCC的一个版本。该版本提供了许多新特性和优化,例如更好的C ++ 11支持和更快的编译时间。 SEH是Structured Exception Handling的缩写。它是一种在Windows操作系统中处理异常情况的机制SEH可用于处理许多类型的异常,例如硬件错误、内存访问冲突、除以零等。 在mingw-w64 gcc-8.1.0中,SEH被完全支持并内置于编译器中。这意味着我们可以使用SEH来处理Windows应用程序中的异常情况。SEH还允许我们编写更可靠、健壮的应用程序,因为它可以识别并处理任何由Windows操作系统引起的异常。 因此,mingw-w64 gcc-8.1.0和SEH的组合为开发Windows应用程序和库提供了强大的工具。它将编写可靠、高效和健壮的应用程序的可能性提高到了一个新的水平。 ### 回答2: mingw-w64 gcc-8.1.0 seh是一种可以在Windows系统上编译和运行C/C++程序的工具。其中,mingw-w64是一个基于MinGW(Minimalist GNU for Windows)的开源项目,支持多种操作系统和处理器架构,包括32位和64位的Windows平台;gcc-8.1.0则是GNU编译器集合中的一个版本,支持C语言和C++语言,能够生成高效、优化、符合标准的代码;seh(Structured Exception Handling)是一种结构化异常处理机制,可以在程序运行过程中捕获并处理异常,保证程序的稳定性和安全性。 使用mingw-w64 gcc-8.1.0 seh可以方便地编写和调试C/C++程序,同时享受到GNU编译器集合带来的高效性和开源项目的灵活性。使用seh可以有效防止程序在运行过程中因为异常而崩溃或者造成数据丢失等问题,提高程序的稳定性和可靠性。 总而言之,mingw-w64 gcc-8.1.0 seh的出现,为开发者提供了一个高效、安全、灵活的C/C++开发环境,可以帮助他们快速地开发出高质量的软件产品。 ### 回答3: mingw-w64 gcc-8.1.0 seh(Structured Exception Handling,结构化异常处理)是一种在Windows系统上处理异常的机制。mingw-w64是一个免费的开源软件项目,旨在向Windows平台移植GNU Compiler Collection(GCC)。其中的gcc-8.1.0是GCC的一个版本,支持各种编程语言,在Windows平台上比较常用。 在Windows系统中,异常处理是必需的。当程序运行时遇到错误或异常情况时,它会生成一个异常,这个异常可以是由程序本身引发的,也可以是由操作系统或其他原因引发的。SEH是一种机制,用于识别并处理这些异常情况。SEH允许程序员用结构化的方式处理异常,从而避免程序崩溃或停止运行。它可以让程序更加可靠和安全。 MINGW-w64 GCC-8.1.0支持SEH,这使得程序员可以使用该平台进行Windows应用程序、设备驱动程序、Web服务和其他应用程序的开发。通过使用MINGW-w64的SEH机制,程序员可以更轻松地进行调试和定位错误,减少程序的崩溃和停止运行的可能性,从而提高了程序的可靠性和鲁棒性。同时,MINGW-w64 gcc-8.1.0 SEH还提供了一些现代化的C++特性,例如异常安全和C++标准模板库(STL),这些都使得编程更加轻松和高效。因此,MINGW-w64 gcc-8.1.0 SEH是一个非常有用的工具,特别是对于那些在Windows系统上进行编程的人。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值