(近日遇到大量SEH问题,所以觉得有必要好好研究研究。)
一、SEH的汇编实现
从实践入手,汇编实现SEH其实不难。简单点如下指令:
push offset_exception_function_address
push fs:[0]
mov fs:[0], esp
二、SEH的简单理解
SEH(Structured Exception Handling),是Windows下的一个结构化异常处理。和C++所提倡的不同。(这里区分于try{}catch{}结构,应该是__try{}__except{int}的结构。至于具体的不同,还需要翻阅资料。)简单点理解,每个线程都有自己的SEH链表,链表元素为指向异常处理函数的指针及指向下个异常处理函数地址的指针。链表尾部用0xFFFFFFFF代表。
这样理解上面的汇编代码就好多了。把新加入的异常处理函数地址压入栈中,再压入SEH的链表头地址(既是指向上一异常处理函数地址的指针),然后把此时的ESP存放到FS:[0]中。这样就是实现了异常处理函数的加入。
关于FS段,暂时可以简单理解为FS:[0]是指向SEH链表头的指针。至于其它的还需要进一步学习才能掌握。