elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Obtener todos los procesos activos y los servicios que están usando
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Obtener todos los procesos activos y los servicios que están usando  (Leído 6,937 veces)
el_doctor

Desconectado Desconectado

Mensajes: 57


Ver Perfil
Obtener todos los procesos activos y los servicios que están usando
« en: 2 Septiembre 2013, 22:55 pm »

Hola, espero me puedan ayudar necesito hacer una mini aplicación en C++ que me muestre todos los procesos que están activos en windows y los servicios que usa cada proceso algo así como lo que hace el process explorer según he investigado la forma de poder lograrlo es por el WMI pero no he podido encontrar mucha información encontré un código en C++ donde hacen la conexión COM y verifican el nombre de la computadora no se si alguien me puede decir si este código me sirve y que líneas puedo agregar para que me consulte los procesos y los servicios asociados a cada proceso.


#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <comdef.h>
#include <Wbemidl.h>

# pragma comment(lib, "wbemuuid.lib")

int main(int argc, char **argv)
{
    HRESULT hres;

    // Step 1: --------------------------------------------------
    // Initialize COM. ------------------------------------------

    hres =  CoInitializeEx(0, COINIT_MULTITHREADED);
    if (FAILED(hres))
    {
        cout << "Failed to initialize COM library. Error code = 0x"
            << hex << hres << endl;
        return 1;                  // Program has failed.
    }

    // Step 2: --------------------------------------------------
    // Set general COM security levels --------------------------
    // Note: If you are using Windows 2000, you need to specify -
    // the default authentication credentials for a user by using
    // a SOLE_AUTHENTICATION_LIST structure in the pAuthList ----
    // parameter of CoInitializeSecurity ------------------------

    hres =  CoInitializeSecurity(
        NULL,
        -1,                          // COM authentication
        NULL,                        // Authentication services
        NULL,                        // Reserved
        RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication
        RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation 
        NULL,                        // Authentication info
        EOAC_NONE,                   // Additional capabilities
        NULL                         // Reserved
        );

                     
    if (FAILED(hres))
    {
        cout << "Failed to initialize security. Error code = 0x"
            << hex << hres << endl;
        CoUninitialize();
        return 1;                    // Program has failed.
    }
   
    // Step 3: ---------------------------------------------------
    // Obtain the initial locator to WMI -------------------------

    IWbemLocator *pLoc = NULL;

    hres = CoCreateInstance(
        CLSID_WbemLocator,             
        0,
        CLSCTX_INPROC_SERVER,
        IID_IWbemLocator, (LPVOID *) &pLoc);
 
    if (FAILED(hres))
    {
        cout << "Failed to create IWbemLocator object."
            << " Err code = 0x"
            << hex << hres << endl;
        CoUninitialize();
        return 1;                 // Program has failed.
    }

    // Step 4: -----------------------------------------------------
    // Connect to WMI through the IWbemLocator::ConnectServer method

    IWbemServices *pSvc = NULL;
 
    // Connect to the root\cimv2 namespace with
    // the current user and obtain pointer pSvc
    // to make IWbemServices calls.
    hres = pLoc->ConnectServer(
         _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace
         NULL,                    // User name. NULL = current user
         NULL,                    // User password. NULL = current
         0,                       // Locale. NULL indicates current
         NULL,                    // Security flags.
         0,                       // Authority (for example, Kerberos)
         0,                       // Context object
         &pSvc                    // pointer to IWbemServices proxy
         );
   
    if (FAILED(hres))
    {
        cout << "Could not connect. Error code = 0x"
             << hex << hres << endl;
        pLoc->Release();     
        CoUninitialize();
        return 1;                // Program has failed.
    }

    cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl;


    // Step 5: --------------------------------------------------
    // Set security levels on the proxy -------------------------

    hres = CoSetProxyBlanket(
       pSvc,                        // Indicates the proxy to set
       RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx
       RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx
       NULL,                        // Server principal name
       RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx
       RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
       NULL,                        // client identity
       EOAC_NONE                    // proxy capabilities
    );

    if (FAILED(hres))
    {
        cout << "Could not set proxy blanket. Error code = 0x"
            << hex << hres << endl;
        pSvc->Release();
        pLoc->Release();     
        CoUninitialize();
        return 1;               // Program has failed.
    }

    // Step 6: --------------------------------------------------
    // Use the IWbemServices pointer to make requests of WMI ----

    // For example, get the name of the operating system
    IEnumWbemClassObject* pEnumerator = NULL;
    hres = pSvc->ExecQuery(
        bstr_t("WQL"),
        bstr_t("SELECT * FROM Win32_OperatingSystem"),
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
        NULL,
        &pEnumerator);
   
    if (FAILED(hres))
    {
        cout << "Query for operating system name failed."
            << " Error code = 0x"
            << hex << hres << endl;
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        return 1;               // Program has failed.
    }

    // Step 7: -------------------------------------------------
    // Get the data from the query in step 6 -------------------
 
    IWbemClassObject *pclsObj;
    ULONG uReturn = 0;
   
    while (pEnumerator)
    {
        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
            &pclsObj, &uReturn);

        if(0 == uReturn)
        {
            break;
        }

        VARIANT vtProp;

        // Get the value of the Name property
        hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
        wcout << " OS Name : " << vtProp.bstrVal << endl;
        VariantClear(&vtProp);

        pclsObj->Release();
    }

    // Cleanup
    // ========
   
    pSvc->Release();
    pLoc->Release();
    pEnumerator->Release();
    pclsObj->Release();
    CoUninitialize();

    return 0;   // Program successfully completed.
 
}


En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.935


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Obtener todos los procesos activos y los servicios que están usando
« Respuesta #1 en: 2 Septiembre 2013, 23:09 pm »

No hace falta WMI.

