加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

26种对付反调试的方法

发布时间:2019-03-22 03:36:50 所属栏目:建站 来源:luochicun
导读:今朝首要有3种说明软件的要领: 1.数据互换说明,研究职员行使数据包嗅探器材来说明收集数据互换。 2.对软件的二进制代码举办反汇编,然后以汇编说话列出。 3.字节码解码或二进制解码,然后以高级编程说话从头建设源代码。 本文针对的是Windows操纵体系中

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; 

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读