CreateProcess dal buffer di memoria

Posso usare CreateProcess per avviare un EXE. Voglio avere il contenuto di un file EXE in un buffer di memoria e creare CreateProcess (o un equivalente) senza doverlo scrivere su un file. C’è un modo per farlo?

Il retroscena: creiamo giochi. Inviamo un semplice EXE ai nostri distributori, che poi lo avvolgono usando il loro DRM preferito e lo vendono ai loro utenti. Ci sono stati casi in cui gli utenti trovano arresti anomali. La maggior parte dei crash richiede 5 minuti per essere risolta, ma la patch deve passare attraverso il distributore e potrebbero essere necessari diversi giorni, persino settimane. Non posso semplicemente inviare l’EXE patchato ai giocatori perché non avrebbe il DRM del distributore. Sto pensando di distribuire il vero gioco EXE all’interno di un file di dati crittografato, quindi ciò che viene spostato (l’EXE esterno) viene decrittografato e avvia il vero EXE. In questo modo ho potuto distribuire in modo sicuro una correzione senza disabilitare il DRM.

In realtà è abbastanza facile. Una tecnica simile è stata descritta in un articolo che ho letto 3 anni fa.

Windows consente di chiamare la funzione CreateProcess con il flag CREATE_SUSPENDED , che indica all’API di mantenere il processo sospeso finché non viene chiamata la funzione ResumeThread .

Questo ci dà il tempo di afferrare il contesto del thread sospeso usando la funzione GetThreadContext , quindi il registro EBX terrà un puntatore alla struttura PBE (Process Enviroment Block) , che dobbiamo determinare l’indirizzo di base.

Dal layout della struttura PBE possiamo vedere che ImageBaseAddress è memorizzato all’ottavo byte, quindi [EBX + 8] ci darà l’effettivo indirizzo di base del processo che viene sospeso.

Ora abbiamo bisogno del file EXE in memoria e facciamo l’allineamento appropriato se l’allineamento tra memoria e EXE in memoria è diverso.

Se l’indirizzo di base del processo sospeso e in memoria exe corrisponde, più se imageSize del file in memoria è minore o uguale al processo sospeso ‘possiamo semplicemente usare WriteProcessMemory per scrivere in memoria exe nello spazio di memoria del processo sospeso.

Ma se le condizioni di cui sopra non sono state soddisfatte, abbiamo bisogno di un po ‘più di magia. Innanzitutto, è necessario rimuovere l’immagine originale utilizzando ZwUnmapViewOfSection e quindi allocare memoria sufficiente utilizzando VirtualAllocEx all’interno dello spazio di memoria del processo sospeso. Ora abbiamo bisogno di scrivere l’exe in memoria nello spazio di memoria del processo sospeso usando la funzione WriteProcessMemory .

Quindi, collega il BaseAddress del file di memoria in memoria in PEB-> ImageBaseAddress del processo sospeso.

Il registro EAX del contesto del thread contiene l’indirizzo EntryPoint, che è necessario riscrivere con l’indirizzo EntryPoint dell’exe in memoria. Ora dobbiamo salvare il contesto del thread modificato usando la funzione SetThreadContext .

Ecco! Siamo pronti a chiamare la funzione ResumeThread sul processo sospeso per eseguirla!

È ansible compilare il gioco come una DLL e inserire la DLL nel file di dati crittografato. Una DLL può essere caricata dalla memoria senza scriverla sul disco. Si prega di consultare questo tutorial (con codice di esempio alla fine): Caricamento di una DLL dalla memoria

Quello che vuoi fare richiede NtCreateProcess, ma non è documentato e quindi fragile. Questo libro apparentemente copre il suo uso.

Forse potresti build un sistema di patch? Ad esempio all’avvio, il programma controlla la DLL delle patch nella stessa directory e la carica se esiste.

Perché hai bisogno di creare un nuovo processo? Avrei pensato che potevi eseguire nel contesto del processo che esegue il disimballaggio / decrittografia.

Quello che vuoi può essere raggiunto con qualcosa chiamato “Packer”. In realtà il lancio di un exe dalla memoria potrebbe essere ansible, ma è molto più difficile di un packer;)

Uno dei packer più noti è UPX (google it). Ci sono strumenti per decrittografarlo, ma dovrebbe almeno darti un punto di partenza per lavorare su froim. Sono anche abbastanza sicuro che UPX sia open source.

Guarda BoxedAppSDK

Supporta l’avvio di exe da un buffer di memoria.

spero che sia d’aiuto.