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

钩子与API截获

开发平台:

Visual C++

  1. //---------------------------------------------------------------------------
  2. //
  3. // ModuleScope.h
  4. //
  5. // SUBSYSTEM:   Hook system
  6. //
  7. // MODULE:      Hook tool
  8. //
  9. // DESCRIPTION: Declares interface for the CModuleScope class. 
  10. //              This class is designed to provide single interface for 
  11. //              all hook related activities.
  12. // 
  13. //             
  14. // AUTHOR: Ivo Ivanov (ivopi@hotmail.com)
  15. // DATE: 2001 December v1.00
  16. //
  17. //---------------------------------------------------------------------------
  18. #if !defined(_MODULESCOPE_H_)
  19. #define _MODULESCOPE_H_
  20. #if _MSC_VER > 1000
  21. #pragma once
  22. #endif // _MSC_VER > 1000
  23. #include "..CommonLockMgr.h"
  24. #include "..CommonLogFile.h"
  25. #include "..CommonSysUtils.h"
  26. #include "Interlocked.h"
  27. #include "ApiHook.h"
  28. //---------------------------------------------------------------------------
  29. //
  30. // Typedefs
  31. // 
  32. //---------------------------------------------------------------------------
  33. typedef CWhenZero<DWORD> CWhenZeroDword;
  34. //---------------------------------------------------------------------------
  35. //
  36. // Forward declarations
  37. // 
  38. //---------------------------------------------------------------------------
  39. class CInjector;
  40. //---------------------------------------------------------------------------
  41. //
  42. // Global variables
  43. // 
  44. //---------------------------------------------------------------------------
  45. //
  46. // A global guard object used for protecting singelton's instantiation 
  47. //
  48. static CCSWrapper g_ModuleSingeltonLock;
  49. //---------------------------------------------------------------------------
  50. //
  51. // class CModuleScope 
  52. //
  53. //---------------------------------------------------------------------------
  54. class CModuleScope  
  55. {
  56. private:
  57. //
  58. // Intentionally hide the defualt constructor,
  59. // copy constructor and assignment operator 
  60. //
  61. //
  62. // Default constructor
  63. //
  64. CModuleScope(
  65. HWND*  phwndServer,
  66. BOOL*  pbHookInstalled,
  67. HHOOK* pHook
  68. );
  69. //
  70. // Copy constructor
  71. //
  72. CModuleScope(const CModuleScope& rhs);
  73. //
  74. // Assignment operator
  75. //
  76. CModuleScope& operator=(const CModuleScope& rhs);
  77. public:
  78. //
  79. // Destructor - we must declare it as public in order to provide
  80. // enough visibility for the GetInstance().
  81. // However the destructor shouldn't be called directly by the 
  82. // Module's code.
  83. //
  84. virtual ~CModuleScope();
  85. //
  86. // Implements the "double-checking" locking pattern combined with 
  87. // Scott Meyers single instance
  88. // For more details see - 
  89. // 1. "Modern C++ Design" by Andrei Alexandrescu - 6.9 Living in a 
  90. //     Multithreaded World
  91. // 2. "More Effective C++" by Scott Meyers - Item 26
  92. //
  93. static CModuleScope* GetInstance(
  94. HWND*  phwndServer,
  95. BOOL*  pbHookInstalled,
  96. HHOOK* pHook
  97. );
  98. //
  99. // 
  100. //
  101. void LogMessage(const char* pszBuffer);
  102. //
  103. // Accessor method
  104. //
  105. char* GetProcessName() const;
  106. //
  107. // Accessor method
  108. //
  109. DWORD GetProcessId() const;
  110. //
  111. // Called on DLL_PROCESS_ATTACH DLL notification
  112. //
  113. BOOL ManageModuleEnlistment();
  114. //
  115. // Called on DLL_PROCESS_DETACH notification
  116. //
  117. void ManageModuleDetachment();
  118. //
  119. // Activate/Deactivate hooking engine
  120. //
  121. BOOL InstallHookMethod(
  122. BOOL bActivate, 
  123. HWND hWndServer
  124. );
  125. private:
  126. //
  127. // Hooks up an API function
  128. //
  129. BOOL HookImport(
  130. PCSTR pszCalleeModName, 
  131. PCSTR pszFuncName, 
  132. PROC  pfnHook
  133. );
  134. //
  135. // Restores the original API function pointer
  136. //
  137. BOOL UnHookImport(
  138. PCSTR pszCalleeModName, 
  139. PCSTR pszFuncName
  140. );
  141. //
  142. // Determines whether Windows hook is going to be used
  143. //
  144. BOOL UseWindowsHook();
  145. //
  146. // Initialize hook engine
  147. //
  148. void InitializeHookManagement();
  149. //
  150. // Release all resource required by the hooking engine
  151. //
  152. void FinalizeHookManagement();
  153. //
  154. // Return the name of the INI file
  155. //
  156. void GetIniFile(char* pszIniFile);
  157. //
  158. // Get the value of [Trace] / Enabled from the INI file
  159. //
  160. BOOL GetTraceEnabled();
  161. //
  162. // Get the value of [Scope] / HookAll from the INI file
  163. //
  164. BOOL GetHookAllEnabled();
  165. //
  166. // An object responsible for injecting/ejecting the DLL into 
  167. // address space of a process
  168. //
  169. CInjector* m_pInjector;
  170. //
  171. // Instance's pointer holder
  172. //
  173. static CModuleScope* sm_pInstance;
  174. //
  175. // Log file management
  176. //
  177. static CLogFile* sm_pLogFile;
  178. //
  179. // Indicates whether this is the server process
  180. //
  181. BOOL m_bIsThisServerProcess;
  182. //
  183. // the name of the process the loads this DLL
  184. //
  185. char   m_szProcessName[MAX_PATH];
  186. //
  187. // and its process id
  188. //
  189. DWORD  m_dwProcessId;
  190. //
  191. //
  192. //
  193. BOOL m_bTraceEnabledInitialized;
  194. //
  195. // Indicates whether tracing is enabled
  196. //
  197. BOOL m_bTraceEnabled;
  198. //
  199. //
  200. //
  201. BOOL m_bUseWindowsHookInitialized;
  202. //
  203. // Determines whether to use windows hooks or CreateRemoteThread()
  204. // mecahnism for injecting
  205. //
  206. BOOL m_bUseWindowsHook;
  207. //
  208. // Holds address to a variable declared in a shared section
  209. //
  210. BOOL* m_pbHookInstalled;
  211. //
  212. // Pointer to window handle where we should post all our messages
  213. //
  214. HWND* m_phwndServer;
  215. //
  216. // Instance of the hook manager
  217. //
  218. static CApiHookMgr* sm_pHookMgr;
  219. //
  220. // A "solution" to the problem caused by incorrect unhooking process order
  221. // if Windows hooks injection is in use
  222. //
  223. CWhenZeroDword* m_pWhenZero;
  224. //
  225. // Hook function prototypes
  226. //
  227. static BOOL WINAPI MyTextOutA(
  228. HDC hdc,           // handle to DC
  229. int nXStart,       // x-coordinate of starting position
  230. int nYStart,       // y-coordinate of starting position
  231. LPSTR lpString,    // character string
  232. int cbString       // number of characters
  233. );
  234. static BOOL WINAPI MyTextOutW(
  235. HDC hdc,           // handle to DC
  236. int nXStart,       // x-coordinate of starting position
  237. int nYStart,       // y-coordinate of starting position
  238. LPWSTR lpString,   // character string
  239. int cbString       // number of characters
  240. );
  241. static VOID WINAPI MyExitProcess(
  242. UINT uExitCode   // exit code for all threads
  243. );
  244. };
  245. #endif // !defined(_MODULESCOPE_H_)
  246. //----------------------------End of the file -------------------------------