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

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

发布时间:2019-03-21 12:55 所属栏目:20 来源:luochicun
导读:Windows Vista引入了NtCreateThreadEx函数,其函数如下: NTSTATUSNTAPINtCreateThreadEx( _Out_PHANDLEThreadHandle, _In_ACCESS_MASKDesiredAccess, _In_opt_POBJECT_ATTRIBUTESObjectAttributes, _In_HANDLEProc

Windows Vista引入了NtCreateThreadEx函数,其函数如下:

  1. NTSTATUS NTAPI NtCreateThreadEx ( 
  2.     _Out_    PHANDLE              ThreadHandle, 
  3.     _In_     ACCESS_MASK          DesiredAccess, 
  4.     _In_opt_ POBJECT_ATTRIBUTES   ObjectAttributes, 
  5.     _In_     HANDLE               ProcessHandle, 
  6.     _In_     PVOID                StartRoutine, 
  7.     _In_opt_ PVOID                Argument, 
  8.     _In_     ULONG                CreateFlags, 
  9.     _In_opt_ ULONG_PTR            ZeroBits, 
  10.     _In_opt_ SIZE_T               StackSize, 
  11.     _In_opt_ SIZE_T               MaximumStackSize, 
  12.     _In_opt_ PVOID                AttributeList 
  13. ); 

最有趣的参数是CreateFlags,这个参数的标识如下:

  1. #define THREAD_CREATE_FLAGS_CREATE_SUSPENDED 0x00000001 
  2. #define THREAD_CREATE_FLAGS_SKIP_THREAD_ATTACH 0x00000002 
  3. #define THREAD_CREATE_FLAGS_HIDE_FROM_DEBUGGER 0x00000004 
  4. #define THREAD_CREATE_FLAGS_HAS_SECURITY_DESCRIPTOR 0x00000010 
  5. #define THREAD_CREATE_FLAGS_ACCESS_CHECK_IN_TARGET 0x00000020 
  6. #define THREAD_CREATE_FLAGS_INITIAL_THREAD 0x00000080    

如果一个新线程获取了THREAD_CREATE_FLAGS_HIDE_FROM_DEBUGGER标识,它将在调试器创建时被隐藏。它是由NtSetInformationThread函数设置的ThreadHideFromDebugger,负责安全运行的代码可以在设置了THREAD_CREATE_FLAGS_HIDE_FROM_DEBUGGER标识的线程中执行。

如何避开NtCreateThreadEx

该技术可以通过钩子NtCreateThreadEx函数来避开,其中THREAD_CREATE_FLAGS_HIDE_FROM_DEBUGGER将被重置。

如何处理跟踪

从Windows XP开始,系统就配置了内核对象句柄跟踪的机制。当跟踪模式打开时,具有处理程序的所有操作都将保存到循环缓冲区,同时也尝试使用不存在的处理程序,例如,使用CloseHandle函数关闭它,将生成EXCEPTION_INVALID_HADNLE异常。如果进程不是从调试器启动,那么CloseHandle函数将返回FALSE。以下就是基于CloseHandle的防调试保护:

  1. EXCEPTION_DISPOSITION ExceptionRoutine( 
  2.     PEXCEPTION_RECORD ExceptionRecord, 
  3.     PVOID             EstablisherFrame, 
  4.     PCONTEXT          ContextRecord, 
  5.     PVOID             DispatcherContext) 
  6.     if (EXCEPTION_INVALID_HANDLE == ExceptionRecord->ExceptionCode) 
  7.     { 
  8.         std::cout << "Stop debugging program!" << std::endl; 
  9.         exit(-1); 
  10.     } 
  11.     return ExceptionContinueExecution; 
  12. int main() 
  13.     __asm 
  14.     { 
  15.         // set SEH handler 
  16.         push ExceptionRoutine 
  17.         push dword ptr fs : [0] 
  18.         mov  dword ptr fs : [0], esp 
  19.     } 
  20.     CloseHandle((HANDLE)0xBAAD); 
  21.     __asm 
  22.     { 
  23.         // return original SEH handler 
  24.         mov  eax, [esp] 
  25.         mov  dword ptr fs : [0], eax 
  26.         add  esp, 8 
  27.     } 
  28.     return 0 

堆栈段操作

(编辑:ASP站长网)

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