_try_finally原理探究后续

入口程序的最后一道防线

_try_finally原理探究后续_第1张图片

这里调用mainCRTStartup(),然后调用入口程序

_try_finally原理探究后续_第2张图片

相当于这里才是一个进程开始执行的地方

_try_finally原理探究后续_第3张图片

这里有一个call调用,跟进去看看

_try_finally原理探究后续_第4张图片

发现有修改fs:[0]的操作,这里就相当于编译器为我们注册了一个异常处理函数

_try_finally原理探究后续_第5张图片

这里到kernel32.dll里面的BaseProcessStart里面看一下,这里有一个注册SEH异常处理函数的操作

_try_finally原理探究后续_第6张图片

线程启动的最后一道防线

_try_finally原理探究后续_第7张图片

可以发现线程也是从kernel32.dll开始的

_try_finally原理探究后续_第8张图片

然后跟进调用

_try_finally原理探究后续_第9张图片

可以发现还是注册了一个异常处理函数

_try_finally原理探究后续_第10张图片

还是去IDA里面看BaseThreadStart函数,发现也注册了一个SEH异常的函数

_try_finally原理探究后续_第11张图片

UnhandledExceptionFilter

相当于编译器为我们生成了一段伪代码

_try_finally原理探究后续_第12张图片

只有程序被调试时,才会存在未处理异常

UnhandledExceptionFilter的执行流程:

_try_finally原理探究后续_第13张图片

SetUnhandledExceptionFilter

如果没有通过SetUnhandledExceptionFilter注册异常处理函数,则程序崩溃

_try_finally原理探究后续_第14张图片

_try_finally原理探究后续_第15张图片

测试代码如下,我自己构造一个异常处理函数callback并用SetUnhandledExceptionFilter注册,构造一个除0异常,当没有被调试的时候就会调用callback处理异常,然后继续正常运行,如果被调试则不会修复异常,因为这是最后一道防线,就会直接退出,起到反调试的效果

_try_finally原理探究后续_第16张图片

直接启动可以正常运行

_try_finally原理探究后续_第17张图片

使用od打开则直接退出

_try_finally原理探究后续_第18张图片

_try_finally原理探究后续_第19张图片

KiUserExceptionDispatcher

只有当前程序处于调试的时候才可能产生未处理异常

_try_finally原理探究后续_第20张图片

_try_finally原理探究后续_第21张图片

你可能感兴趣的:(开发语言,web安全,网络,安全)