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

钩子与API截获

开发平台:

Visual C++

  1. // ----------------------------------- //
  2. //            APISpy32 v2.0            //
  3. //     Copyright 1999 Yariv Kaplan     //
  4. //          WWW.INTERNALS.COM          //
  5. // ----------------------------------- //
  6. #include <windows.h>
  7. #include "psapi.h"
  8. #include "general.h"
  9. #include "apispynt.h"
  10. typedef BOOL (WINAPI *ENUMPROCESSES_PROC)(DWORD *lpidProcess, DWORD cb, DWORD *cbNeeded);
  11. typedef BOOL (WINAPI *ENUMPROCESSMODULES_PROC)(HANDLE hProcess, HMODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded);
  12. typedef DWORD (WINAPI *GETMODULEBASENAME_PROC)(HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize);
  13. ENUMPROCESSES_PROC pEnumProcesses;
  14. ENUMPROCESSMODULES_PROC pEnumProcessModules;
  15. GETMODULEBASENAME_PROC pGetModuleBaseName;
  16. bool InitPSAPI()
  17. {
  18.   HINSTANCE hInstance;
  19.   hInstance = LoadLibrary("psapi.dll");
  20.   if (hInstance == NULL)
  21.     return false;
  22.   pEnumProcesses = (ENUMPROCESSES_PROC)GetProcAddress(hInstance, "EnumProcesses");
  23.   if (pEnumProcesses == NULL)
  24.   {
  25.     FreeLibrary(hInstance);
  26.     return false;
  27.   }
  28.   pEnumProcessModules = (ENUMPROCESSMODULES_PROC)GetProcAddress(hInstance, "EnumProcessModules");
  29.   if (pEnumProcessModules == NULL)
  30.   {
  31.     FreeLibrary(hInstance);
  32.     return false;
  33.   }
  34.   pGetModuleBaseName = (GETMODULEBASENAME_PROC)GetProcAddress(hInstance, "GetModuleBaseNameA");
  35.   if (pGetModuleBaseName == NULL)
  36.   {
  37.     FreeLibrary(hInstance);
  38.     return false;
  39.   }
  40.   return true;
  41. }
  42. bool GetProcessNameNT(DWORD dwProcessId, PSTR pszProcessName)
  43. {
  44.   DWORD dwProcessArray[MAX_PROCESSES];
  45.   DWORD dwBytesNeeded;
  46.   DWORD dwProcessCount;
  47.   HANDLE hProcess;
  48.   HMODULE hModule;
  49.   BOOL Result;
  50.   DWORD dwIndex;
  51.   char *pszExtension;
  52.   Result = pEnumProcesses(&dwProcessArray[0], sizeof(dwProcessArray), &dwBytesNeeded);
  53.   if (Result == FALSE)
  54.     return false;
  55.   dwProcessCount = dwBytesNeeded / sizeof(DWORD);
  56.   for (dwIndex = 0; dwIndex < dwProcessCount; dwIndex++)
  57.   {
  58.     if (dwProcessId == dwProcessArray[dwIndex])
  59.     {
  60.       hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
  61.                              FALSE, dwProcessId);
  62.       if (hProcess == NULL)
  63.         return false;
  64.       Result = pEnumProcessModules(hProcess, &hModule, sizeof(HMODULE), &dwBytesNeeded);
  65.       if (Result == FALSE)
  66.       {
  67.         CloseHandle(hProcess);
  68.         return false;
  69.       }
  70.       Result = pGetModuleBaseName(hProcess, hModule, pszProcessName, MAX_PATH);
  71.       if (Result == 0)
  72.       {
  73.         CloseHandle(hProcess);
  74.         return false;
  75.       }
  76.       strupr(pszProcessName);
  77.       pszExtension = strstr(pszProcessName, ".EXE");
  78.       
  79.       if (pszExtension != NULL)
  80.         *pszExtension = '';
  81.       CloseHandle(hProcess);
  82.     }
  83.   }
  84.   return true;
  85. }
  86. bool InjectDLL(BOOL ActionFlag)
  87. {
  88.   DWORD dwProcessArray[MAX_PROCESSES];
  89.   char szDLLPath[MAX_PATH];
  90.   DWORD dwBytesNeeded;
  91.   DWORD dwProcessCount;
  92.   DWORD dwIndex;
  93.   HANDLE hProcess;
  94.   BOOL Result;
  95.   Result = pEnumProcesses(&dwProcessArray[0], sizeof(dwProcessArray), &dwBytesNeeded);
  96.   if (Result == FALSE)
  97.     return false;
  98.   dwProcessCount = dwBytesNeeded / sizeof(DWORD);
  99.   for (dwIndex = 0; dwIndex < dwProcessCount; dwIndex++)
  100.   {
  101.     hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessArray[dwIndex]);
  102.     
  103.     if (hProcess == NULL)
  104.       continue;
  105.     GetModuleFileName(NULL, szDLLPath, sizeof(szDLLPath));
  106.     strcpy(strrchr(szDLLPath, '\') + 1, APISPY32DLL_NT);
  107.     InjectLib(hProcess, szDLLPath, ActionFlag);
  108.     CloseHandle(hProcess);
  109.   }
  110.   return true;
  111. }
  112. bool ObtainSeDebugPrivilege()
  113. {
  114.   BOOL Result;
  115.   TOKEN_PRIVILEGES TokenPrivileges;
  116.   TOKEN_PRIVILEGES PreviousTokenPrivileges;
  117.   LUID luid;
  118.   HANDLE hToken;
  119.   DWORD dwPreviousTokenPrivilegesSize = sizeof(TOKEN_PRIVILEGES);
  120.   Result = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
  121.   if (Result == FALSE)
  122.     return false;
  123.   Result = LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid);
  124.   if (Result == FALSE)
  125.     return false;
  126.   
  127.   TokenPrivileges.PrivilegeCount            = 1;
  128.   TokenPrivileges.Privileges[0].Luid        = luid;
  129.   TokenPrivileges.Privileges[0].Attributes  = 0;
  130.   AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, sizeof(TOKEN_PRIVILEGES),
  131.                         &PreviousTokenPrivileges, &dwPreviousTokenPrivilegesSize);
  132.   if (GetLastError() != ERROR_SUCCESS)
  133.     return false;
  134.   PreviousTokenPrivileges.PrivilegeCount             = 1;
  135.   PreviousTokenPrivileges.Privileges[0].Luid         = luid;
  136.   PreviousTokenPrivileges.Privileges[0].Attributes  |= SE_PRIVILEGE_ENABLED;
  137.   AdjustTokenPrivileges(hToken, FALSE, &PreviousTokenPrivileges,
  138.                         dwPreviousTokenPrivilegesSize, NULL, NULL);
  139.   if (GetLastError() != ERROR_SUCCESS)
  140.     return false;
  141.   CloseHandle(hToken);
  142.   return true;
  143. }