En realidad es bastante fácil. Se ha descrito una técnica similar en un documento que leí hace 3 años.
de Windows le permiten llamar a la función CreateProcess con CREATE_SUSPENDED bandera, que le dice a la API para mantener el proceso en suspensión hasta que la función se llama ResumeThread.
Esto nos da tiempo para captar el contexto del hilo suspendido usando la función GetThreadContext, luego el registro EBX mantendrá un puntero a la estructura PBE(Process Enviroment Block), que necesitamos para determinar la dirección base.
Desde el diseño de la estructura PBE, podemos ver que la ImageBaseAddress se almacena en el octavo byte, por lo tanto, [EBX + 8] nos dará la dirección base real del proceso que se suspende.
Ahora necesitamos el EXE en memoria y alinearnos apropiadamente si la alineación de la memoria y el EXE en la memoria son diferentes.
Si la dirección base del proceso suspendido y el exe en memoria coinciden, más si el tamaño de la imagen del exe en la memoria es menor o igual que el proceso suspendido 'simplemente podemos usar WriteProcessMemory para escribir el exe en la memoria espacio de memoria del proceso suspendido.
Pero si las condiciones antes mencionadas no se cumplen, necesitamos un poco más de magia. Primero, necesitamos desasignar la imagen original usando ZwUnmapViewOfSection, y luego asignar suficiente memoria usando VirtualAllocEx dentro del espacio de memoria del proceso suspendido. Ahora tenemos que escribir el exe en memoria en el espacio de memoria del proceso suspendido usando la función WriteProcessMemory.
A continuación, aplique un parche a la BaseAddress del exe en memoria en PEB-> ImageBaseAddress del proceso suspendido.
El registro EAX del contexto de subproceso contiene la dirección de EntryPoint, que necesitamos reescribir con la dirección de EntryPoint del exe en la memoria. Ahora tenemos que guardar el contexto de subproceso alterado utilizando la función SetThreadContext.
Voila! ¡Estamos listos para llamar a la función ResumeThread en el proceso suspendido para ejecutarla!
Definitivamente puedo hacer eso. Mencioné CreateProcess porque es mi mejor alternativa, pero lo que dices podría funcionar. – ggambett