设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 手机 数据
当前位置: 首页 > 运营中心 > 建站资源 > 策划 > 正文

26种对付反调试的方法(6)

发布时间:2019-03-21 12:55 所属栏目:20 来源:luochicun
导读:Trap Flag(陷阱标识)位于EFLAGS寄存器内,如果TF设置为1,CPU将在每个指令执行后产生INT 01h或单步异常(single-step exception)。以下就是基于TF设置和异常调用检查的反调试: BOOLisDebugged=TRUE; __try { __as

Trap Flag(陷阱标识)位于EFLAGS寄存器内,如果TF设置为1,CPU将在每个指令执行后产生INT 01h或单步异常(single-step exception)。以下就是基于TF设置和异常调用检查的反调试:

  1. BOOL isDebugged = TRUE; 
  2. __try 
  3.     __asm 
  4.     { 
  5.         pushfd 
  6.         or dword ptr[esp], 0x100 // set the Trap Flag  
  7.         popfd                    // Load the value into EFLAGS register 
  8.         nop 
  9.     } 
  10. __except (EXCEPTION_EXECUTE_HANDLER) 
  11.     // If an exception has been raised – debugger is not present 
  12.     isDebugged = FALSE; 
  13. if (isDebugged) 
  14.     std::cout << "Stop debugging program!" << std::endl; 
  15.     exit(-1); 

这里TF有意设置为生成异常。如果正在调试进程,则异常将被调试器捕获。

如何避开陷阱标识检查

为了在调试过程中避开TF标识检查,应该将pushfd指令传递给单步异常,但要跳过它,将断点置后,继续执行程序。断点后,跟踪可以继续。

CheckRemoteDebuggerPresent和NtQueryInformationProcess

与IsDebuggerPresent函数不同,CheckRemoteDebuggerPresent会检查一个进程是否被另一个同步进程调试。下图就是一个基于CheckRemoteDebuggerPresent的反调试技术:

  1. int main(int argc, char *argv[]) 
  2.     BOOL isDebuggerPresent = FALSE; 
  3.     if (CheckRemoteDebuggerPresent(GetCurrentProcess(), &isDebuggerPresent )) 
  4.     { 
  5.         if (isDebuggerPresent ) 
  6.         { 
  7.             std::cout << "Stop debugging program!" << std::endl; 
  8.             exit(-1); 
  9.         } 
  10.     } 
  11.     return 0; 

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读