seh结构化异常
纸上得来终觉浅,绝知此事要躬行
以编程层面来演示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
#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; }
|
源代码,跟随到入口函数
跟随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;
|
这里previous为空,则置为-1, lpfnFilter就是try代码块地址,而lpfnHandler则是异常处理except地址,若这里未能处理,则传给previous去处理,这里我只有一个异常,便没有下一块
本文作者:NoOne
本文地址: https://noonegroup.xyz/posts/11da0e14/
版权声明:转载请注明出处!