| 
                         在Windows 2000中,ThreadHideFromDebugger这项技术用到了常常被用来设置线程优先级的API ntdll!NtSetInformationThread(),它是Windows提供的第一个反调试技术之一,功能非常强大。如果把该标识设置为一个线程,它将停止发送关于调试事件的通知。如果为主线程设置了ThreadHideFromDebugger,则这些事件包括关于程序完成的断点和通知。该标识的值存储在_ETHREAD结构的HideFromDebugger字段中,如下所示: 
- 1: kd> dt _ETHREAD HideFromDebugger 86bfada8 
 - ntdll!_ETHREAD 
 -    +0x248 HideFromDebugger : 0y1 
 
  
以下是设置ThreadHideFromDebugger的示例: 
- typedef NTSTATUS (NTAPI *pfnNtSetInformationThread)( 
 -     _In_ HANDLE ThreadHandle, 
 -     _In_ ULONG  ThreadInformationClass, 
 -     _In_ PVOID  ThreadInformation, 
 -     _In_ ULONG  ThreadInformationLength 
 -     ); 
 - const ULONG ThreadHideFromDebugger = 0x11; 
 - void HideFromDebugger() 
 - { 
 -     HMODULE hNtDll = LoadLibrary(TEXT("ntdll.dll")); 
 -     pfnNtSetInformationThread NtSetInformationThread = (pfnNtSetInformationThread) 
 -         GetProcAddress(hNtDll, "NtSetInformationThread"); 
 -     NTSTATUS status = NtSetInformationThread(GetCurrentThread(),  
 -         ThreadHideFromDebugger, NULL, 0); 
 - } 
 
  
如何避开从调试器隐藏线程 
为了防止应用程序将线程隐藏到调试器中,需要钩住NtSetInformationThread函数调用。以下就是一个钩子代码: 
- pfnNtSetInformationThread g_origNtSetInformationThread = NULL; 
 - NTSTATUS NTAPI HookNtSetInformationThread( 
 -     _In_ HANDLE ThreadHandle, 
 -     _In_ ULONG  ThreadInformationClass, 
 -     _In_ PVOID  ThreadInformation, 
 -     _In_ ULONG  ThreadInformationLength 
 -     ) 
 - { 
 -     if (ThreadInformationClass == ThreadHideFromDebugger &&  
 -         ThreadInformation == 0 && ThreadInformationLength == 0) 
 -     { 
 -         return STATUS_SUCCESS; 
 -     } 
 -     return g_origNtSetInformationThread(ThreadHandle,  
 -         ThreadInformationClass, ThreadInformation, ThreadInformationLength 
 - } 
 -                                          
 - void SetHook() 
 - { 
 -     HMODULE hNtDll = LoadLibrary(TEXT("ntdll.dll")); 
 -     if (NULL != hNtDll) 
 -     { 
 -         g_origNtSetInformationThread = (pfnNtSetInformationThread)GetProcAddress(hNtDll, "NtSetInformationThread"); 
 -         if (NULL != g_origNtSetInformationThread) 
 -         { 
 -             Mhook_SetHook((PVOID*)&g_origNtSetInformationThread, HookNtSetInformationThread); 
 -         } 
 -     } 
 - } 
 
  
在钩子函数中,当以正确的方式调用它时,就将返回STATUS_SUCCESS,而不将控制权转移到原始的NtSetInformationThread函数。 
NtCreateThreadEx                         (编辑:泰州站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |