其他分享
首页 > 其他分享> > 异常链

异常链

作者:互联网

一个进程中可以有多个线程,进程Id可作为线程表的外键。为了快速查询一个进程中的线程信息,可以在进程信息中加入线程表的地址。

 

线程环境块TEB:Thread Environment Block

线程信息块TIB:Thread Information Block

TEB结构起始处保存了TIB,TIB的第一个字段ExceptionList是SEH链表的表头地址。X86系统中,FS总是指向TEB/TIB,所以FS:[0]总是指向SEH链表的表头。

 

 

 

 

 

 

 

 

 

 

 

 

 

ExceptionList指向EXCEPTION_REGISTRATION_RECORD结构:

 

 

 

 

 

SEH处理函数的原型:

EXCEPTION_DISPOSITION __cdecl _except_handler(

    _In_ struct _EXCEPTION_RECORD* _ExceptionRecord,//要处理的异常

    _In_ void*                     _EstablisherFrame, //栈帧中的异常登记结构

    _Inout_ struct _CONTEXT*       _ContextRecord, //异常时线程上下文

    _Inout_ void*                  _DispatcherContext//额外信息

);

 

登记异常处理:

Push sehHandler ;处理函数的地址

Push FS:[0] ;前一个EXCEPTION_REGISTRATION_RECORD地址

Mov FS:[0], esp ;上两句push形成了EXCEPTION_REGISTRATION_RECORD结构,将结构地址赋值给FS:[0],即ExceptionList,以后发生异常时去FS:[0]获取sehHandler。

此时栈结构:

FS:[0]

前一个结构地址

sehHandler

当前handler

 

 

 

注销异常处理:

 

Pop FS:[0] ;前一个结构地址给FS:[0],相当于还原了

Add esp, 4

 

标签:EXCEPTION,FS,RECORD,地址,线程,异常,TIB
来源: https://www.cnblogs.com/Nutshelln/p/13747855.html