2015-05-01 12 views
17

Sto lavorando a un progetto correlato alle tecnologie di sandboxing.Eseguire un assembly .exe da un buffer in C

Attualmente sto scrivendo un programma in C che ottiene un piccolo assieme binario da un server Web remoto (.NET). Questo file binario è memorizzato in memoria (non tocca mai il disco) e la mia intenzione è di eseguire questo binario dalla memoria. Se il mio cliente è stato creato in .NET, non avrei problemi a eseguire quell'assembly dalla memoria (in realtà, ci sono molti modi diversi per ottenerlo) ma ovviamente non è possibile con C (non completamente sicuro).

Le mie domande sono: avere quell'assemblaggio .exe nello spazio degli indirizzi del mio programma C, c'è un modo per eseguirlo da lì? C'è un modo per consentire allo CLR di eseguirlo? All'inizio ho pensato di invocare powershell per eseguirlo da lì (usando Reflection.Assembly) ma in quel caso si tratta di scrivere l'assembly su disco.

In ogni caso, non c'è dubbio che il modo migliore ed efficace per ottenere questo è utilizzando un client .NET.

+5

È possibile, non ho dubbi. Facile? No. Ho il sospetto che questo sia al di fuori dell'ambito di una singola risposta SO. –

+0

Bene, sappiamo che. Gli assembly netti possono essere eseguiti solo dal runtime .net (o equivalente). Quindi, riguardo all'utilizzo di cli per interfacciare con C# di C. Quindi utilizzare i metodi C# già esistenti per eseguire un assembly dalla memoria. Funzionerebbe nel modo in cui lo vuoi? – kbzombie

+3

Può essere fatto in PS senza scrivere sul disco. Sicuramente NON facile. Ecco lo schema di [come] (https://www.defcon.org/images/defcon-21/dc-21-presentations/Bialek/DEFCON-21-Bialek-PowerPwning-Post-Exploiting-by-Overpowering-Powershell .pdf) e un link a [un sacco di codice] (https://github.com/clymb3r/powershell) –

risposta

0

Poiché l'exe avrà IL, invece delle istruzioni reali della macchina, non è possibile eseguirlo direttamente. La soluzione migliore è utilizzare lo CLR hosting api e anche in questo caso non sono sicuro che sia possibile farlo funzionare senza toccare il disco. Certamente qualsiasi codice .NET eseguito come risultato del codice di assembly in esecuzione finirà per caricare gli assembly CLR dal disco.

1

Se è un exe. compilare da .net allora è possibile, controllare http://www.codeproject.com/Articles/13897/Load-an-EXE-File-and-Run-It-from-Memory

Se si tratta di un binario non gestito, non sono a conoscenza di un metodo per farlo. Se non riesci a salvarlo sull'HDD, anche in una cartella temporanea potresti provare una sorta di ramdrive. L'esecuzione è facile con il seguente codice:

 //this is using imports from System.Diagnostics and System.IO 

     byte[] exeBytes = GetBytesFromStream(stream); // Get the .exe file from a webstream or something 
     string tmpFilename = Path.GetFileNameWithoutExtension(Path.GetTempFileName()) + ".exe"; 
     string tmpFilePath = Path.Combine(Path.GetTempPath, tmpFilename); 

     File.WriteAllBytes(tmpFilePath, exeBytes); 

     Process.Start(tmpFilePath); 
0

Se è stato caricato il file exe nella memoria, e si ha l'indirizzo virtuale di questo, (nello spazio virtuale della vostra applicazione), forse è possibile utilizzare comandi di assemblaggio come jump, o qualche metodo come le iniezioni DLL per eseguire l'altro exe.

Problemi correlati