LONG NTAPI F_ExceptionHandler(struct _EXCEPTION_POINTERS *ExceptionInfo)
{
printf
(
"VEH!"
);
switch (ExceptionInfo->ExceptionRecord->ExceptionCode)
{
case
EXCEPTION_BREAKPOINT:
printf
(
"√F_ECODE:%08X Int3!\n"
, ExceptionInfo->ExceptionRecord->ExceptionCode);
ExceptionInfo->ContextRecord->Eip++;
return
EXCEPTION_CONTINUE_EXECUTION;
case
EXCEPTION_SINGLE_STEP:
printf
(
"√F_ECODE:%08X SingleStep!\n"
, ExceptionInfo->ExceptionRecord->ExceptionCode);
ExceptionInfo->ContextRecord->EFlags &= 0xFFFFFEFF;
return
EXCEPTION_CONTINUE_EXECUTION;
default:
printf
(
"×F_ECODE:%08X\n"
, ExceptionInfo->ExceptionRecord->ExceptionCode);
return
EXCEPTION_CONTINUE_SEARCH;
}
}
LONG NTAPI L_ExceptionHandler(struct _EXCEPTION_POINTERS *ExceptionInfo)
{
printf
(
"VCH!"
);
switch (ExceptionInfo->ExceptionRecord->ExceptionCode)
{
case
EXCEPTION_SINGLE_STEP:
printf
(
"√L_ECODE:%08X SingleStep!\n"
, ExceptionInfo->ExceptionRecord->ExceptionCode);
ExceptionInfo->ContextRecord->EFlags &= 0xFFFFFEFF;
return
EXCEPTION_CONTINUE_EXECUTION;
case
EXCEPTION_BREAKPOINT:
printf
(
"√L_ECODE:%08X Int3!\n"
, ExceptionInfo->ExceptionRecord->ExceptionCode);
ExceptionInfo->ContextRecord->Eip++;
return
EXCEPTION_CONTINUE_EXECUTION;
default:
printf
(
"×L_ECODE:%08X\n"
, ExceptionInfo->ExceptionRecord->ExceptionCode);
return
EXCEPTION_CONTINUE_SEARCH;
}
}
LONG NTAPI MyUEF(struct _EXCEPTION_POINTERS *ExceptionInfo)
{
printf
(
"UEF!"
);
switch (ExceptionInfo->ExceptionRecord->ExceptionCode)
{
case
EXCEPTION_SINGLE_STEP:
printf
(
"√U_ECODE:%08X SingleStep!\n"
, ExceptionInfo->ExceptionRecord->ExceptionCode);
ExceptionInfo->ContextRecord->EFlags &= 0xFFFFFEFF;
return
EXCEPTION_CONTINUE_EXECUTION;
printf
(
"×U_ECODE:%08X\n"
, ExceptionInfo->ExceptionRecord->ExceptionCode);
return
EXCEPTION_CONTINUE_SEARCH;
return
EXCEPTION_EXECUTE_HANDLER;
case
EXCEPTION_BREAKPOINT:
printf
(
"√U_ECODE:%08X Int3!\n"
, ExceptionInfo->ExceptionRecord->ExceptionCode);
ExceptionInfo->ContextRecord->Eip++;
return
EXCEPTION_CONTINUE_EXECUTION;
printf
(
"×U_ECODE:%08X\n"
, ExceptionInfo->ExceptionRecord->ExceptionCode);
return
EXCEPTION_CONTINUE_SEARCH;
return
EXCEPTION_EXECUTE_HANDLER;
default:
printf
(
"×U_ECODE:%08X\n"
, ExceptionInfo->ExceptionRecord->ExceptionCode);
return
EXCEPTION_CONTINUE_SEARCH;
return
EXCEPTION_EXECUTE_HANDLER;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
AddVectoredExceptionHandler(0, F_ExceptionHandler);
AddVectoredContinueHandler(0, L_ExceptionHandler);
__asm xor eax,eax
__asm mov dword ptr fs : [0], eax
/* 设置uef */
SetUnhandledExceptionFilter(MyUEF);
printf
(
"准备抛出单步异常\n"
);
/* 激活TF标志位 */
__asm pushfd
__asm or dword ptr [esp],0x100
__asm popfd
__asm nop
//
此处单步异常
printf
(
"准备抛出断点异常\n"
);
/* 触发int3断点 */
__asm int 3
//
此处断点异常
__asm nop
return
0;
}