14 Stimmen

Laden der DLL von einem Speicherplatz

Wie die Frage sagt, möchte ich eine DLL von einem Ort im Speicher anstelle einer Datei laden, ähnlich wie LoadLibrary(Ex). Ich bin kein Experte für WinAPI, also habe ich ein wenig gegoogelt und folgendes gefunden dieser Artikel zusammen mit der MemoryModule-Bibliothek, die meine Bedürfnisse ziemlich genau erfüllt.

Andererseits sind die Informationen dort ziemlich alt, und auch die Bibliothek wurde seit einiger Zeit nicht mehr aktualisiert. Daher wollte ich wissen, ob es andere, neuere und bessere Wege gibt, dies zu tun. Falls jemand die in dem Artikel erwähnte Bibliothek bereits verwendet hat, könnte er mir einen Einblick in die Probleme geben, mit denen ich konfrontiert sein könnte, wenn ich sie verwende?

Nur für die Neugierigen: Ich untersuche das Konzept, einige Plug-ins für Anwendungen zu verschlüsseln, ohne die entschlüsselte Version auf der Festplatte zu speichern.

4 Stimmen

Hier ist ein gebrauchsfertiger Quellcode zum Laden der DLL aus dem Speicher: github.com/fancycode/MemoryModule

0 Stimmen

Es ist kein Problem, dass der Code alt ist. Er funktioniert immer noch unter Windows 10. Das einzige, was im MemoryModule fehlt, ist der Aktivierungskontext. Aber wenn Sie das brauchen, ist es einfach, hinzuzufügen.

4voto

shoosh Punkte 73374

Die Implementierung eines eigenen DLL-Laders kann sehr schnell sehr haarig werden. Wenn man diesen Artikel liest, kann man leicht übersehen, in welche verrückten Grenzfälle man sich verwickeln kann. Ich empfehle dringend davon ab.
Nur als Vorgeschmack - bedenken Sie, dass Sie keine herkömmlichen Debugging-Tools für den Code in der geladenen DLL verwenden können, da der Code, den Sie ausführen, nicht in der Region einer dem Betriebssystem bekannten DLL aufgeführt ist.
Ein weiteres ernstes Problem ist der Umgang mit DEP in Windows.

3voto

shoosh Punkte 73374

Nun, Sie können ein RAM Drive erstellen nach diese Anleitungen Kopieren Sie dann die DLL, die Sie im Speicher haben, in eine Datei und verwenden Sie LoadLibrary().
Dies ist natürlich nicht sehr praktisch, wenn Sie planen, dies als eine Art Produkt einzusetzen, da die Leute bemerken werden, dass ein Treiber installiert wird, ein Neustart nach der Installation und ein neuer Laufwerksbuchstabe unter Arbeitsplatz. Außerdem wird dadurch die DLL nicht versteckt, da sie einfach im RAM Drive liegt und jeder sie sehen kann.

Eine weitere Frage, die mich interessiert, ist: Warum wollen Sie das eigentlich tun? Vielleicht lässt sich das gewünschte Ergebnis auch auf andere Weise als durch das Laden der DLL aus dem Speicher erreichen. Zum Beispiel bei der Verwendung eines Binärpackers wie UPX Die DLL, die Sie auf der Festplatte haben, unterscheidet sich von derjenigen, die letztendlich ausgeführt wird. Unmittelbar nachdem die DLL normal mit LoadLibrary geladen wurde, setzt der Entpacker ein und schreibt den Speicher, in den die DLL geladen wurde, mit der unkomprimierten Binärdatei neu (der DLL-Header stellt sicher, dass genügend Platz vorhanden ist)

0voto

TarmoPikaro Punkte 4208

Eine ähnliche Frage wurde hier gestellt:

Laden der nativen C++ .dll aus dem RAM auf debuggerfreundliche Weise

Eine der Antworten schlägt die in github gezeigte dllloader-Beispielanwendung vor:

https://github.com/tapika/dllloader

Es unterstützt das Debuggen von .dll-Dateien von Haus aus.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X