Win32 SEH 地址

逆向工程
2021-06-11 12:07:35

我在一些教程中阅读了这种代码:

push handler ; Address of handler function
push FS:[0] ; Address of previous handler
mov FS:[0],ESP ; Install new Handler

我不明白一些事情:对我来说,2 次推送的顺序不太好。旧处理程序上的 ESP 点数?但是我读过的所有教程都是这样的......所以如果有人能解释我......

2个回答

那么评论:“安装新处理程序”有点误导。您正在安装的是EXCEPTION_REGISTRATION_RECORD,如果您要检查此结构的外观,则更明显的是,这是这样的:

typedef struct _EXCEPTION_REGISTRATION_RECORD
{
     PEXCEPTION_REGISTRATION_RECORD Next;
     PEXCEPTION_DISPOSITION Handler;
} EXCEPTION_REGISTRATION_RECORD, *PEXCEPTION_REGISTRATION_RECORD;

FS:[0]也不指向处理程序本身,而是指向相同的EXCEPTION_REGISTRATION_RECORD结构。因此,at 的前一条记录FS:[0]转到 ,Next而您正在安装的记录转到Handler.

命名也有点混乱,因为我们称它为前一个处理程序,但它被设置为Next字段。

fs:[0] 指向 ETHREAD

它的第一个成员是 NtTib,它又是一个结构,其第一个成员是 _EXCEPTION_REGISTRATION_RECORD

0:000> dt ntdll!_TEB NtTib.* @$thread
   +0x000 NtTib  : 
      +0x000 ExceptionList : 0x0010f76c _EXCEPTION_REGISTRATION_RECORD
      +0x004 StackBase : 0x00110000 Void
      +0x008 StackLimit : 0x0010d000 Void
      +0x00c SubSystemTib : (null) 
      +0x010 FiberData : 0x00001e00 Void
      +0x010 Version : 0x1e00
      +0x014 ArbitraryUserPointer : (null) 
      +0x018 Self   : 0x7ffde000 _NT_TIB



0:000> ? @$thread
Evaluate expression: 2147344384 = 7ffde000

异常注册记录包含异常处理程序链

0:000> dx -r2 ((ntdll!_EXCEPTION_REGISTRATION_RECORD *)0x10f76c)
((ntdll!_EXCEPTION_REGISTRATION_RECORD *)0x10f76c)                 : 0x10f76c [Type: _EXCEPTION_REGISTRATION_RECORD *]
    [+0x000] Next             : 0x10f91c [Type: _EXCEPTION_REGISTRATION_RECORD *]
        [+0x000] Next             : 0xffffffff [Type: _EXCEPTION_REGISTRATION_RECORD *]
        [+0x004] Handler          : 0x77ade115 [Type: _EXCEPTION_DISPOSITION (*)(_EXCEPTION_RECORD *,void *,_CONTEXT *,void *)]
    [+0x004] Handler          : 0x77ade115 [Type: _EXCEPTION_DISPOSITION (*)(_EXCEPTION_RECORD *,void *,_CONTEXT *,void *)]
        [Type: _EXCEPTION_DISPOSITION (_EXCEPTION_RECORD *,void *,_CONTEXT *,void *)]

像这样

0:000> !exchain
0010f76c: ntdll!_except_handler4+0 (77ade115)
  CRT scope  0, filter: ntdll!LdrpDoDebuggerBreak+32 (77b605ac)
                func:   ntdll!LdrpDoDebuggerBreak+36 (77b605b0)
0010f91c: ntdll!_except_handler4+0 (77ade115)
  CRT scope  0, filter: ntdll!_LdrpInitialize+db (77b40ee4)
                func:   ntdll!_LdrpInitialize+f0 (77b40ef9)
Invalid exception stack at ffffffff

当你推动处理程序时

esp 将持有处理程序

esp  0x12345678 _SEH_HANDLER

当您按下 fs:[0] 时,您将指针推入

dx -r2 ((ntdll!_EXCEPTION_REGISTRATION_RECORD *)0x10f76c)

0:000> dd esp
0010f750  779f8159 00000000 00000000 7ffdf000

0:000> a 
77b605a6 push fs:[0]
push fs:[0]
77b605ad 

0:000> p

0:000> dd esp
0010f74c  **0010f76c** 779f8159 00000000 00000000
0010f75c  7ffdf000 00000000 0010f750 77ade115

mov fs:[0] esp

这样你就可以用新的 EXCEPTION_REGISTRATION_RECORD 换掉旧的 EXCEPTION_REGISTRATION_RECORD