0%

seh结构化异常

seh结构化异常

纸上得来终觉浅,绝知此事要躬行

以编程层面来演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// test1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <windows.h>
int main(int argc, char* argv[])
{
int a=0;
__try
{
int a=1/a;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
printf("异常");
}
return 0;
}

源代码,跟随到入口函数

image-20200410223729726

跟随ebp往上翻可以看到这个结构,

1
2
3
4
5
6
7
8
9
10
11
struct _EXCEPTION_REGISTRATION{
struct _EXCEPTION_REGISTRATION *prev;
void (*handler)( PEXCEPTION_RECORD,
PEXCEPTION_REGISTRATION,
PCONTEXT,
PEXCEPTION_RECORD);
struct scopetable_entry *scopetable;
int trylevel;
int _ebp;
PEXCEPTION_POINTERS xpointers;
};

在栈里结构为

1
2
3
4
5
6
7
EBP-00 _ebp
EBP-04 trylevel
EBP-08 scopetable数组指针
EBP-0C handler函数地址
EBP-10指向前一个EXCEPTION_REGISTRATION结构
EBP-14 GetExceptionInformation
EBP-18 栈帧中的标准ESP

这里可以看到

trylevel = 0xFFFFFFFF

scopetable 为 00422028

handler 为 00401280

指针为 18FF78,这里说的是下一个,而文章说的是上一个,这个暂时不管

scopetable里每个结构如图

1
2
3
4
5
6
typedef struct _SCOPETABLE
{
DWORD previousTryLevel;
DWORD lpfnFilter;
DWORD lpfnHandler;
} SCOPETABLE, *PSCOPETABLE;

image-20200410224713172

这里previous为空,则置为-1, lpfnFilter就是try代码块地址,而lpfnHandler则是异常处理except地址,若这里未能处理,则传给previous去处理,这里我只有一个异常,便没有下一块

本文作者:NoOne
本文地址https://noonegroup.xyz/posts/11da0e14/
版权声明:转载请注明出处!