我在一些教程中阅读了这种代码:
push handler ; Address of handler function
push FS:[0] ; Address of previous handler
mov FS:[0],ESP ; Install new Handler
我不明白一些事情:对我来说,2 次推送的顺序不太好。旧处理程序上的 ESP 点数?但是我读过的所有教程都是这样的......所以如果有人能解释我......
我在一些教程中阅读了这种代码:
push handler ; Address of handler function
push FS:[0] ; Address of previous handler
mov FS:[0],ESP ; Install new Handler
我不明白一些事情:对我来说,2 次推送的顺序不太好。旧处理程序上的 ESP 点数?但是我读过的所有教程都是这样的......所以如果有人能解释我......
那么评论:“安装新处理程序”有点误导。您正在安装的是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