SEH结构化异常处理
GetThreadContext和SetThreadContext可获取和设置线程上下文,调用前先SuspendThread,完毕后再ResumeThread。
CPU抛出的都是硬件异常,操作系统和软件抛出的异常称为软件异常。
异常过滤程序(exception filter)和异常处理程序(exception handler)由操作系统负责执行。
结构化异常处理Structured Exception Handling
SetUnhandledExceptionFilter给了我们处理异常的机会,抛出的未处理异常会被参数指定的异常过滤函数执行,函数要返回以下三者之一:
EXCEPTION_EXECUTE_HANDLER :从UnhandledExceptionFilter返回并执行关联的异常处理程序,程序流程不能继续执行,通常导致进程终止。
EXCEPTION_CONTINUE_SEARCH :从UnhandledExceptionFilter返回,并从异常开始继续执行。
EXCEPTION_CONTINUE_EXECUTION :继续搜索上一级。
由于附加了调试器,系统优先把异常交给调试器,我们设置的异常过滤函数无法执行,UnhandledExceptionFilter中调用了ZwQueryInformationProcess,参数ProcessInformationClass 传递了ProcessDebugPort,用来检测是否被调试,被调试则不执行我们设置的异常过滤函数。手动更改跳转,或者让其传递ProcessDebugPort调用时返回0,就可以调试自己的异常过滤函数了。
Masm32中跨函数访问标号标号时,需要在定义标号处写::符号,例如:
Foo proc
FUNC_START::
Foo endp
一个基于SEH的反调试的例子,检测代码中是否有CC断点。