SEH结构化异常处理

GetThreadContextSetThreadContext可获取和设置线程上下文,调用前先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断点。

 

 

 

 

 

posted @ 2020-09-29 07:13  八转达人  阅读(191)  评论(0编辑  收藏  举报