利用SEH反调试
在SEH的机制下,当发生异常时,操作系统会接收这个异常然后调用进程中注册的SEH处理,但这样的异常发生在调试中时,异常就会由调试器来接收处理,根据这个特征就可用来反调试。
EXCEPTION_BREAKPOINT是断点异常,若程序处于调试运行状态。则系统会立刻停止运行程序,并将控制权交给调试器。所以当遇到int3指令时,正常运行的程序会调用SEH中的代码处理,而调试中的程序什么也不做直接运行后面的代码,而后面的代码通常是错误的。那么关键点就在SEH的处理函数中了,通常会修改EIP的值。不过我们可以使调试器忽略int3异常来简单的使这种反调试无效
UnhandledExceptionFilter函数在没有注册SEH且发生异常时被操作系统调用,这个函数内部会运行系统内部最后一个异常处理器,这个异常处理器通常叫做Top Level Exception Filter或Last Exception Filter,而这个函数可以通过使用SetUnhandledExceptionFilter来设置,它的参数就是Last Exception Filter函数的地址。在UnhanledExceptionFilter函数中,会使用NtInformationProcess函数,且第2个参数为7,表示DebugPort,来检测调试状态,若程序处于非调试状态,则正常运行异常处理器,若程序是在调试状态运行,则将异常处理工作交个调试器,这样异常处理器无法执行,使得程序运行会出错,就可以用来进行反调试,并且我们可以在异常处理器中再进行一次调试检测来反调试,这样的保护要去除是比较麻烦的。要除掉这种反调试,需要先跟入UnhandledException API中,修改NtInfo