ProcessModule.cpp
上传用户:nbcables
上传日期:2007-01-11
资源大小:1243k
文件大小:7k
源码类别:

钩子与API截获

开发平台:

Visual C++

  1. #include <windows.h>
  2. #include <string.h>
  3. #ifdef WINNT
  4. #include "psapi.h"
  5. #endif
  6. #include "ProcessModule.h"
  7. #include "util.h"
  8. CProcessModule::CProcessModule()
  9. {
  10. m_dwProcessCount =0;
  11. m_nModCount =0;
  12. /*#ifdef WINNT
  13. m_hProcess =NULL;
  14. m_hLib =NULL;
  15. m_pEnumProcesses =NULL;  // api EnumProcesses()
  16. m_pEnumProcessModules =NULL;  // api EnumProcessModules()
  17. m_pGetModuleBaseName =NULL;  // api GetModuleBaseName()
  18. #else*/
  19. memset(&m_mod_name, 0, sizeof(m_mod_name));
  20. //#endif
  21. /*#ifdef WINNT
  22. m_hLib = LoadLibrary("psapi.dll");
  23. if (m_hLib == NULL)
  24. return;
  25. m_pEnumProcesses = (ENUMPROCESSES_PROC)GetProcAddress(m_hLib, "EnumProcesses");
  26. if (m_pEnumProcesses == NULL)
  27. {
  28. FreeLibrary(m_hLib);
  29. m_hLib =NULL;
  30. }
  31. m_pEnumProcessModules = (ENUMPROCESSMODULES_PROC)GetProcAddress(m_hLib, "EnumProcessModules");
  32. if (m_pEnumProcessModules == NULL)
  33. {
  34. FreeLibrary(m_hLib);
  35. m_hLib =NULL;
  36. }
  37. m_pGetModuleBaseName = (GETMODULEBASENAME_PROC)GetProcAddress(m_hLib, "GetModuleBaseNameA");
  38. if (m_pGetModuleBaseName == NULL)
  39. {
  40. FreeLibrary(m_hLib);
  41. m_hLib =NULL;
  42. }
  43. #else*/
  44. HMODULE hModule = GetModuleHandle("kernel32.dll");
  45. if (hModule == NULL)
  46. return;
  47. pCreateToolhelp32Snapshot = (CREATETOOLHELP32SNAPSHOT_PROC)GetProcAddress(hModule, "CreateToolhelp32Snapshot");
  48. if (pCreateToolhelp32Snapshot == NULL)
  49. return;
  50. pProcess32First = (PROCESS32FIRST_PROC)GetProcAddress(hModule, "Process32First");
  51. if (pProcess32First == NULL)
  52. return;
  53. pProcess32Next = (PROCESS32NEXT_PROC)GetProcAddress(hModule, "Process32Next");
  54. if (pProcess32Next == NULL)
  55. return;
  56. pModule32First = (MODULE32FIRST_PROC)GetProcAddress(hModule, "Module32First");
  57. if (pModule32First == NULL)
  58. return;
  59. pModule32Next = (MODULE32NEXT_PROC)GetProcAddress(hModule, "Module32Next");
  60. if (pModule32Next == NULL)
  61. return;
  62. //#endif
  63. }
  64. CProcessModule::~CProcessModule()
  65. {
  66. /*#ifdef WINNT
  67. if(m_hLib)
  68. {
  69. FreeLibrary(m_hLib);
  70. m_hLib =NULL;
  71. }
  72. #endif*/
  73. }
  74. int CProcessModule::EnumProcess()
  75. {
  76. m_dwProcessCount =0;
  77. /*#ifdef WINNT
  78. DWORD dwBytesNeeded;
  79. if(!m_pEnumProcesses(&m_dwProcessIDs[0], sizeof(m_dwProcessIDs), &dwBytesNeeded))
  80. return -1;
  81. m_dwProcessCount = dwBytesNeeded / sizeof(DWORD);
  82. #else*/
  83. HANDLE hSnapShot;
  84. PROCESSENTRY32 ProcessEntry32;
  85. //MODULEENTRY32 ModuleEntry32;
  86. BOOL Result;
  87. //char *pszExtension;
  88. hSnapShot = pCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  89. if (hSnapShot == (HANDLE)-1)
  90. return false;
  91. ProcessEntry32.dwSize = sizeof(PROCESSENTRY32);
  92. Result = pProcess32First(hSnapShot, &ProcessEntry32);
  93. if (Result != TRUE)
  94. {
  95. CloseHandle(hSnapShot);
  96. return false;
  97. }
  98. do
  99. {
  100. //HMODULE hMod =GetModuleHandle(ProcessEntry32.szExeFile);
  101. //WriteLog("process:%s, id:%x, module id:%x",
  102. // ProcessEntry32.szExeFile, ProcessEntry32.th32ProcessID,
  103. // ProcessEntry32.th32ModuleID);
  104. m_dwProcessIDs[m_dwProcessCount] = ProcessEntry32.th32ProcessID;
  105. m_dwProcessCount ++;
  106. } while (pProcess32Next(hSnapShot, &ProcessEntry32) && m_dwProcessCount < MAX_PROCESS_COUNT);
  107. CloseHandle(hSnapShot);
  108. //#endif
  109. return m_dwProcessCount;
  110. }
  111. int CProcessModule::EnumProcessModules(DWORD process_id)
  112. {
  113. m_nModCount =0;
  114. /*#ifdef WINNT
  115. DWORD cbNeeded;
  116. if(m_hProcess) CloseHandle(m_hProcess);
  117. m_hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, process_id);
  118. if (m_hProcess == NULL)
  119. return -1;
  120. if(!m_pEnumProcessModules(m_hProcess, m_hMods, sizeof(m_hMods), &cbNeeded))
  121. {
  122. char err_msg[256];
  123. DWORD err=GetLastError();
  124. GetErrString(err_msg, sizeof(err_msg), err);
  125. WriteLog("failed to EnumProcessModules, err=%d-%s", err, err_msg);
  126. CloseHandle(m_hProcess);
  127. return 0;
  128. }
  129. m_nModCount =cbNeeded / sizeof(HMODULE);
  130. #else*/
  131. HANDLE hSnapShot;
  132. MODULEENTRY32 ModuleEntry32;
  133. BOOL Result;
  134.  
  135. hSnapShot = pCreateToolhelp32Snapshot(TH32CS_SNAPMODULE, process_id);
  136. if (hSnapShot == (HANDLE)-1)
  137. return -1;
  138. ModuleEntry32.dwSize = sizeof(MODULEENTRY32);
  139. Result = pModule32First(hSnapShot, &ModuleEntry32);
  140. if (Result != TRUE)
  141. {
  142. CloseHandle(hSnapShot);
  143. return -1;
  144. }
  145. do
  146. {
  147. strcpy(m_mod_name[m_nModCount], ModuleEntry32.szModule);
  148. m_hMods[m_nModCount] =ModuleEntry32.hModule;
  149. m_nModCount++;
  150. } while (pModule32Next(hSnapShot, &ModuleEntry32) && m_nModCount <MAX_MODULE_COUNT);
  151. CloseHandle(hSnapShot);
  152. //#endif
  153. return m_nModCount;
  154. }
  155. int CProcessModule::GetModuleBaseNameA(int num, char *mod_name)
  156. {
  157. /*#ifdef WINNT
  158. if ( m_pGetModuleBaseName( m_hProcess, m_hMods[num], mod_name,100))
  159. return -1;
  160. #else*/
  161. strcpy(mod_name, m_mod_name[num]);
  162. //#endif
  163. return 0;
  164. }
  165. void CProcessModule::EndEnumProcessModules()
  166. {
  167. /*#ifdef WINNT
  168. if(m_hProcess) CloseHandle(m_hProcess);
  169. m_hProcess =NULL;
  170. #endif*/
  171. }
  172. HANDLE CProcessModule::GetProcessModuleHandle(DWORD process_id, char *mod_name)
  173. {
  174. int mod_count =EnumProcessModules(process_id);
  175. char mod_base_name[100];
  176. for(int i =0; i<mod_count; i++)
  177. {
  178. GetModuleBaseNameA(i, mod_base_name);
  179. if(strcmpi(mod_base_name, mod_name) ==0)
  180. {
  181. EndEnumProcessModules();
  182. return m_hMods[i];
  183. }
  184. }
  185. EndEnumProcessModules();
  186. return NULL;
  187. }
  188. DWORD CProcessModule::GetProcessID(char *exe_name)
  189. {
  190. WriteLog("GetProcessID...");
  191. EnumProcess();
  192. WriteLog("GetProcessID m_dwProcessCount=%d...", m_dwProcessCount);
  193. for(int i =0; i<(int)m_dwProcessCount; i++)
  194. {
  195. int mod_count =EnumProcessModules(m_dwProcessIDs[i]);
  196. char mod_base_name[100];
  197. //WriteLog("process num=%s", i);
  198. for(int j =0; j<mod_count; j++)
  199. {
  200. GetModuleBaseNameA(j, mod_base_name);
  201. if(strcmpi(mod_base_name, exe_name) ==0)
  202. {
  203. WriteLog("found mod_base_name %s", mod_base_name);
  204. EndEnumProcessModules();
  205. return m_dwProcessIDs[i];
  206. }
  207. }
  208. //WriteLog("rn");
  209. }
  210. EndEnumProcessModules();
  211. return NULL;
  212. }
  213. #ifdef WINNT
  214. BOOL CProcessModule::ObtainSeDebugPrivilege(HANDLE hProcess)
  215. {
  216. BOOL Result;
  217. TOKEN_PRIVILEGES TokenPrivileges;
  218. TOKEN_PRIVILEGES PreviousTokenPrivileges;
  219. LUID luid;
  220. HANDLE hToken;
  221. DWORD dwPreviousTokenPrivilegesSize = sizeof(TOKEN_PRIVILEGES);
  222. Result = OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
  223. if (Result == FALSE)
  224. return false;
  225. Result = LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid);
  226. if (Result == FALSE)
  227. return false;
  228.   
  229. TokenPrivileges.PrivilegeCount            = 1;
  230. TokenPrivileges.Privileges[0].Luid        = luid;
  231. TokenPrivileges.Privileges[0].Attributes  = 0;
  232. AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, sizeof(TOKEN_PRIVILEGES),
  233. &PreviousTokenPrivileges, &dwPreviousTokenPrivilegesSize);
  234. if (GetLastError() != ERROR_SUCCESS)
  235. return false;
  236. PreviousTokenPrivileges.PrivilegeCount             = 1;
  237. PreviousTokenPrivileges.Privileges[0].Luid         = luid;
  238. PreviousTokenPrivileges.Privileges[0].Attributes  |= SE_PRIVILEGE_ENABLED;
  239. AdjustTokenPrivileges(hToken, FALSE, &PreviousTokenPrivileges,
  240. dwPreviousTokenPrivilegesSize, NULL, NULL);
  241. if (GetLastError() != ERROR_SUCCESS)
  242. return false;
  243. CloseHandle(hToken);
  244. return true;
  245. }
  246. #endif