Esegui il programma dall’array di byte

Ho un programma memorizzato nell’array di byte.

È ansible eseguirlo all’interno di C #?

Sì. Questa risposta mostra che è ansible eseguire direttamente il contenuto di un array di byte. Fondamentalmente, si utilizza VirtualAlloc per allocare una regione eseguibile sull’heap con un indirizzo noto (un IntPtr ). Quindi copia l’array di byte in tale indirizzo con Marshal.Copy . Si converte il puntatore a un delegato con GetDelegateForFunctionPointer e infine si chiama come un delegato normale.

Sicuro.

  1. Salva l’array di byte in un file .exe .
  2. Utilizzare la class Process per eseguire il file.

Nota : si presume che l’array di byte sia un codice eseguibile e non un codice sorgente. Ciò presuppone anche che tu abbia un’intestazione PE valida o sappia come crearne una.

Supponendo che l’array di byte contenga un assembly .net (.exe o .dll):

  Assembly assembly = AppDomain.Load(yourByteArray) Type typeToExecute = assembly.GetType("ClassName"); Object instance = Activator.CreateInstance(typeToExecute); 

Ora, se typeToExecute implementa un’interfaccia nota al tuo programma chiamante, puoi lanciarla su questa interfaccia e invocare metodi su di essa:

  ((MyInterface)instance).methodToInvoke(); 

Se l’array di byte è un assembly .Net con un EntryPoint (metodo Main), è sufficiente farlo. La maggior parte delle volte returnValue sarebbe null . E se si desidera fornire argomenti della riga di comando, è ansible inserirli nella stringa commandArgs elencata di seguito.

 var assembly = Assembly.Load(assemblyBuffer); var entryPoint = assembly.EntryPoint; var commandArgs = new string[0]; var returnValue = entryPoint.Invoke(null, new object[] { commandArgs }); 

È ansible creare una macchina virtuale ed eseguire il codice OPPURE è ansible utilizzare la riflessione e i tipi dinamici per creare un assembly dinamico, potenzialmente. È ansible caricare dynamicmente l’assembly.

http://msdn.microsoft.com/en-us/library/system.reflection.assembly.load.aspx

Potresti quindi forse fare qualcosa con quello. Se la mia memoria mi serve anche se ci sono alcune limitazioni.

Vedere

Reflection Assembly.Load Application Domain