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
- }
堆栈段操作 (编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|