Windows下的异常处理_2

Windows下的异常处理学习笔记

Posted by breakingdevil on January 4, 2019

Windows下的异常处理_2

《加密与解密4》读书笔记。

SEH的概念及基本知识

​ 在没有调试器参与的情况下,Windows系统主要靠SEH和VEH机制处理错误。SEH是一种错误保护和修复机制,它告诉系统当前的错误或者异常应当由谁来处理。从程序设计的角度来说,就是系统结束程序时给程序提供执行回调函数的机会。

SEH的相关数据结构

1.TIB结构(Thread Infomation Block)

​ 在用户模式下,TIB为于TEB(Thread Environment Block)的头部,TEB是私有数据,是操作系统为每个线程创建的。

TIB格式如下:

typedef struct _NT_TIB{
    struct _EXCEPTION_REGISTRATION_RECORD *Exception_List;
    PVOID StackBase;
    PVOID StackLimit;
    PVOID SubSystemTib;
    union {
      PVOID FiberData;
      ULONG Version;
    };

    PVOID ArbitraryUserPointer;
    sruct _NT_TIB *Self;
}NT_TIB;

与异常处理相关的是_EXCEPTION_REGISTRATION_RECORD,它在TIB偏移为0处,TEB偏移为0处。当x86模式下,fs:[0]总是指向TEB数据,当x64平台上为gs:[0]。当程序线程为内核态时,fs指向内核中的KPCRB结构(Kernel Process Control Region Block)

2. _EXCEPTION_REGISTRATION_RECORD结构

_EXCEPTION_REGISTRATION_RECORD 主要用于描述线程异常处理过程的地址,多个该结构描述了多个线程异常处理过程的嵌套层次关系。

typedef struct _EXCEPTION_REGISTRATION_RECORD{
    sruct _EXCEPTION_REGISTRATION_RECORD *Next;
    PEXCEPTION_ROUTINE Handler;
}EXCEPTION_REGISTRATION_RECORD;

ERR指向下一个ERR形成链状结构,当发生异常时,系统会依次调用异常处理函数的回调函数。SEH链是一个只允许在头部插入删除和增加的单向链表,头部永远保存在fs或者gs中。

3. _EXCEPTION_POINTERS 结构

在异常发生时,操作系统会把本次的异常信息EXCEPTION_RECORD和CONTEXT放入栈中,同时放入EXCEPTION_POINTERS。

typedef struct _EXCEPTION_POINTERS{
    PEXCEPTION_POINTERS ExceptionRecord;
    PCONTEXT ContextRecord;
}EXCEPTION_POINTERS,*PEXCEPTION_POINTERS;