Laden...

MemoryModule.net - Native DLLs aus dem Speicher laden

Erstellt von Scavanger vor 11 Jahren Letzter Beitrag vor 6 Jahren 10.889 Views
Scavanger Themenstarter:in
309 Beiträge seit 2008
vor 11 Jahren
MemoryModule.net - Native DLLs aus dem Speicher laden

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:

  • Z.z. werden nur 32bit Dll's unterstützt. 64bit Support ist in der nächsten Version geplant.
  • Probleme bereiten lt. Kommentaren auf Joachim Bauchs Seite Dll's die andere DLL's nachladen, z.B. wenn per Loadibary() eine Dll von der Platte nachgeladen wird.
  • OCX Controls werden nicht unterstützt

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));}}

194 Beiträge seit 2006
vor 11 Jahren

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

I
57 Beiträge seit 2011
vor 11 Jahren

Wenn ich das richtig verstanden habe ist das hier doch nur eine "RunPE" oder ?
Weil sowas gibts ja schon zuhauf.

F
10.010 Beiträge seit 2004
vor 11 Jahren

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.

Scavanger Themenstarter:in
309 Beiträge seit 2008
vor 11 Jahren

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));}}

Scavanger Themenstarter:in
309 Beiträge seit 2008
vor 6 Jahren

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:

  • Nur 32bit oder 64bit möglich (Aufruf aus "MixedMode" (noch) nicht möglich)
  • Kein laden von resourcen aus der nativen DLL
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));}}