ring3下利用WMI监视进程创建(vc版)

[cpp] view plain copy
 
  1. #include "stdafx.h"  
  2. #define _WIN32_DCOM  
  3. #include <iostream>  
  4. using namespace std;  
  5. #include <comdef.h>  
  6. #include <Wbemidl.h>  
  7.   
  8. # pragma comment(lib, "wbemuuid.lib")  
  9.   
  10. int main(int argc, char **argv)  
  11. {  
  12.     HRESULT hres;  
  13.   
  14.     hres =  CoInitializeEx(0, COINIT_MULTITHREADED);   
  15.     if (FAILED(hres))  
  16.     {  
  17.         cout << "Failed to initialize COM library. "   
  18.             << "Error code = 0x"   
  19.             << hex << hres << endl;  
  20.         return 1;  
  21.     }  
  22.   
  23.     IWbemLocator *pLoc = 0;  
  24.     HRESULT hr;  
  25.   
  26.     hr = CoCreateInstance(CLSID_WbemLocator, 0,   
  27.         CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc);  
  28.   
  29.     if (FAILED(hr))  
  30.     {  
  31.         cout << "Failed to create IWbemLocator object. Err code = 0x"  
  32.             << hex << hr << endl;  
  33.         return hr;     // Program has failed.  
  34.     }  
  35.   
  36.     IWbemServices *pSvc = 0;  
  37.   
  38.     bstr_t strNetworkResource("ROOT\CIMV2");  
  39.   
  40.     hr = pLoc->ConnectServer(  
  41.         strNetworkResource,   
  42.         NULL, NULL, 0, NULL, 0, 0, &pSvc);  
  43.   
  44.     if (FAILED(hr))  
  45.     {  
  46.         cout << "Could not connect. Error code = 0x"   
  47.             << hex << hr << endl;  
  48.         pLoc->Release();  
  49.         CoUninitialize();  
  50.         return hr;      // Program has failed.  
  51.     }  
  52.   
  53.     cout << "Connected to WMI" << endl;  
  54.   
  55.     // Set the proxy so that impersonation of the client occurs.  
  56.     hr = CoSetProxyBlanket(pSvc,  
  57.         RPC_C_AUTHN_WINNT,  
  58.         RPC_C_AUTHZ_NONE,  
  59.         NULL,  
  60.         RPC_C_AUTHN_LEVEL_CALL,  
  61.         RPC_C_IMP_LEVEL_IMPERSONATE,  
  62.         NULL,  
  63.         EOAC_NONE  
  64.         );  
  65.   
  66.     if (FAILED(hr))  
  67.     {  
  68.         cout << "Could not set proxy blanket. Error code = 0x"   
  69.             << hex << hr << endl;  
  70.         pSvc->Release();  
  71.         pLoc->Release();       
  72.         CoUninitialize();  
  73.         return hr;  
  74.     }  
  75.   
  76.       
  77.     bstr_t strLang("WQL");  
  78.     //监视taskmgr.exe进程创建  
  79.     bstr_t strQuery("SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process' AND TargetInstance.Name = 'taskmgr.exe'");   
  80.     IEnumWbemClassObject* pResult = NULL;  
  81.   
  82.     hr = pSvc->ExecNotificationQuery(strLang, strQuery, WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pResult);  
  83.     if(SUCCEEDED(hr))  
  84.     {  
  85.         do{  
  86.             IWbemClassObject* pObject = NULL;  
  87.             ULONG lCnt = 0;  
  88.             hr = pResult->Next(WBEM_INFINITE, 1, &pObject, &lCnt);  
  89.             if(SUCCEEDED(hr) && pObject)  
  90.             {  
  91.                 cout<<"taskmgr.exe进程已创建"<<endl;  
  92.                 break; //退出  
  93.             }  
  94.         }while(true);  
  95.     }  
  96.   
  97.   
  98.   
  99.     pSvc->Release();  
  100.     pLoc->Release();       
  101.     CoUninitialize();  
  102.     CoUninitialize();  
  103.   
  104.     return 0;   // Program successfully completed.  
  105. }  

http://blog.csdn.net/zwfgdlc/article/details/6613605

原文地址:https://www.cnblogs.com/findumars/p/6344965.html