转载至 http://bbs.pediy.com/showthread.php?t=46690
一般情况下我们在 VS2005以上都不能手动设置SEH异常处理函数
因为有 SafeSEH 保护
但是可以将保护的SEH验证给篡改掉 也就是将 系统的SEH函数JMP我们的异常函数地址
如下:
#include "stdafx.h" #include <Windows.h> int __stdcall CatchProc(EXCEPTION_RECORD* pExcept,void* pErr,void* pContext,void* p_Dis) { if (pExcept->ExceptionCode == EXCEPTION_BREAKPOINT) { printf("catched"); return 0; } printf("catched"); return 1; } bool __stdcall SetCatchProc(void* pCProc) { char* p_ExpProcEntry; __asm { mov eax,fs:[0] add eax,4 mov eax,dword ptr [eax] mov p_ExpProcEntry,eax } DWORD p_oldProtect = 0; if (VirtualProtect(p_ExpProcEntry,5,PAGE_EXECUTE_READWRITE,&p_oldProtect)) { *(BYTE*)p_ExpProcEntry = 0xE9; *(DWORD*)(p_ExpProcEntry+1)=(char*)pCProc-p_ExpProcEntry-5; return true; } return false; } int _tmain(int argc, _TCHAR* argv[]) { SetCatchProc(CatchProc); int i=0; int sum = 5/i; char p1[255]; gets(p1); return 0; }