00401000 >/$ E8 0B000000 CALL seh.00401010 ;//下一条指令入栈(返回地址) 00401005 |. 8B6424 08 MOV ESP,DWORD PTR SS:[ESP+8] ;//指向lpseh。lpseh是我们EXCEPTION_REGISTRATION结构的地址。 00401009 |. 31C0 XOR EAX,EAX 0040100B |. 64:8F00 POP DWORD PTR FS:[EAX];//取出EXCEPTION_REGISTRATION->prev ;前一个_EXCEPTION_REGISTRATION结构 0040100E |. 59 POP ECX; //修正堆栈 0040100F /. C3 RETN 00401010 /$ 31D2 XOR EDX,EDX 00401012 |. 64:FF32 PUSH DWORD PTR FS:[EDX] ;//SEH链 00401015 |. 64:8922 MOV DWORD PTR FS:[EDX],ESP 00401018 |. CD 03 INT 3 ; //人为引发异常 0040101A /. C3 RETN #include <windows.h> #include <stdio.h> void testException() { printf("begin test execeptin .... /n") ; printf("shit .... /n") ; printf("shit .... /n") ; __asm { mov eax, 100h mov [eax], eax } printf("testException/r/n"); } int main(void) { printf("main function begin../n") ; __asm { push offset LBL push dword ptr fs:[0]; mov dword ptr fs:[0], esp; } testException() ; goto LBL2; LBL: __asm { mov esp, dword ptr ss:[esp+8]; LBL2: pop dword ptr fs:[0]; add esp, 4; } printf("the end/n") ; return 0 ; }