跟了個xx病毒,中間來了個int3,呵呵...
回頭看了看自己以前寫的SEH筆記(http://forum.eviloctal.com/viewthread.php?tid=31901),未果。
/////////////////////////////////////////////////////////////////////////////
from: http://www.xfocus.net/articles/200412/761.html
有點不同的是使用者態下的RtlDispatchException只判斷傳回值是ExceptionContinueExecution還是 ExceptionContinueSearch。若RtlDispatchException找到異常處理常式能夠處理異常,則調用 ZwContinue按照設定好的Context結構繼續執行,否則調用ZwRaiseException,並且把第三個布爾參數設為FALSE,表示進入第二次機會處理。
/////////////////////////////////////////////////////////////////////////////
相關結構:
NTSYSAPI
NTSTATUS
NTAPI
ZwContinue (
IN PCONTEXT Context;
IN BOOLEAN TestAlert
);
typedef struct _CONTEXT {
/*000*/ DWORD ContextFlags;
/*004*/ DWORD Dr0;
/*008*/ DWORD Dr1;
/*00C*/ DWORD Dr2;
/*010*/ DWORD Dr3;
/*014*/ DWORD Dr6;
/*018*/ DWORD Dr7; 調試寄存器
/*01C*/ FLOATING_SAVE_AREA FloatSave ; 浮點寄存器區
/*08C*/ DWORD SegGs;
/*090*/ DWORD SegFs;
/*094*/ DWORD SegEs;
/*098*/ DWORD SegDs; 段寄存器
/*09C*/ DWORD Edi;
/*0A0*/ DWORD Esi;
/*0A4*/ DWORD Ebx;
/*0A8*/ DWORD Edx;
/*0AC*/ DWORD Ecx;
/*0B0*/ DWORD Eax; 通用寄存器
/*0B4*/ DWORD Ebp;
/*0B8*/ DWORD Eip;
/*0BC*/ DWORD SegCs;
/*0C0*/ DWORD EFlags;
/*0C4*/ DWORD Esp;
/*0C8*/ DWORD SegSs; 控制寄存器
/*0CC*/ BYTE ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
/*2CC*/ } CONTEXT;
注意下 /*0B8*/ 位置就是了。