反调试技术

Posted glodears

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反调试技术相关的知识,希望对你有一定的参考价值。

ZwQueryInformationProcess

ZwQueryInformationProcess的两个参数:

  1. InfoClass:决定函数的功能(设置为7,将可以获取到当前进程是否被调试的信息)
  2. buffer:判断结果,在OD中不是00 00 00 00就是在调试(即为FFFFFFFF)

实现方式:

通过设置SetUnhandleExceptionFilter(*pfunc)使程序将捕获的异常交给设置的函数处理,即设置处理函数为UnhandleExceptionFilter。如果程序没有收到异常,则退出程序。如果收到异常,则先调用ZwQueryInformationProcess查看是否调试,调试(返回-1)则退出程序。

异常时系统的处理顺序:

  1. 系统首先判断异常是否应发送给目标程序的异常处理例程,如果决定应该发送,并且目标程序正在被调试,则系统 
        挂起程序并向调试器发送EXCEPTION_DEBUG_EVENT消息。
  2. 如果程序没有被调试或者调试器未能处理异常,系统就会继续查找你是否设置了相关的异常处理例程,如果 
        设置了相关的异常处理例程,系统就把异常发送给程序seh处理例程,交由其处理。
  3. 每个线程相关的异常处理例程可以处理或者不处理这个异常,如果他不处理并且安装了多个线程相关的异常处理例程,
            可交由链起来的其他例程处理。
  4. 如果这些例程均选择不处理异常,如果程序处于被调试状态,操作系统仍会再次挂起程序通知调试器。
  5. 如果程序未处于被调试状态或者调试器没有能够处理,并且你调用SetUnhandledExceptionFilter设置了最后异 
        常处理例程UnhandleExceptionFilter的话,系统转向对它的调用。
  6. 如果你没有设置最后异常处理例程UnhandleExceptionFilter或者他没有处理这个异常,系统会调用默认的系统处理程序,通常显示一个对话框,
        用户可以选择关闭或者最后将其附加到调试器上的调试按钮。如果没有调试器能被附加于其上或者调试器也处理不了,系统 
        就调用ExitProcess终结程序。
  7. 不过在终结之前,系统仍然对发生异常的线程异常处理句柄来一次展开,这是线程异常处理例程最后清理的机会。

 

以上是关于反调试技术的主要内容,如果未能解决你的问题,请参考以下文章

一种基于TLS的高级反调试技术

反调试技术

反调试技术

反调试技术总结

Android签名验证与反调试机制的对抗技术

Android签名验证与反调试机制的对抗技术