browser icon
You are using an insecure version of your web browser. Please update your browser!
Using an outdated browser makes your computer unsafe. For a safer, faster, more enjoyable user experience, please update your browser today or try a newer browser.

一段简单的反调试代码

Posted by on 2008 年 07 月 25 日

你可以任意转载本文,但请在转载后的文章中注明作者和原始链接。
媒体约稿请联系 titilima_AT_163.com(把“_AT_”换成“@”)。

对于检测调试器来说,其实 Win32 API 中有现成的 IsDebuggerPresent 可以使用,不过调试器可以很容易地挂钩这个 API,使得被调试的进程检测调试器失败。
这里给出一段简单的代码,比 IsDebuggerPresent 更保险些:

C++代码
  1. #include <stdio.h>   
  2. #include <excpt.h>   
  3.   
  4. int main(void)   
  5. {   
  6.     __try  
  7.     {   
  8.         __asm int 3;   
  9.         puts("Debugger detected!");   
  10.     }   
  11.     __except (EXCEPTION_EXECUTE_HANDLER)   
  12.     {   
  13.         puts("I’m ok!");   
  14.     }   
  15.   
  16.     return 0;   
  17. }  

原理很简单,也就是利用了 Win32 的异常处理机制:当 __try 块中的 int 3 执行后,会触发内核的 KiTrap03 例程,这时如果有调试器的存在,那么 int 3 下面的代码就会被调试器执行;如果没有调试器的存在,那么代码将会跳至 __except 块中执行。
当然,对抗这一段代码的方式也很简单,只需要在调试器的设置中把 int 3 的异常过滤掉,也就是直接传递给应用程序即可。

移步观看:An Anti-Reverse Engineering Guide

订阅本站

一条评论

  • At 2008.07.29 19:03, 花好月圆 said:

    据说c语言要反调试,有很简单的一招,
    变量使用之却不声明之~对C不太熟悉~

    (Required)
    (Required, will not be published)