SEH 机制探索2 --- 构建 SEH 链
下面是异常处理程序的语法结构:
__try |
__try{} 里的代码是受保护的,编译器会为 __try{} 块构建 SEH 链,__except(){} 块是根据括号里的 exception filter 的值来决定是否执行异常处理程序。
看看下面的简单示例:
int _tmain(int argc, _TCHAR* argv[]) return 0; |
在进入 __try{} 块之前,编译器就会先构造好 SEH 环境,如下所示:
int _tmain(int argc, _TCHAR* argv[]) |
这段代码除了构建 SEH 链外,还做了其它的工作,实际上这些工作异常的复杂,关系到整个 SEH 体系的来笼去脉,但是这里只关注标准的 SEH 链构建模式:
- 压入 exception handler,在这里是 __except_handler4() 它是缺省的异常处理程序。
0104136A 68 73 10 04 01 push offset @ILT+110(__except_handler4) (1041073h)
- 压入前一个 TEB 值。
0104136F 64 A1 00 00 00 00 mov eax,dword ptr fs:[00000000h]
01041375 50 push eax
- 设置 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] |
在 [ebp-10h] 里就是放着前一个 SEH 链。
版权 mik 所有,转载请注明出处!