转载至 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;
}