Pregunta

Dado que no he encontrado una respuesta a la pregunta formulada anteriormente aquí Estoy intentando un enfoque diferente.

¿Hay alguna forma de compartir memoria entre dos procesos?

El segundo proceso obtiene la información de una inyección ya que es un programa heredado que ya no se admite.

Mi idea es inyectar algo de código allí, en la estructura que estoy pasando al programa inyectado, pasar la dirección (o lo que sea) a la memoria compartida donde se encuentran los datos que necesito ejecutar. Una vez que obtenga los datos, llenaré mis propias variables dentro del hilo inyectado.

¿Es esto posible? ¿Cómo?

El código es apreciado.

EDITAR:

Creo que no está claro, así que lo aclararé. Yo sé cómo inyectar. Ya lo estoy haciendo. El problema aquí es pasar datos dinámicos a la inyección.

¿Fue útil?

Solución

Puede probar un archivo mapeado en memoria .

Esto proporciona un poco más paso a paso detalle.

Otros consejos

Aunque Windows admite memoria compartida a través de su API de asignación de archivos , no puede inyectar fácilmente una asignación de memoria compartida en otro proceso directamente, como MapViewOfFileEx no toma un argumento de proceso.

Sin embargo, puede inyectar algunos datos asignando memoria en otro proceso usando VirtualAllocEx y WriteProcessMemory . Si tuviera que copiar en un identificador utilizando DuplicateHandle , luego inyecte un trozo que llame a MapViewOfFileEx , usted podría establecer una asignación de memoria compartida en otro proceso. Como parece que va a inyectar código de todos modos, esto debería funcionar bien para usted.

Para resumir, deberá:

  • Cree un identificador de segmento de memoria compartida anónimo llamando a CreateFileMapping con INVALID_HANDLE_VALUE para hFile y NULL para lpName.
  • Copie este identificador en el proceso de destino con DuplicateHandle
  • Asigne un poco de memoria para el código utilizando VirtualAllocEx , con flAllocationType = MEM_COMMIT | MEM_RESERVE y flProtect = PAGE_EXECUTE_READWRITE
  • Escriba su código de código auxiliar en esta memoria, usando WriteProcessMemory . Es probable que este talón deba escribirse en ensamblador. Pase el MANGO de DuplicateHandle escribiéndolo aquí en alguna parte.
  • Ejecute su código auxiliar CreateRemoteThread . El trozo debe usar el MANGO que obtuvo para llamar a MapViewOfFileEx . Los procesos tendrán un segmento de memoria compartida común.

Puede que le resulte un poco más fácil si su código auxiliar carga una biblioteca externa, es decir, simplemente llame a LoadLibrary (encontrar la dirección de LoadLibrary se deja como un ejercicio para el lector) y haga su trabajo desde la entrada dllmain de la biblioteca punto. En este caso, el uso de memoria compartida con nombre probablemente sea más simple que perder el tiempo con DuplicateHandle. Consulte el artículo de MSDN sobre CreateFileMapping para obtener más detalles, pero, esencialmente, pase INVALID_HANDLE_VALUE para hFile y un nombre para lpName.

Editar : dado que su problema es pasar datos y no la inyección de código real, aquí hay algunas opciones.

  1. Usar memoria compartida de tamaño variable. Su código auxiliar obtiene el tamaño y el nombre o un identificador de la memoria compartida. Esto es apropiado si solo necesita intercambiar datos una vez. Tenga en cuenta que el tamaño de un segmento de memoria compartida no se puede cambiar fácilmente después de la creación.
  2. Use una canalización con nombre . Su trozo recibe el nombre o un mango de la tubería. Luego puede usar un protocolo apropiado para intercambiar bloques de tamaño variable; por ejemplo, escriba un size_t para la longitud, seguido del mensaje real. O use PIPE_TYPE_MESSAGE y PIPE_READMODE_MESSAGE, y esté atento a ERROR_MORE_DATA para determinar dónde terminan los mensajes. Esto es apropiado si necesita intercambiar datos varias veces.

Editar 2 : Aquí hay un boceto de cómo puede implementar el almacenamiento de identificadores o punteros para su código auxiliar:

.db B8            ;; mov eax, imm32
.dl handle_value  ;; fill this in (located at the start of the image + one byte)
;; handle value is now in eax, do with it as you will
;; more code follows...

También podría usar un nombre fijo, que probablemente sea más simple.

¿Intentó utilizar tuberías (para memoria) o incluso serialización (para sus objetos)? Puede usar archivos para administrar la memoria entre procesos. Los enchufes también son buenos para obtener comunicación entre procesos.

El mapeo de la memoria es el camino a seguir, ni siquiera necesita crear un espacio de memoria permanente, el sector de la memoria queda fuera de alcance cuando todos los procesos que lo comparten se apagan. También hay otras formas. Una manera rápida y sucia de pasar datos de una aplicación C a otra es usar el sistema operativo. En la línea de comando, escriba app1 | app2 . Esto hace que app2 sea el destino de salida de app1 o que un comando printf de app1 lo envíe a app2 (esto se llama tubería).

Puede intentar usar Boost.Interprocess para comunicarse entre dos procesos. Pero para inyectar código en un software no compatible previamente existente, probablemente tendrá que usar la forma @ bdonlan usando WriteProcessMemory .

Si está hablando de Windows, el obstáculo principal es que procesa cada uno en vivo en su propio espacio de dirección virtual. Desafortunadamente, no puede pasar las direcciones de memoria normales de un proceso a otro y obtener los resultados que espera. (Los hilos, por otro lado, todos viven en el mismo espacio de direcciones, por lo que los hilos pueden ver la memoria de la misma manera).

Windows, sin embargo, tiene un espacio de memoria compartida que debe tener mucho cuidado para administrar correctamente. Cualquier proceso que asigne espacio en el espacio de memoria compartida es responsable de liberar esa memoria explícitamente. Esto contrasta con la memoria local, que se desvanece más o menos cuando el proceso muere.

Consulte este artículo de muestra de MSDN para obtener algunas ideas sobre cómo utilizar el espacio de memoria compartida para conquistar el mundo Er, interfaz con software heredado. O lo que sea :) ¡Buena suerte, sea lo que sea que termines haciendo!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top