SetUnhandledExceptionFilter触发条件:
1、当程序有异常,且没相应的处理
2、没有人进行反调试,满足这两个条件的时候,就会其中传输的参数(实则就是一个异常处理函数) 来进行处理
但是这个异常处理函数如果被用来检测是否有人为进行反调试的时候,这个就可以用来当作反调试
1、载入OD,给UnhandledExceptionFilter下断点,因为UnhandledExceptionFilter里面又调用了ZwQueryInformationProcess进行反调试检测
2、可以发现ZwQueryInformationProcess传入的参数为如下
3、跟随缓冲区的数据为如下
4、F8单步步过,发现缓冲区保存的值已经发生了改变,当这个值不是为00000000的时候那么被判断为有人为的在进行调试
然后直接被结束进程
5、那么如果我们把缓冲区的值置为0看下,已经知道了接下来会进行的事情SetUnhandledExceptionFilter触发条件,有异常,没人处理,没人调试,所以肯定触发SetUnhandledExceptionFilter中传入的处理参数,那么给这个处理函数也下个断点
6、下完之后,重复如上操作,然后缓冲区的值置为0,就被断到如下地址
7、F8,来到关键跳,来到这里就已经代表了,此时是正常运行,并且把输入的值进行正常的判断,如果这个跳转跳了那么就是输入错误,没跳就是输入正确,那么将ZF置1进行不跳转,发现成功
总结:程序的作者先是故意触发异常,让UnhandledExceptionFilter进行处理,然后在其中调用了ZwQueryInformationProcess进行反调试的检测,如果发现没有人进行反调试,并且当程序有异常,且没相应的处理 ,就会将SetUnhandledExceptionFilter中处理异常的函数进行处理,而这个异常的函数处理也就是账号密码的验证