Injector.h
上传用户:jstlsd
上传日期:2007-01-13
资源大小:186k
文件大小:5k
源码类别:

钩子与API截获

开发平台:

Visual C++

  1. //---------------------------------------------------------------------------
  2. //
  3. // Injector.h
  4. //
  5. // SUBSYSTEM: 
  6. // API hooking system
  7. // MODULE:    
  8. //              Implements injection mechanism
  9. //
  10. // DESCRIPTION:
  11. //              
  12. //
  13. // AUTHOR: Ivo Ivanov (ivopi@hotmail.com)
  14. // DATE: 2001 November 13,  version 1.0 
  15. //                                                                         
  16. // FIXES:
  17. //              - 2002 November 20
  18. //                Added a mechanism for handling reference count of the HookTool.dll 
  19. //                instances. This allows us to fix a problem caused by the asynchronous 
  20. //                behavior of ::UnhookWindowsHookEx() API                
  21. //                                                                         
  22. //---------------------------------------------------------------------------
  23. #if !defined(_INJECTOR_H_)
  24. #define _INJECTOR_H_
  25. #if _MSC_VER > 1000
  26. #pragma once
  27. #endif // _MSC_VER > 1000
  28. //---------------------------------------------------------------------------
  29. //
  30. // Includes
  31. //
  32. //---------------------------------------------------------------------------
  33. #include <windows.h>
  34. #include "..CommonLockMgr.h"
  35. //---------------------------------------------------------------------------
  36. //
  37. // Forward declararions
  38. //
  39. //---------------------------------------------------------------------------
  40. class CExeModuleInstance;
  41. class CNtInjectorThread;
  42. //---------------------------------------------------------------------------
  43. //
  44. // class CInjector  
  45. //
  46. //---------------------------------------------------------------------------
  47. class CInjector  
  48. {
  49. public:
  50. CInjector(BOOL bServerInstance);
  51. virtual ~CInjector();
  52. //
  53. // examines whether a process should be hooked up by the DLL
  54. //
  55. BOOL IsProcessForHooking(PSTR pszExaminedProcessName);
  56. //
  57. // Inject the DLL into all running processes
  58. //
  59. virtual BOOL InjectModuleIntoAllProcesses() = 0;
  60. //
  61. // Eject the DLL from all processes if it has been injected before 
  62. //
  63. virtual BOOL EjectModuleFromAllProcesses(HANDLE hWaitOn) = 0;
  64. protected:
  65. //
  66. // Determines whether the instance is created by the hook server
  67. //
  68. BOOL m_bServerInstance;
  69. private:
  70. //
  71. // Get the value of [Scope] / HookAll from the INI file
  72. //
  73. BOOL GetHookAllEnabled();
  74. //
  75. // Return the name of the INI file
  76. //
  77. void GetIniFile(char* pszIniFile);
  78. //
  79. // A comma separated list with name of processes
  80. // for hooking
  81. //
  82. char m_szProcessesForHooking[MAX_PATH];
  83. //
  84. // ... and those that should be protected and not hooked up
  85. //
  86. char  m_szProtectedProcesses[MAX_PATH];
  87. //
  88. //
  89. //
  90. BOOL m_bHookAllEnabledInitialized;
  91. //
  92. // Indicates whether all process must be hooked up
  93. //
  94. BOOL m_bHookAllEnabled;
  95. };
  96. //---------------------------------------------------------------------------
  97. //
  98. // class CWinHookInjector  
  99. //
  100. //---------------------------------------------------------------------------
  101. class CWinHookInjector: public CInjector  
  102. {
  103. public:
  104. CWinHookInjector(BOOL bServerInstance, HHOOK* pHook);
  105. private:
  106. //
  107. // Inject the DLL into all running processes
  108. //
  109. virtual BOOL InjectModuleIntoAllProcesses();
  110. //
  111. // Eject the DLL from all processes if it has been injected before 
  112. //
  113. virtual BOOL EjectModuleFromAllProcesses(HANDLE hWaitOn);
  114. //
  115. // Pointer to shared hook handle
  116. //
  117. static HHOOK* sm_pHook;
  118. };
  119. //---------------------------------------------------------------------------
  120. //
  121. // class CRemThreadInjector  
  122. //
  123. //---------------------------------------------------------------------------
  124. class CRemThreadInjector: public CInjector  
  125. {
  126. public:
  127. CRemThreadInjector(BOOL bServerInstance);
  128. virtual ~CRemThreadInjector();
  129. //
  130. // Inject the DLL into address space of a specific external process
  131. //
  132. BOOL InjectModuleInto(DWORD dwProcessId);
  133. //
  134. // Eject the DLL from the address space of an external process
  135. //
  136. BOOL EjectModuleFrom(DWORD dwProcessId);
  137. private:
  138. //
  139. // Inject the DLL into all running processes
  140. //
  141. virtual BOOL InjectModuleIntoAllProcesses();
  142. //
  143. // Eject the DLL from all processes if it has been injected before 
  144. //
  145. virtual BOOL EjectModuleFromAllProcesses(HANDLE hWaitOn);
  146. //
  147. // Attempts to enable SeDebugPrivilege. This is required by use of
  148. // CreateRemoteThread() under NT/2K
  149. //
  150. BOOL EnableDebugPrivilege();
  151. //
  152. // Execute injection mechanism for NT/2K systems
  153. //
  154. virtual BOOL DoInjectModuleInto(CExeModuleInstance *pProcess);
  155. //
  156. // Perform actual ejection of the DLL from the address space of an external process
  157. //
  158. virtual BOOL DoEjectModuleFrom(CExeModuleInstance& process);
  159. //
  160. // Guard used by InjectModuleInto
  161. //
  162. static CCSWrapper sm_CritSecInjector;
  163. //
  164. // An object responsible for monitoring process creation/termination
  165. //
  166. CNtInjectorThread* m_pNtInjectorThread;
  167. };
  168. #endif // !defined(_INJECTOR_H_)
  169. //----------------------------End of the file -------------------------------