使用DLL_THREAD_ATTACH阻止远程线程

当进程创建一个线程的的时候,系统会检查当前映射到该进程的地址空间中的所有DLL文件映像,并用DLL_THREAD_ATTACH来调用每个DLL的DllMain函数,新创建的线程负责执行所有DLL的DllMain函数中的代码。系统不会让进程的主线程调用DLL_THREAD_ATTACH的值来调用DllMain函数。
       此时新线程已经被创建但尚未执行,更精确的说已经创建了线程内核对象、线程堆栈等资源,正处于初始化阶段。只有在每个DLL都正常处理DLL_THREAD_ATTCH通知,新线程才能开始执行!

   远程线程本质与本地线程一样,区别只是由其他进程创建。我们就是要写个DLL,在收到DLL_THREAD_ATTACH时通知结束线程,那么远程线程就无法执行了。

代码:

[cpp]  view plain copy
  1. // 创建标识  
  2. // 创建线程之前设置为TRUE,表示需要创建一个合法的线程  
  3. // 只有合法线程才能正常创建  
  4. BOOL bStatus = FALSE ;  
  5.   
  6.   
  7. VOID MY_OutputDebugStringA ( const char* szFormat,...)  
  8. {  
  9.     char szBuf[1024] ;  
  10.   
  11.     va_list argList ;  
  12.     va_start ( argList, szFormat ) ;  
  13.     vsprintf ( szBuf, szFormat, argList ) ;  
  14.     va_end ( argList ) ;  
  15.   
  16.     OutputDebugStringA ( szBuf ) ;  
  17. }  
  18.   
  19. // 设置线程创建标识  
  20. VOID  SetStatus ( BOOL status )  
  21. {  
  22.     bStatus = status ;  
  23. }  
  24. BOOL APIENTRY DllMain( HMODULE hModule,  
  25.                        DWORD  ul_reason_for_call,  
  26.                        LPVOID lpReserved  
  27.                      )  
  28. {  
  29.     switch (ul_reason_for_call)  
  30.     {  
  31.     case DLL_PROCESS_ATTACH:  
  32.     case DLL_THREAD_ATTACH:  
  33.         MY_OutputDebugStringA ( "DLL_THREAD_ATTACH ThreadId=%d", GetCurrentThreadId() ) ;  
  34.   
  35.         // 检测线程创建标识  
  36.         if ( bStatus == FALSE )  
  37.         {  
  38.             // 如果线程创建标识为FALSE,就直接结束线程  
  39.             MY_OutputDebugStringA ( "Terminate unvalid thread!" ) ;  
  40.             TerminateThread (GetCurrentThread(),0 ) ;  
  41.         }  
  42.         else  
  43.         {  
  44.             // 每次创建合法线程后,自动关闭创建标识  
  45.             // 每次设置合法线程标识只能使用一次  
  46.             SetStatus ( FALSE ) ;  
  47.         }  
  48.         break;  
  49.     case DLL_THREAD_DETACH:  
  50.         MY_OutputDebugStringA ( "DLL_THREAD_DETACH ThreadId=%d", GetCurrentThreadId() ) ;  
  51.         break ;  
  52.     case DLL_PROCESS_DETACH:  
  53.         break;  
  54.     }  
  55.     return TRUE;  
  56. }  

SetStatus函数要导出一下

为了能使本程序自身正常创建线程

代码:

[cpp]  view plain copy
  1. SetStatus(TRUE);  
  2.     CreateThread(NULL,0,NewThread,NULL,0,NULL);  

你可能感兴趣的:(使用DLL_THREAD_ATTACH阻止远程线程)