反调试——异常过滤器
首先什么是异常:很简答就是CPU遇到了无法执行的指令。
异常处理的流程:
CPU->操作系统->调试器(如果有)->VEH->SEH->异常过滤器(SetUnhandleExceptionFilter)
异常过滤器:
#include<Windows.h>
#include<iostream>
using namespace std;
LONG WINAPI myExceptionFilter(_EXCEPTION_POINTERS* ExceptionInfo)
{
MessageBoxA(0, 0, 0, 0);
ExceptionInfo->ContextRecord->Eip += 3;
return EXCEPTION_CONTINUE_EXECUTION;
}
int main()
{
SetUnhandledExceptionFilter(myExceptionFilter);
__asm
{
mov eax,0
mov [eax],1
}
MessageBoxA(NULL, NULL, "跳过了异常代码", MB_OK);
system("pause");
return 0;
}
这段代码就是添加了一个异常过滤器。
__asm
{
mov eax,0
mov [eax],1
}
这一段就是故意触发一个异常来跳转到自己写的异常过滤器函数里面
LONG WINAPI myExceptionFilter(_EXCEPTION_POINTERS* ExceptionInfo)
{
MessageBoxA(0, 0, 0, 0);
ExceptionInfo->ContextRecord->Eip += 3;
return EXCEPTION_CONTINUE_EXECUTION;
}
这一段就是微软提供的异常过滤器的函数格式,参数ExceptionInfo是触发异常的指令的当时环境,也就是寄存器啊各种类型
然后返回值也很重要返回值可以标识是继续执行异常还是跳过异常还是什么样。等等。
有关异常处理的机制经常被用到反调试里面,因为它故意触发异常然后写异常处理来检测是否有调试器。