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

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

发布时间:2019-03-21 12:55 所属栏目:20 来源:luochicun
导读:SEH是Windows操作系统提供给程序设计者的强有力的处理程序错误或异常处理的工具,允许其接收关于异常情况的通知,例如除数是0导致的错误,引用不存在的指针或执行受限制的指令。这种机制允许处理应用程序中的异常,

SEH是Windows操作系统提供给程序设计者的强有力的处理程序错误或异常处理的工具,允许其接收关于异常情况的通知,例如除数是0导致的错误,引用不存在的指针或执行受限制的指令。这种机制允许处理应用程序中的异常,而无需操作系统操作。如果不对异常进行处理,则会导致异常程序终止。开发人员通常能在堆栈中找到SEH的指针,它们被称为SEH Frame。当前SEH Frame地址位于x64系统的FS选择器或GS选择器的0的偏移处,这个地址指向ntdll!_EXCEPTION_REGISTRATION_RECORD结构:

  1. 0:000> dt ntdll!_EXCEPTION_REGISTRATION_RECORD 
  2.    +0x000 Next             : Ptr32 _EXCEPTION_REGISTRATION_RECORD 
  3.    +0x004 Handler          : Ptr32 _EXCEPTION_DISPOSITION 

当启动异常时,控制将传输到当前的SEH处理程序。根据情况,SEH处理程序应返回一个_EXCEPTION_DISPOSITION值:

  1. typedef enum _EXCEPTION_DISPOSITION { 
  2.     ExceptionContinueExecution, 
  3.     ExceptionContinueSearch, 
  4.     ExceptionNestedException, 
  5.     ExceptionCollidedUnwind 
  6. } EXCEPTION_DISPOSITION; 

如果处理程序返回ExceptionContinueSearch,系统会继续执行指令,从而触发异常。如果处理程序不知道如何处理异常,它应该返回ExceptionContinueSearch,转到系统中的下一个处理程序。你可以使用windbg调试器中的!exchain命令浏览当前的异常链:

  1. 0:000> !exchain 
  2. 00a5f3bc: AntiDebug!_except_handler4+0 (008b7530) 
  3.   CRT scope  0, filter: AntiDebug!SehInternals+67 (00883d67) 
  4.                 func:   AntiDebug!SehInternals+6d (00883d6d) 
  5. 00a5f814: AntiDebug!__scrt_stub_for_is_c_termination_complete+164b (008bc16b) 
  6. 00a5f87c: AntiDebug!_except_handler4+0 (008b7530) 
  7.   CRT scope  0, filter: AntiDebug!__scrt_common_main_seh+1b0 (008b7c60) 
  8.                 func:   AntiDebug!__scrt_common_main_seh+1cb (008b7c7b) 
  9. 00a5f8e8: ntdll!_except_handler4+0 (775674a0) 
  10.   CRT scope  0, filter: ntdll!__RtlUserThreadStart+54386 (7757f076) 
  11.                 func:   ntdll!__RtlUserThreadStart+543cd (7757f0bd) 
  12. 00a5f900: ntdll!FinalExceptionHandlerPad4+0 (77510213) 

(编辑:ASP站长网)

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