一段简单的反调试代码

Submitted by 李马 on 2008, July 25, 11:06 AM. 技术的角落

本文链接:http://www.titilima.cn/show-258-1.html

对于检测调试器来说,其实 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 的异常过滤掉,也就是直接传递给应用程序即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值