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

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

发布时间:2019-03-21 12:55 所属栏目:20 来源:luochicun
导读:上面的示例显示了对SEH处理程序的设置,指向SEH Frame的指针放在处理程序链的开头,然后产生int 3h中断。如果应用程序未被调试,则控制将被传送到SEH处理程序,g_isDebuggerPresent值将被设置为FALSE。 ContextReco

上面的示例显示了对SEH处理程序的设置,指向SEH Frame的指针放在处理程序链的开头,然后产生int 3h中断。如果应用程序未被调试,则控制将被传送到SEH处理程序,g_isDebuggerPresent值将被设置为FALSE。 ContextRecord-> Eip + = 1行更改执行流程中下一条指令的地址,这将导致执行int 3h后的指令。然后代码返回原始SEH处理程序,清除堆栈,并检查调试器是否存在。

如何避开SEH检查

虽然不存在一个普遍的方法,但还是有一些技术,能够实现这一点。我们来看看利用调用堆栈如何导致SEH处理程序调用:

  1. 0:000> kn 
  2.  # ChildEBP RetAddr   
  3. 00 0059f06c 775100b1 AntiDebug!ExceptionRoutine  
  4. 01 0059f090 77510083 ntdll!ExecuteHandler2+0x26 
  5. 02 0059f158 775107ff ntdll!ExecuteHandler+0x24 
  6. 03 0059f158 003b11a5 ntdll!KiUserExceptionDispatcher+0xf 
  7. 04 0059fa90 003d7f4e AntiDebug!main+0xb5 
  8. 05 0059faa4 003d7d9a AntiDebug!invoke_main+0x1e 
  9. 06 0059fafc 003d7c2d AntiDebug!__scrt_common_main_seh+0x15a  
  10. 07 0059fb04 003d7f68 AntiDebug!__scrt_common_main+0xd  
  11. 08 0059fb0c 753e7c04 AntiDebug!mainCRTStartup+0x8 
  12. 09 0059fb20 7752ad1f KERNEL32!BaseThreadInitThunk+0x24 
  13. 0a 0059fb68 7752acea ntdll!__RtlUserThreadStart+0x2f 
  14. 0b 0059fb78 00000000 ntdll!_RtlUserThreadStart+0x1b 

接着我们就要分析每个被称为SEH处理程序的代码,如果保护是基于SEH处理程序的多次呼叫,则很难就行反调试了。

VEH(向量化异常处理)

VEH是从Windows XP开始引入的,虽然它是SEH的一个变体,但两者彼此独立运行, VEH优先权高于SHE,只有VEH不处理某个异常的时候,异常处理权才会到达SEH.。当添加新的VEH处理程序时,SEH链不受影响,因为VEH处理程序的列表存储在ntdll!LdrpVectorHandlerList非导出的变量中。 VEH和SEH机制非常相似,唯一的区别是记录功能被用于设置和删除VEN处理程序。添加和删除VEH处理程序以及VEH处理函数的原函数签名如下:

  1. PVOID WINAPI AddVectoredExceptionHandler( 
  2.     ULONG                       FirstHandler, 
  3.     PVECTORED_EXCEPTION_HANDLER VectoredHandler 
  4. ); 
  5. ULONG WINAPI RemoveVectoredExceptionHandler( 
  6.     PVOID Handler 
  7. ); 
  8. LONG CALLBACK VectoredHandler( 
  9.     PEXCEPTION_POINTERS ExceptionInfo 
  10. ); 
  11. The _EXCEPTION_POINTERS structure looks like this:   
  12. typedef struct _EXCEPTION_POINTERS { 
  13.   PEXCEPTION_RECORD ExceptionRecord; 
  14.   PCONTEXT          ContextRecord; 
  15. } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS; 

在处理程序中收到控制权后,系统会收集当前进程的上下文并通过ContextRecord参数进行传递。以下就是一个使用向量异常处理的反调试保护代码:

  1. LONG CALLBACK ExceptionHandler(PEXCEPTION_POINTERS ExceptionInfo) 
  2.     PCONTEXT ctx = ExceptionInfo->ContextRecord; 
  3.     if (ctx->Dr0 != 0 || ctx->Dr1 != 0 || ctx->Dr2 != 0 || ctx->Dr3 != 0) 
  4.     { 
  5.         std::cout << "Stop debugging program!" << std::endl; 
  6.         exit(-1); 
  7.     } 
  8.     ctx->Eip += 2; 
  9.     return EXCEPTION_CONTINUE_EXECUTION; 
  10. int main() 
  11.     AddVectoredExceptionHandler(0, ExceptionHandler); 
  12.     __asm int 1h; 
  13.     return 0; 

(编辑:ASP站长网)

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