Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
MemoryModule.net - Native DLLs aus dem Speicher laden
Scavanger
myCSharp.de - Member

Avatar #avatar-3209.jpg


Dabei seit:
Beiträge: 323

Themenstarter:

MemoryModule.net - Native DLLs aus dem Speicher laden

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Scavanger am .

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));}}
private Nachricht | Beiträge des Benutzers
Balaban_S
myCSharp.de - Member

Avatar #avatar-3199.jpg


Dabei seit:
Beiträge: 196
Herkunft: Zürich/Schweiz

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Balaban_S am .
private Nachricht | Beiträge des Benutzers
iSliver
myCSharp.de - Member



Dabei seit:
Beiträge: 59

beantworten | zitieren | melden

Wenn ich das richtig verstanden habe ist das hier doch nur eine "RunPE" oder ?
Weil sowas gibts ja schon zuhauf.
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10065

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Scavanger
myCSharp.de - Member

Avatar #avatar-3209.jpg


Dabei seit:
Beiträge: 323

Themenstarter:

beantworten | zitieren | melden

Zitat von FZelle
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));}}
private Nachricht | Beiträge des Benutzers
Scavanger
myCSharp.de - Member

Avatar #avatar-3209.jpg


Dabei seit:
Beiträge: 323

Themenstarter:

beantworten | zitieren | melden

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));}}
private Nachricht | Beiträge des Benutzers