原生SEH异常实例[VC6]--飘云
//////////////////////////////////////////////////////////////////////////// SEH异常实例 piaoyun
// www.chinapyg.com
// 2013-11-28
//////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <stdio.h>
// SEH 回调函数
EXCEPTION_DISPOSITION __cdecl _except_handler (
struct _EXCEPTION_RECORD *ExceptionRecord,
void * EstablisherFrame,
struct _CONTEXT *ContextRecord,
void * DispatcherContex)
{
printf("SEH异常触发:code-0x%x, flags-0x%x\n",
ExceptionRecord->ExceptionCode,
ExceptionRecord->ExceptionFlags);
if(ExceptionRecord->ExceptionCode == STATUS_INTEGER_DIVIDE_BY_ZERO)
{
printf("异常类型:STATUS_INTEGER_DIVIDE_BY_ZERO\n");
printf("当前ECX:%d\n",ContextRecord->Ecx);
ContextRecord->Ecx = 50;
printf("修正ECX:%d\n",ContextRecord->Ecx);
return ExceptionContinueExecution;
}
return ExceptionContinueSearch;
}
void main()
{
_asm
{
// 注册SEH
PUSH offset _except_handler
PUSH DWORD PTR FS:
MOV DWORD PTR FS:, ESP
// 造成除零异常
XOR EDX, EDX
MOV EAX, 0xC8
XOR ECX, ECX
IDIV ECX
// 取消SEH
POP DWORD PTR FS:
POP EAX
//---或者用下面方法
//mov eax,
//mov fs:, eax
//add esp,8
}
printf("SEH实例运行完毕!\n");
}
页:
[1]