入口程序的最后一道防线
这里调用mainCRTStartup()
,然后调用入口程序
相当于这里才是一个进程开始执行的地方
这里有一个call调用,跟进去看看
发现有修改fs:[0]
的操作,这里就相当于编译器为我们注册了一个异常处理函数
这里到kernel32.dll
里面的BaseProcessStart
里面看一下,这里有一个注册SEH异常处理函数的操作
线程启动的最后一道防线
可以发现线程也是从kernel32.dll
开始的
然后跟进调用
可以发现还是注册了一个异常处理函数
还是去IDA里面看BaseThreadStart
函数,发现也注册了一个SEH
异常的函数
UnhandledExceptionFilter
相当于编译器为我们生成了一段伪代码
只有程序被调试时,才会存在未处理异常
UnhandledExceptionFilter的执行流程:
SetUnhandledExceptionFilter
如果没有通过SetUnhandledExceptionFilter
注册异常处理函数,则程序崩溃
测试代码如下,我自己构造一个异常处理函数callback
并用SetUnhandledExceptionFilter
注册,构造一个除0异常,当没有被调试的时候就会调用callback
处理异常,然后继续正常运行,如果被调试则不会修复异常,因为这是最后一道防线,就会直接退出,起到反调试的效果
直接启动可以正常运行
使用od打开则直接退出
KiUserExceptionDispatcher
只有当前程序处于调试的时候才可能产生未处理异常