Puedo usar CreateProcess para lanzar un EXE. Quiero tener el contenido de un archivo EXE en un búfer de memoria y hacer CreateProcess (o un equivalente), sin tener que escribir en un archivo. Hay alguna manera de hacerlo?

La historia : hacemos juegos. Enviamos un simple EXE a nuestros distribuidores, que luego se envuelve el uso de sus favoritos de la DRM y vender a sus usuarios. Han habido casos donde los usuarios encuentran los accidentes. La mayoría de los accidentes que tome 5 minutos para arreglar, pero el parche debe ir a través del distribuidor y puede tomar varios días, incluso semanas. No puedo enviar el parcheado EXE a los jugadores porque no tienen el distribuidor de DRM. Estoy pensando en distribuir el juego real EXE dentro de un fichero de datos cifrados para lo que se envuelve (la externa EXE) sólo se descifra y se inicia el real EXE. De esta forma, se puede distribuir un arreglo sin desactivar el DRM.

InformationsquelleAutor ggambett | 2008-11-20

6 Comentarios

  1. 42

    Es en realidad bastante fácil. Técnica Similar ha sido descrito en un artículo que he leído como 3 años.

    De Windows permiten llamar al CreateProcess función con CREATE_SUSPENDED bandera, que indica la API para mantener el proceso se suspende hasta que el ResumeThread se llama a la función.

    Esto nos da tiempo para tomar el suspendido el contexto del subproceso mediante GetThreadContext función, entonces el registro EBX contendrá un puntero a la PBE(Proceso de medio Ambiente de Bloque) estructura, que necesitamos para determinar la dirección de la base.

    Desde el diseño de la PBE estructura podemos ver que el ImageBaseAddress se almacena en el 8 bytes, por lo tanto, [EBX+8] nos dará la base real de la dirección de la suspensión del proceso.

    Ahora necesitamos la memoria EXE y hacer adecuada alineación si la alineación de la memoria y en la memoria EXE diferencia.

    Si la dirección base de la suspensión de proceso y en la memoria exe partidos, además de que si la imageSize de la memoria exe es menor o igual a la suspensión del proceso de’ podemos simplemente usar WriteProcessMemory para escribir en la memoria exe en el espacio de memoria de la suspensión del proceso.

    Pero si las anteriores condiciones no se cumplan, necesitamos un poco más de magia.
    En primer lugar, tenemos que quitar la asignación de la imagen original utilizando ZwUnmapViewOfSection y, a continuación, asignar memoria suficiente el uso de VirtualAllocEx dentro del espacio de memoria de la suspensión del proceso. Ahora tenemos que escribir en la memoria exe en el espacio de memoria de la suspensión del proceso a través del WriteProcessMemory función.

    Siguiente, el parche de la dirección base de la en-memoria exe en el CEP->ImageBaseAddress de la suspensión del proceso.

    Registro EAX el contexto del subproceso tiene punto de entrada de la dirección, que necesitamos para volver a escribir con el punto de entrada de la dirección de la memoria en exe. Ahora tenemos que guardar la alteración del contexto del subproceso mediante el SetThreadContext función.

    Voila! Estamos listos para llamar a la ResumeThread función en la suspensión del proceso a ejecutar!

  2. 3

    Lo que quieres hacer requiere NtCreateProcess, pero es indocumentado y por lo tanto frágil. Este libro aparentemente cubre su uso.

    Tal vez se podría construir un sistema de parches? E. g. en el lanzamiento, el programa comprueba el parche de DLL en el mismo directorio, y la carga, si es que existe.

  3. 2

    Por qué usted necesita para crear un nuevo proceso? Yo habría pensado que se podrían ejecutar en el contexto del proceso que hace el desembalaje/descifrado.

    • Definitivamente puedo hacer eso. He mencionado CreateProcess porque es mi mejor alternativa, pero lo que dices no iba a funcionar.
  4. 1

    Lo que usted desea se puede lograr con algo que se llama un «Packer». En realidad, el lanzamiento de un exe de la memoria podría ser posible, pero es mucho más difícil que un packer 😉

    Uno de los más conocidos de los packers es UPX (google). Hay herramientas para descifrar, pero por lo menos debería dar un punto de partida para el trabajo froim. También estoy bastante seguro de UPX es de código abierto.

    • Yo había usado UPX antes, pero no creo que de esta vez. Puede ser que vale la pena explorar. Gracias!
    • Que es un hilo muy antiguo 😉 pero solo para precisar que aunque UPX es, de hecho, de código abierto, su licencia prohíbe explícitamente el uso para la encriptación/ocultación de los efectos.
  5. 0

    Mirar BoxedAppSDK

    Es compatible con el lanzamiento de exe a partir de un buffer de memoria.

    espero que ayude.

    • ¿Cómo se ejecute el ejecutable sin archivos temporales? Ningún otro software de reclamaciones para hacer esto.
    • Mediante la conexión de un montón de funciones 🙂

Dejar respuesta

Please enter your comment!
Please enter your name here