home *** CD-ROM | disk | FTP | other *** search
/ PC World 1999 October / PCWorld_1999-10_cd1.bin / Hardware / Drivers / APISpy / APISpyNT.cpp < prev    next >
C/C++ Source or Header  |  1999-07-26  |  5KB  |  197 lines

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