Beschreibung:
Im Forum wurde schon öfters gefragt ob es nicht möglich ist native (C) Dll Dateien aus dem Speicher zu laden. Genau das ermöglicht MemoryModule.net
Es handelt sich dabei um einen "straigtforward" .net/C# Port von Memory Module von Joachim Bauch. Loading a DLL from memory
"Straigtforward" deshalb weil ich massiv den Unsafe-Kontext nutze und deshalb den originalen C-Code großteils übernehmen konnte. Man kann schon staunen wie ähnlich sich C# seinem Vorfahr sehen kann. 😉
Kleines (unvollständiges) Beispiel:
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate int AddNumbersDelegate(int a, int b);
//...
byte[] dll = Properties.Resources.SampleDll;
MemoryModule memModule = new MemoryModule(dll);
AddNumbersDelegate AddNumbers = (AddNumbersDelegate)memModule.GetDelegateFromFuncName("AddNumbers", typeof(AddNumbersDelegate));
int i = AddNumbers(40, 2);
Allerdings gibt es einige Einschränkungen:
Verfügbar, inkl. einem kleinen Beispielprogramm, ist das ganze unter der MPL (Mozilla Public License) 2.0 in meinem GIT-Repro:
https://github.com/Scavanger/MemoryModule.net
Bitte dort auch die Bug-Repots posten.
Danke
Schlagwörter: native, dll, speicher, laden, late binding, in memory execution, c
using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}
Coole Sache
Ich habe mal in einem Buch gelesen, wie man Assembler code als string in c++/cli on the fly kompiliert und von .net aus ausführt. Daher an sich nichts Neues, aber tolle Leistung 👍 Respekt.
Werd ich verfolgen.
Gruss
Wenn ich das richtig verstanden habe ist das hier doch nur eine "RunPE" oder ?
Weil sowas gibts ja schon zuhauf.
Jain.
Hierbei geht es darum eine Native DLL so einzubinden das sie von .NET aus benutzt werden kann, nicht um das starten eines Programms selber.
RunPE wird ja doch eher von Trojanern und Co benutzt.
Dies hier ist eher wie beim SQLite ADO.NET Provider die nativen Funktionen eingebaut werden.
Dies hier ist eher wie beim SQLite ADO.NET Provider die nativen Funktionen eingebaut werden.
Genau,
nur "anders herum". Bei SQLite (sprich Mergebin, siehe mein Post hier: Klassenbibliothek, die externe native DLL benutzt, erstellen und zu einer DLL zusammenfügen) wird die .net Assembly in die native Dll eingebettet. Mit MemoryModule.net kann die native Dll in eine .net Assembly eingebettet werden.
using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}
Nach ewiger Zeit hab ich mal wieder daran gesetzt und das Projekt an den aktuellen Stand des originals gebracht und endlich werden auch 64bit unterstützt.
Enschränkungen:
using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}