Red de conocimiento informático - Conocimiento de Internet de las cosas - Cómo obtener la ruta del archivo ejecutable del programa a través del proceso del programa

Cómo obtener la ruta del archivo ejecutable del programa a través del proceso del programa

MSDN ha dicho que el identificador de instancia es la dirección base para cargar la imagen del proceso. Es el mismo para todos los procesos. Los demás procesos que obtenga no se pueden utilizar en su propio proceso. Por ejemplo, si crea cualquier proceso, la función GetModuleHandle(NULL) devuelve el identificador de instancia del proceso, que suele ser 0x400000 (puede ser menor o mayor que 0). Por lo tanto, solo hay una forma de obtener la ruta del proceso: inyectar su propio código en el espacio de direcciones del proceso de destino y usar GetMoudleFileName(GetModuleHandle(NULL), szModPath, MAX_PATH) en el código inyectado para obtener la ruta del proceso. .

Aquí es donde el proceso de inyección se vuelve interesante. La forma fácil y sencilla es utilizar el método mencionado en Programación principal de Windows, que consiste en inyectar su propia DLL en el método del proceso de destino mediante Crear subproceso remoto. El método para crear un hilo remoto es CreateRemoteThread(). Es muy simple. El uso es el mismo que CreateThread(), excepto que el primer parámetro adicional es el identificador del proceso de destino (recuerde, debe tener el permiso PROCESS_CREATE_THREAD). otros parámetros son los parámetros del proceso de destino en el espacio de direcciones.

El proceso básico debe ser:

Utilizar la función OpenProcess() con permisos PROCESS_CREATE_THREAD, PROCESS_VM_READ y PROCESS_VM_WRITE para abrir el proceso de destino y luego utilizar la función VirtualAllocEx para asignar espacio de memoria. en el proceso objetivo. Luego use la función VirtualAllocEx para asignar un espacio de memoria en el proceso de destino, guarde la ruta de su archivo Dll en este espacio, luego use WriteProcessMemory para escribir esta cadena y luego use la función GetProcAddress para obtener la dirección de LoadLibraryA. debe obtener el espacio de direcciones de su propio proceso La dirección, pero en términos generales, la dirección de la mayoría de los procesos es la misma que la dirección de la función LoadLibraryA. Usando una dirección de memoria asignada en el proceso de destino y la función LoadLibraryA, puede inyectar su propio archivo DLL creando un subproceso remoto.

Solo inyectando su propio código en el proceso de destino puede utilizar la función GetModuleFileName para obtener la ruta del proceso de destino. Por supuesto, este trabajo lo realiza la DLL inyectada en el proceso de destino.