| 
                         Windows Vista引入了NtCreateThreadEx函数,其函数如下: 
- NTSTATUS NTAPI NtCreateThreadEx ( 
 -     _Out_    PHANDLE              ThreadHandle, 
 -     _In_     ACCESS_MASK          DesiredAccess, 
 -     _In_opt_ POBJECT_ATTRIBUTES   ObjectAttributes, 
 -     _In_     HANDLE               ProcessHandle, 
 -     _In_     PVOID                StartRoutine, 
 -     _In_opt_ PVOID                Argument, 
 -     _In_     ULONG                CreateFlags, 
 -     _In_opt_ ULONG_PTR            ZeroBits, 
 -     _In_opt_ SIZE_T               StackSize, 
 -     _In_opt_ SIZE_T               MaximumStackSize, 
 -     _In_opt_ PVOID                AttributeList 
 - ); 
 
  
最有趣的参数是CreateFlags,这个参数的标识如下: 
- #define THREAD_CREATE_FLAGS_CREATE_SUSPENDED 0x00000001 
 - #define THREAD_CREATE_FLAGS_SKIP_THREAD_ATTACH 0x00000002 
 - #define THREAD_CREATE_FLAGS_HIDE_FROM_DEBUGGER 0x00000004 
 - #define THREAD_CREATE_FLAGS_HAS_SECURITY_DESCRIPTOR 0x00000010 
 - #define THREAD_CREATE_FLAGS_ACCESS_CHECK_IN_TARGET 0x00000020 
 - #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的防调试保护: 
- EXCEPTION_DISPOSITION ExceptionRoutine( 
 -     PEXCEPTION_RECORD ExceptionRecord, 
 -     PVOID             EstablisherFrame, 
 -     PCONTEXT          ContextRecord, 
 -     PVOID             DispatcherContext) 
 - { 
 -     if (EXCEPTION_INVALID_HANDLE == ExceptionRecord->ExceptionCode) 
 -     { 
 -         std::cout << "Stop debugging program!" << std::endl; 
 -         exit(-1); 
 -     } 
 -     return ExceptionContinueExecution; 
 - } 
 - int main() 
 - { 
 -     __asm 
 -     { 
 -         // set SEH handler 
 -         push ExceptionRoutine 
 -         push dword ptr fs : [0] 
 -         mov  dword ptr fs : [0], esp 
 -     } 
 -     CloseHandle((HANDLE)0xBAAD); 
 -     __asm 
 -     { 
 -         // return original SEH handler 
 -         mov  eax, [esp] 
 -         mov  dword ptr fs : [0], eax 
 -         add  esp, 8 
 -     } 
 -     return 0 
 - } 
 
  
堆栈段操作                         (编辑:泰州站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |