Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Distorsion en 12 Enero 2011, 15:26 pm



Título: Obtener ruta y nombre de archivo por el PID
Publicado por: Distorsion en 12 Enero 2011, 15:26 pm
Buenas,

estoy obteniendo unos PIDs de proceso y me gustaría obtener la ruta y el nombre del archivo en modo usuario. He estado buscando pero no he visto una API que lo haga directo, alguien conoce alguna? O tendré que recorrer la lista de procesos buscando el proceso que coincida con el PID y buscarme la vida?


Gracias ;-)


Título: Re: Obtener ruta y nombre de archivo por el PID
Publicado por: Littlehorse en 12 Enero 2011, 16:12 pm
Código
  1.  ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Pid);
  2.  if (ProcessHandle)
  3.    if (GetModuleFileNameEx(ProcessHandle, NULL, FileName, sizeof FileName))
  4.         cout << FileName << endl;


Título: Re: Obtener ruta y nombre de archivo por el PID
Publicado por: Distorsion en 12 Enero 2011, 16:28 pm
Código:
#include <windows.h>
#include <psapi.h>
#include <tchar.h>

#include <stdio.h>


int main()
{
  HANDLE processHandle = NULL;
  TCHAR filename[MAX_PATH];

  processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 3468);
  if (processHandle) {
    if (GetModuleFileName(processHandle, filename, sizeof(filename))) {
printf("Ruta: %s\n", filename);
    }
    CloseHandle(processHandle);
  } else {
    printf("error\n");
  }
  getchar();
  return 0;
}

Ya lo intente con este código, pero no me devuelve una ruta ni nada, me falla la función :(

Igualmente de esta manera hay que hacer un openproces con lo que no podre abrir cualquier proceso, por ejemplo el lsa.exe y no podre obtener su ruta.

Para solucionar esto ultimo estoy pensando en lanzar la aplicación en modo system, que nos e como, o directamente sacar la ruta desde el driver, ya que el pid lo saco desde el driver y lo comunico a una aplicación en modo usuario.

Gracias por la ayuda.


Título: Re: Obtener ruta y nombre de archivo por el PID
Publicado por: Littlehorse en 12 Enero 2011, 17:09 pm
Claro que va a fallar. Tenes que usar GetModuleFileNameEx, no GetModuleFileName. De hecho ni siquiera son los mismos parámetros, lee la documentación de la MSDN.

Código
  1. DWORD WINAPI GetModuleFileNameEx(
  2.  __in      HANDLE hProcess,
  3.  __in_opt  HMODULE hModule,
  4.  __out     LPTSTR lpFilename,
  5.  __in      DWORD nSize
  6. );


Citar
To locate the file for a module that was loaded by another process, use the GetModuleFileNameEx function.

hModule [in, optional]

    A handle to the module. If this parameter is NULL, GetModuleFileNameEx returns the path of the executable file of the process specified in hProcess.



Citar
Igualmente de esta manera hay que hacer un openproces con lo que no podre abrir cualquier proceso, por ejemplo el lsa.exe y no podre obtener su ruta.

En el ejemplo yo puse PROCESS_ALL_ACCESS para escribir menos pero lo correcto es utilizar solo lo necesario, lo cual en el caso de GetModuleFileNameEx es PROCESS_QUERY_INFORMATION y PROCESS_VM_READ por lo que no debería haber demasiado problema con la mayoría de los procesos y en caso de haberlo te basta con ajustar los privilegios correctamente.

Por otro lado, obviamente existe una limitación al querer hacerlo desde modo usuario, pero eso es un tema aparte. La limitación la instalas vos desde un principio al querer hacerlo desde modo usuario.

Saludos


Título: Re: Obtener ruta y nombre de archivo por el PID
Publicado por: Distorsion en 13 Enero 2011, 02:01 am
Es verdad :-[ No era la misma función :-[ Ya lo he solucionado, aunque los procesos en modo system no puedo listar su ubicación, no puedo usar openproces correctamente y nose como ajustar los privilegios de mi aplicación a system :-[

Lo he querido hacer en modo usuario por que no he encontrado la manera de hacerlo en el driver, tengo un el major de un driver hookeado y no he sido capaz de sacar el path de las aplicaciones que lo usan, solo sacar el PID con PsGetCurrentProcessId().

Gracias por la ayuda ;-)


Título: Re: Obtener ruta y nombre de archivo por el PID
Publicado por: Distorsion en 13 Enero 2011, 15:11 pm
Solucionado! Ya se ponerle privilegios de depuración, el problema es que tengo que darle al botón derecho y ejecutar como administrador, alguna solución a eso? Sino es un engorro si quiero automatizar la ejecución.

Gracias ;-)