APISpy9x.cpp
上传用户:tzh4061
上传日期:2007-01-08
资源大小:309k
文件大小:4k
源码类别:

钩子与API截获

开发平台:

Visual C++

  1. // ----------------------------------- //
  2. //            APISpy32 v2.0            //
  3. //     Copyright 1999 Yariv Kaplan     //
  4. //          WWW.INTERNALS.COM          //
  5. // ----------------------------------- //
  6. #include <windows.h>
  7. #include <tlhelp32.h>
  8. #include "apispy9x.h"
  9. typedef HANDLE (WINAPI *CREATETOOLHELP32SNAPSHOT_PROC)(DWORD dwFlags, DWORD th32ProcessID);
  10. typedef BOOL (WINAPI *PROCESS32FIRST_PROC)(HANDLE hSnapshot, LPPROCESSENTRY32 lppe);
  11. typedef BOOL (WINAPI *PROCESS32NEXT_PROC)(HANDLE hSnapshot, LPPROCESSENTRY32 lppe);
  12. typedef BOOL (WINAPI *MODULE32FIRST_PROC)(HANDLE hSnapshot, LPMODULEENTRY32 lpme);
  13. typedef BOOL (WINAPI *MODULE32NEXT_PROC)(HANDLE hSnapshot, LPMODULEENTRY32 lpme);
  14. CREATETOOLHELP32SNAPSHOT_PROC pCreateToolhelp32Snapshot;
  15. PROCESS32FIRST_PROC pProcess32First;
  16. PROCESS32NEXT_PROC pProcess32Next;
  17. MODULE32FIRST_PROC pModule32First;
  18. MODULE32NEXT_PROC pModule32Next;
  19. bool InitToolhelp32()
  20. {
  21.   HMODULE hModule;
  22.   hModule = GetModuleHandle("kernel32.dll");
  23.   if (hModule == NULL)
  24.     return false;
  25.   pCreateToolhelp32Snapshot = (CREATETOOLHELP32SNAPSHOT_PROC)GetProcAddress(hModule, "CreateToolhelp32Snapshot");
  26.   if (pCreateToolhelp32Snapshot == NULL)
  27.     return false;
  28.   pProcess32First = (PROCESS32FIRST_PROC)GetProcAddress(hModule, "Process32First");
  29.   if (pProcess32First == NULL)
  30.     return false;
  31.   pProcess32Next = (PROCESS32NEXT_PROC)GetProcAddress(hModule, "Process32Next");
  32.   if (pProcess32Next == NULL)
  33.     return false;
  34.   pModule32First = (MODULE32FIRST_PROC)GetProcAddress(hModule, "Module32First");
  35.   if (pModule32First == NULL)
  36.     return false;
  37.   pModule32Next = (MODULE32NEXT_PROC)GetProcAddress(hModule, "Module32Next");
  38.   if (pModule32Next == NULL)
  39.     return false;
  40.   return true;
  41. }
  42. bool GetProcessModule(DWORD dwOwnerProcessId, DWORD dwModuleId, MODULEENTRY32 *pModuleEntry32)
  43. {
  44.   HANDLE hSnapShot;
  45.   MODULEENTRY32 ModuleEntry32;
  46.   BOOL Result;
  47.  
  48.   hSnapShot = pCreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwOwnerProcessId);
  49.   if (hSnapShot == (HANDLE)-1)
  50.     return false;
  51.   ModuleEntry32.dwSize = sizeof(MODULEENTRY32);
  52.   Result = pModule32First(hSnapShot, &ModuleEntry32);
  53.   if (Result != TRUE)
  54.     return false;
  55.   do
  56.   {
  57.     if (ModuleEntry32.th32ModuleID == dwModuleId)
  58.     {
  59.       CopyMemory(pModuleEntry32, &ModuleEntry32, sizeof(MODULEENTRY32));
  60.       return true;
  61.     }
  62.   } while (pModule32Next(hSnapShot, &ModuleEntry32));
  63.   CloseHandle(hSnapShot);
  64.   return false;
  65. }
  66. bool GetProcessName9x(DWORD dwProcessId, PSTR pszProcessName)
  67. {
  68.   HANDLE hSnapShot;
  69.   PROCESSENTRY32 ProcessEntry32;
  70.   MODULEENTRY32 ModuleEntry32;
  71.   BOOL Result;
  72.   char *pszExtension;
  73.   hSnapShot = pCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  74.   if (hSnapShot == (HANDLE)-1)
  75.     return false;
  76.   ProcessEntry32.dwSize = sizeof(PROCESSENTRY32);
  77.   Result = pProcess32First(hSnapShot, &ProcessEntry32);
  78.   if (Result != TRUE)
  79.   {
  80.     CloseHandle(hSnapShot);
  81.     return false;
  82.   }
  83.   do
  84.   {
  85.     Result = GetProcessModule(ProcessEntry32.th32ProcessID,
  86.                               ProcessEntry32.th32ModuleID,
  87.                               &ModuleEntry32);
  88.     if (Result == false)
  89.       continue;
  90.     if (dwProcessId == ProcessEntry32.th32ProcessID)
  91.     {
  92.       strcpy(pszProcessName, ModuleEntry32.szModule);
  93.       strupr(pszProcessName);
  94.       pszExtension = strstr(pszProcessName, ".EXE");
  95.       
  96.       if (pszExtension != NULL)
  97.         *pszExtension = '';
  98.       return true;
  99.     }
  100.   } while (pProcess32Next(hSnapShot, &ProcessEntry32));
  101.   CloseHandle(hSnapShot);
  102.   return false;
  103. }