CreateToolhelp32Snapshot
Process32First
Process32Next
CloseHandle

Ejemplo de MSDN:
Taking a Snapshot and Viewing Processes



En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
el_doctor

Desconectado Desconectado

Mensajes: 57


Ver Perfil
Re: Obtener todos los procesos activos y los servicios que están usando
« Respuesta #2 en: 2 Septiembre 2013, 23:25 pm »

Hola Eternal Idol estaba viendo el link que pones utiliza la función GetProcessList pero tanbién me mostrará los procesos que son propios del sistema operativo como por ejemplo svchost.exe y como puedo saber los servicios asociados a cada proceso?
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.935


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Obtener todos los procesos activos y los servicios que están usando
« Respuesta #3 en: 2 Septiembre 2013, 23:48 pm »

Mira EnumServicesStatusEx.


PD. GetProcessList es parte del ejemplo, las funciones que usa son las que puse antes.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
el_doctor

Desconectado Desconectado

Mensajes: 57


Ver Perfil
Re: Obtener todos los procesos activos y los servicios que están usando
« Respuesta #4 en: 3 Septiembre 2013, 00:28 am »

Disculpa Eternal Idol como podría hacer para vicular cada proceso que me devuelve GetProcessList a su respectivo servicios
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.935


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Obtener todos los procesos activos y los servicios que están usando
« Respuesta #5 en: 3 Septiembre 2013, 00:33 am »

Esta en la documentacion:

The lpServices parameter is a pointer to a buffer that receives an array of ENUM_SERVICE_STATUS_PROCESS structures.

typedef struct _ENUM_SERVICE_STATUS_PROCESS {
  LPTSTR                 lpServiceName;
  LPTSTR                 lpDisplayName;
  SERVICE_STATUS_PROCESS ServiceStatusProcess;
} ENUM_SERVICE_STATUS_PROCESS, *LPENUM_SERVICE_STATUS_PROCESS;

typedef struct _SERVICE_STATUS_PROCESS {
  DWORD dwServiceType;
  DWORD dwCurrentState;
  DWORD dwControlsAccepted;
  DWORD dwWin32ExitCode;
  DWORD dwServiceSpecificExitCode;
  DWORD dwCheckPoint;
  DWORD dwWaitHint;
  DWORD dwProcessId;
  DWORD dwServiceFlags;
} SERVICE_STATUS_PROCESS, *LPSERVICE_STATUS_PROCESS;
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
el_doctor

Desconectado Desconectado

Mensajes: 57


Ver Perfil
Re: Obtener todos los procesos activos y los servicios que están usando
« Respuesta #6 en: 10 Septiembre 2013, 22:08 pm »

Hola Eternal Idol podrías ayudarme con algún ejemplo para utilizar la función EnumServicesStatusEx
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.935


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Obtener todos los procesos activos y los servicios que están usando
« Respuesta #7 en: 10 Septiembre 2013, 23:15 pm »

Siguiendo exactamente la misma logica que con GetExtendedTcpTable (comproba los valores de retorno, libera la memoria, cerra el SC_HANDLE, etc. en este extracto de ejemplo no se hace):

Código
  1. SC_HANDLE scm = OpenSCManager(0, 0, SC_MANAGER_ENUMERATE_SERVICE);
  2. DWORD bSize = 0;
  3. DWORD services = 0;
  4. EnumServicesStatusEx(scm, SC_ENUM_PROCESS_INFO, SERVICE_WIN32, SERVICE_ACTIVE, NULL, bSize, &bSize, &services, 0, 0);
  5. LPBYTE sdata = new BYTE[bSize];
  6. EnumServicesStatusEx(scm, SC_ENUM_PROCESS_INFO, SERVICE_WIN32, SERVICE_ACTIVE, sdata, bSize, &bSize, &services, 0, 0);
  7. LPENUM_SERVICE_STATUS_PROCESS service = (LPENUM_SERVICE_STATUS_PROCESS)sdata;
  8. for (int x = 0; x < services; ++x)
  9. {
  10.  cout << service->lpServiceName << " (" << service->lpDisplayName << ") pid: " << service->ServiceStatusProcess.dwProcessId << endl;
  11.  ++service;
  12. }
  13. ...
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
el_doctor

Desconectado Desconectado

Mensajes: 57


Ver Perfil
Re: Obtener todos los procesos activos y los servicios que están usando
« Respuesta #8 en: 11 Septiembre 2013, 00:42 am »

Gracias Eternal disculpa, y para obtener el string del  lpServiceName osea guardarlo en una variable
« Última modificación: 11 Septiembre 2013, 00:51 am por el_doctor » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.935


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Obtener todos los procesos activos y los servicios que están usando
« Respuesta #9 en: 11 Septiembre 2013, 09:10 am »

string sname = service->lpServiceName;
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Donde mirar en Procesos Activos?
Análisis y Diseño de Malware
Edu 3 3,900 Último mensaje 12 Septiembre 2010, 21:24 pm
por Edu
[Solucionado] Obtener la ruta de todos los procesos en ejecución « 1 2 3 »
.NET (C#, VB.NET, ASP)
Segurida 23 17,308 Último mensaje 30 Mayo 2011, 00:32 am
por seba123neo
[VB.NET] Listar procesos activos en un Listbox.
.NET (C#, VB.NET, ASP)
kub0x 2 4,814 Último mensaje 26 Agosto 2011, 04:09 am
por kub0x
Problema con procesos activos
Foro Libre
Almapa 7 2,937 Último mensaje 22 Marzo 2013, 00:33 am
por $Edu$
Darknet, un promedio de 900 recursos en línea están activos en TOR diariamente
Noticias
wolfbcn 0 1,086 Último mensaje 14 Marzo 2014, 01:42 am
por wolfbcn
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines