DLL ohne exe laden
-
Hallo.
Ich habe eine Frage, wie kann man eine DLL Laden ohne ein Programm zu programmieren.
Sprich Windows wird gestartet und Windows lädt die DLL.
Wie könnte man das realisieren?Ich habe mir Gedanken gemacht und bin auf die regsvr32.exe gestoßen.
Damit kann man ja DLL regestrieren. Braucht man regsvr32.exe um das zu realisieren?
Wenn ja, wie muß ich die DLL entwickeln? Weil ne normale DLL geht nicht.Oder reicht es, wenn ich im BCB auf DLL-Wizard klicke und eine DLL entwickel und dann inst System32 kopiere?
Gruß
DJ BlackEagle
-
Hab zwar net soo die Ahnung aber man braucht doch theoretisch definierte SChnittstellen Funktionen, mit denen Windows "kommunizieren" kann, damit überhaupt etwas von der DLL ausgeführt wird...
-
Ein DLL ist Code und Daten. Und damit "etwas" zu tun brauchs eine EXE-Datei.
Denn durch deren Start wird erst ein Process erzeugt in dessen Umgebung etwas
"geschieht". Dort kann beispielsweise durch LoadLibrary() eine DLL geladen werden.
Anschliessend können von dieser DLL Daten abgerufen bzw. Code ausgeführt werden.Zum Beispiel regsvr32.exe:
Diese Programm lädt eine vorgegebene DLL und ruft je nach Kommandozeilen-Parameter
die Funktion DLLRegisterServer oder DllUnregisterServer auf. Nach anschliessender
Erfolgsmeldung beendet sich das Programm und die COM-Komponente ist in der Registry
eingetragen.
-
Das Zauberwort heisst rundll...
-
Chew-Z schrieb:
Ein DLL ist Code und Daten. Und damit "etwas" zu tun brauchs eine EXE-Datei.
Denn durch deren Start wird erst ein Process erzeugt in dessen Umgebung etwas
"geschieht". Dort kann beispielsweise durch LoadLibrary() eine DLL geladen werden.
Anschliessend können von dieser DLL Daten abgerufen bzw. Code ausgeführt werden.Das ist mir auch bewußt, mit DLL kenn ich mich ja schon aus.
Will nur das die von Windows geladen wird. Ich weiß das das geht, aber nur nicht wie das geht.Chew-Z schrieb:
Zum Beispiel regsvr32.exe:
Diese Programm lädt eine vorgegebene DLL und ruft je nach Kommandozeilen-Parameter
die Funktion DLLRegisterServer oder DllUnregisterServer auf. Nach anschliessender
Erfolgsmeldung beendet sich das Programm und die COM-Komponente ist in der Registry
eingetragen.OK, aber bleibt die DLL gestartet? Wird die DLL dann beim Start von Windows mit geladen?
Mit diesen COM-Komponente kann man zum Beispiel beim Explorer im Kontextmenü Einträge hinzufügen. Ok, diese DLL wird dann vom explorer.exe geladen.
-
Will nur das die von Windows geladen wird. Ich weiß das das geht, aber nur nicht wie das geht.
Wer soll sie denn laden und wozu. Du brauchst "irgend etwas" das die DLL lädt
und Funktionen von ihr aufruft. Beispielsweise EXPLORER.EXE oder SVCHOST.EXE oder
im gleichem Sinne auch ein Gerätetreiber.
Eine DLL ist eine Bibliothek von Funktionen/Daten, wenn da nichts ist das diese
Bibliothek nutzt, dann passiert auch nix.
Du kannst ein OCX beispielsweise in eine Container laden. Auch das ist wohl nicht
das was du willst.
Wie lautet denn deine konkrete Idee/Anforderung.
-
Chew-Z schrieb:
Will nur das die von Windows geladen wird. Ich weiß das das geht, aber nur nicht wie das geht.
Wer soll sie denn laden und wozu. Du brauchst "irgend etwas" das die DLL lädt
und Funktionen von ihr aufruft. Beispielsweise EXPLORER.EXE oder SVCHOST.EXE oder
im gleichem Sinne auch ein Gerätetreiber.
Eine DLL ist eine Bibliothek von Funktionen/Daten, wenn da nichts ist das diese
Bibliothek nutzt, dann passiert auch nix.
Du kannst ein OCX beispielsweise in eine Container laden. Auch das ist wohl nicht
das was du willst.Das ist ja nen COM-Kompo, die wird ja von ein Programm geladen wird (Wie auch bei ner .dll).
Chew-Z schrieb:
Wie lautet denn deine konkrete Idee/Anforderung.
Idee ist eine DLL die nicht sichtbar ist und nicht so einfach beendbar sein.
Ich weiß es hört sich nach nen Virus, Trojianer (wie auch immer das geschrieben wird), aber soll es nicht sein.
Meine Mutter möchte das der PC von meinen Bruder unter ihre fetische ist (Remote), aber er soll das nicht einfach beenden können uoder sehen können.
Das beenden eines Programm lässt sich unterbinden indem das Programm per Admin gestartet wird und er nur Benutzerrechte hat (da kann man keine Admin gestartete Programme beenden).
Aber er spielt Spiele und installiert welche. Da aber die netten Spielehersteller manchmal Einträge in der Registry oder sonst wo machen und rein schreiben, kann er dann das Spiel nicht starten. Ok, da müßen Rechte vergeben werden. Aber bis ich das meiner Mutter beigebracht habe, dauert das.In meiner Registry steht folgendes:
rundll32.exe bthprops.cpl,,BluetoothAuthenticationAgent
Laut MSDN (Siehe unten), wird die DLL gestartet. Ok, hier ist es eine cpl (Systemsteuerung).
Laut den folgenden Text geht das, was ich will. Und denke was junix auch meinte.
Aber das geht nicht.MSDN schrieb:
Unterschiede zwischen RUNDLL und RUNDLL32
RUNDLL lädt 16-Bit-DLLs und führt diese aus, wogegen RUNDLL32 32-Bit-DLLs lädt und ausführt. Wenn Sie den falschen DLL-Typ an RUNDLL oder RUNDLL32 übergeben, kann die Ausführung ohne Anzeige von Fehlermeldungen fehlschlagen.Befehlszeile für RUNDLL
Die Befehlszeile für RUNDLL sieht wie folgt aus:
RUNDLL.EXE <dllname>,<entrypoint> <optional arguments>
Im Folgenden ist ein Beispiel aufgeführt:
RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF
In der oben stehenden Befehlszeile sind drei Punkte besonders zu beachten:
- RUNDLL oder RUNDLL32 suchen in den Standardorten nach dem angegebenen DLL-Dateinamen (Einzelheiten hierzu finden Sie in der Dokumentation zur LoadLibrary()-Funktion). Es wird empfohlen, einen vollständigen Pfad zu der DLL anzugeben, damit gewährleistet ist, dass die korrekte DLL gefunden wird. Verwenden Sie zur Erzielung besserer Ergebnisse den kurzen anstelle des langen Dateinamens, um sicherzustellen, dass keine ungültigen Zeichen enthalten sind. Insbesondere sollte eine DLL im Ordner "C:\Programme" in ihren kurzen Dateinamen konvertiert werden.
- Der <DLL-Name> darf keine Leerzeichen, Kommas oder Anführungszeichen enthalten. Dies stellt eine Einschränkung des Befehlszeilenparsers für RUNDLL dar.
- In der oben stehenden Befehlszeile hat das Komma (,) zwischen dem <DLL-Namen> und dem Namen der <EntryPoint>-Funktion eine sehr wichtige Bedeutung. Wenn das Komma-Trennzeichen fehlt, schlagen RUNDLL oder RUNDLL32 fehl, ohne dass auf Fehler hingewiesen wird. Außerdem dürfen keine Leerzeichen zwischen dem <DLL-Namen>, dem Komma und der <EntryPoint>-Funktion stehen.
Funktionsweise von RUNDLL
RUNDLL führt die folgenden Schritte durch:
- Es analysiert die Befehlszeile
- Es lädt die angegebene DLL über LoadLibrary().
- Es ruft die Adresse der <EntryPoint>-Funktion über GetProcAddress() ab.
- Es ruft die <EntryPoint>-Funktion auf und übergibt das Befehlszeilenende, die <optionalen Argumente>.
- Wenn die <EntryPoint>-Funktion zurückgegeben wird, entlädt "Rundll.exe" die DLL und wird beendet.
-
Ich glaube nicht das der Process RUNDLL unsichtbar ist.
Was spricht den gegen die Verwendung eines eingeschränkten Benutzerkonto
für deinen Bruder.
Für irgendwelchen "Überwachungs"-Programme solltest du vielleicht einen Dienst
in Betracht ziehen. Denn nach Ende der Funktion beendet sich RUNDLL ja auch.
-
Das die DLL gekillt wird wenn die Funktion zuende geht, ist logisch und klar.
Aber das kann man mit ner while-Scheile und ProcessMessage verhindern und dann auf Nachrichten reagieren (Windows shutdown etc.). Diese while schleife wird auch genutzt um programme aktiv zu halten.Chew-Z schrieb:
Was spricht den gegen die Verwendung eines eingeschränkten Benutzerkonto
für deinen Bruder.DJ BlackEagle schrieb:
Aber er spielt Spiele und installiert welche. Da aber die netten Spielehersteller manchmal Einträge in der Registry oder sonst wo machen und rein schreiben, kann er dann das Spiel nicht starten. Ok, da müßen Rechte vergeben werden. Aber bis ich das meiner Mutter beigebracht habe, dauert das.
Und das mit den Spielen ist mir schonmal aufgefallen. Spiel unter Admin installed und dann unter einen normalen Benutzer gestartet. Ich mußte dann Rechte auf den Registry-Zweig geben.
Und ich wohne net Zuhause und kann nicht jedes mal da sein und erklären. Weil ich auch durch die Firma viel unterwegs bin.
-
Dieser Thread wurde von Moderator/in Jansen aus dem Forum Borland C++ Builder (VCL/CLX) in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.