您的位置:首页 > 其它

SEH原理剖析

2017-11-05 22:44 162 查看
用户层数据结构 TEB

TEB 第一个字段是NtTib,NtTib的第一个字段ExceptionList是一个链表的头结点的首

地址.

当产生异常,系统会通过FS:[0]找到这个链表,依次调用处理异常.

typedef struct _EXCEPTION_REGISTRATION_RECORD{

struct _EXCEPTION_REGISTRATION_RECORD* next; //下一个seh

PEXCEPTION_ROUTINE Handler; //异常处理函数

}EXCEPTION_REGISTRATION_RECORD

SEH函数原型

LONG NTAPI sehExcept(

_Inout_struct_EXCEPTION_RECORD* ExceptionRecord; //异常信息

_In_PVOID EstablisherFrame;

_Inout_struct_CONTEXT* ContextRecord; //寄存器状态信息

_In_PVOID DispatcherContext);

//手工注册SEH

//代码实现

LONG NTAPI sehExcept(

_Inout_struct_EXCEPTION_RECORD* ExceptionRecord; //异常信息

_In_PVOID EstablisherFrame;

_Inout_struct_CONTEXT* ContextRecord; //寄存器状态信息

_In_PVOID DispatcherContext)

{

printf(“123456”);

return 0;

}

void fun()

{

EXCEPTION_REGISTRATION_RECORD sehNode; //新SEH

//将异常过滤函数保存到节点中

sehNode.Handler = (PEXCEPTION_ROUTINE)seExcept;

sehNode.Next = 0;

//获取旧的SEH头结点

_asm mov eax,DWORD PTR FS:[0];

//将旧的SEH头结点的地址保存待Next中

_asm mov DWORD PTR DS:[sehNode.Next],eax;

//将新结点的首地址保存大FS:[0]

_asm lea eax,sehNode;

_asm mov FS:[0],eax;

//抛出异常

(int)0 = 0;

//从异常链中删除本次的SEH结点

_asm mov eax,DOWRD PTR DS:[sehNode.Next];

_asm mov fs:[0],eax;

}

int main()

{

__try{

fun()

}

__except(1)

{

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: