"SE 处理程序安装"是什么意思

00520CB0 . 6A FF PUSH -1
00520CB2 . 68 E9D85F00 PUSH 005FD8E9 ; SE 处理程序安装
00520CB7 . 64:A1 0000000>MOV EAX, FS:[0]
00520CBD . 50 PUSH EAX
00520CBE . 64:8925 00000>MOV FS:[0], ESP
00520CC5 . 83EC 0C SUB ESP, 0C
00520CC8 . 56 PUSH ESI
00520CC9 . 8D4424 04 LEA EAX, [ESP+4]
00520CCD . 8BF1 MOV ESI, ECX
00520CCF . 50 PUSH EAX
00520CD0 . 8D4C24 0C LEA ECX, [ESP+C]
00520CD4 . 51 PUSH ECX
00520CD5 . C74424 10 000>MOV DWORD PTR [ESP+10], 0
00520CDD . C74424 0C 000>MOV DWORD PTR [ESP+C], 0

其中:PUSH 005FD8E9 为什么称为"SE 处理程序安装"
MOV FS:[0], ESP 中FS:[0]表示哪个地址
\\\\\\\\\\\\\\\\\\\\\\\\\\\
00520CB2 . 68 E9D85F00 PUSH 005FD8E9 ;
00520CB7 . 64:A1 0000000>MOV EAX, FS:[0]
00520CBD . 50 PUSH EAX
到此,堆栈中形成了
|Fs[0]|
|5fD8e9|
|-1 |
的结构, 其中Fs:[0]指向原来的Exception Registration结构,Exception Registration的定义如下
struct EXCEPTION_REGISTRATION
{
EXCEPTION_REGISTRATION *prev;
DWORD handler;
};
所以FS:[0]就是prev, 5fd8e9就是handler的地址,而此时Esp就指向这个新的EXCEPTION_REGISTRATION结构
00520CBE . 64:8925 00000>MOV FS:[0], ESP
这一句就是用新的结构的指针放在FS:[0]里面,从此自定义的Exception Handler就取代了原来的,除非自定义的handler不愿意处理某个exception,此时旧的才会贝调用

至于为什么把新的Exception Registration结构放在栈里面,这个没有有效的解释,不过大多数Compiler都是这么作的。

SE=Structured Exception
FS:[0]指向Exception Registration的数据结构,里面含有Exception Handler的地址

你可能感兴趣的:(逆向工程asmc++c)