Unter welchen Umständen kann ich rundll32 verwenden, um eine Funktion in einer DLL aufzurufen?

1427
Ben N

Ich möchte die Funktionalität der verschiedenen Windows-DLLs von der Befehlszeile aus aufrufen. Es sieht so aus, als würde das rundll32Dienstprogramm tun, was ich brauche - es braucht einen DLL-Namen und einen Funktionsnamen und führt diese Funktion mit Parametern aus.

Ich hoffe natürlich, dass es damit keine Probleme geben wird. Welche Funktionen kann ich verwenden rundll32?

5

1 Antwort auf die Frage

5
Ben N

Es wird fast sicher Probleme geben.

Welche Funktionen kann ich verwenden rundll32?

Nun, optimalerweise würden Sie es überhaupt nicht verwenden - es ist veraltet :

Rundll32 ist ein Überbleibsel von Windows 95 und wurde seit mindestens Windows Vista als veraltet eingestuft, da es gegen viele moderne Konstruktionsrichtlinien verstößt. Wenn Sie etwas über Rundll32 ausführen, verlieren Sie die Möglichkeit, die Ausführungsumgebung an die Sache anzupassen, die Sie ausführen.

rundll32ist nur zum Aufrufen einer ganz bestimmten Art von Funktion bestimmt, insbesondere von Funktionen, die ein Fenster erstellen und Fenstermeldungen verarbeiten. Dieses Microsoft - Dokument auf der rundll32Schnittstelle erklärt, dass die Funktion sind rufen Sie muß eine nehmen HWND, ein HINSTANCE, ein LPSTR, und eine int(in dieser Reihenfolge), muss die Verwendung _stdcall/ CALLBACKAufrufkonvention und keinen Wert zurückgeben ( void).

Lesen Sie in der MSDN-Dokumentation zu der Funktion, die Sie aufrufen möchten, ob diese Signatur vorliegt. Zum Beispiel ExitWindowsExpasst nicht. In der Tat kann ich keine einzige Funktion mit dieser dokumentierten Signatur finden.

Wenn Sie nicht sicher sind, was das alles bedeutet, können Sie den nächsten Abschnitt überspringen und mit dem letzten Abschnitt fortfahren.

Was kann schief gehen, wenn ich es für andere Funktionen verwende?

Erinnern Sie sich an die ganze Signatur der Signatur? rundll32geht davon aus, dass die Funktion, die Sie aufrufen möchten, die richtige Signatur hat, unabhängig davon, ob dies tatsächlich der Fall ist. Wenn seine Annahme falsch ist, kann wirklich bizarres Stack-ähnliches Zeug weitergehen. Der Stack ist ein Speicherort, der Parameter speichert, die zwischen Funktionen übergeben werden.

Nicht übereinstimmende Funktionssignaturen führen dazu, dass die bereitgestellten Daten rundll32als etwas anderes interpretiert werden, da die Funktion erwartet, dass sich ihre Parameter im Stack befinden. Die erste Datumsversorgung rundll32ist ein Fensterhandle, das auf nicht deterministische Weise zugewiesen wird. Deshalb, wenn Sie mißbrauchen rundll32, sind Sie effektiv vorbei Zufallsdaten als ersten Parameter . Natürlich kann dies nicht nur den ersten Parameter der Opferfunktion beeinflussen, da unterschiedliche Datentypen unterschiedlichen Speicherplatz beanspruchen. Lesen Sie weiter: Was kann schief gehen, wenn Sie die Aufrufkonvention nicht erfüllen?

Der Rest der Parameter funktioniert nicht besser. Selbst wenn Sie der Funktion eine Befehlszeile zur Verfügung stellen rundll32, wird sie nicht in die Datentypen geparst, die für die Funktion geeignet sind. Stattdessen rundll32nimmt es den gesamten "zusätzlichen" Text, staut ihn in eine String-Variable und übergibt einen Zeiger auf diese Daten als späteren Parameter an die Funktion. Es liegt an der Funktion, den Text zu analysieren. Daher besteht keine Hoffnung, beliebige Funktionen mit vom Benutzer angegebenen Argumenten mit aufzurufen rundll32.

Es ist keine vollständige Katastrophe, wenn die Zielfunktion keine Parameter erwartet, Sie jedoch den Stapel durcheinanderbringen. Es gibt Code, rundll32um damit umzugehen, aber das gibt Ihnen keine Entschuldigung, um ihn weiterhin zu missbrauchen.

Wenn Sie rundll32eine kompatible Funktion in einer DLL eines Drittanbieters aufrufen, die auf diese Weise verwendet werden soll, können Probleme auftreten. rundll32wählt immer alle neuen Windows-Funktionen (z. B. Data Execution Prevention ), wodurch Änderungen vorgenommen werden können, für die der Drittanbietercode nicht entwickelt wurde; Deshalb ist das Verhalten opt-in.

Glücklicherweise gibt es eine bessere Möglichkeit, das zu tun, was Sie möchten.

Was kann ich stattdessen tun?

Versuchen, die Arbeitsstation zu sperren ( user32.dll,LockWorkStation)? Lauf einfach tsdiscon.

Versuch das System herunterzufahren ( user32.dll,ExitWindowsEx)? Verwenden Sie das shutdownDienstprogramm mit den entsprechenden Flags - siehe shutdown /?Hilfe.

Sind Sie ein Anwendungsentwickler und versuchen, eine DLL-Funktion aufzurufen, ohne eine neue EXE-Datei zu schreiben? Schreiben Sie das EXE (wahrscheinlich in C ++).

Versuchen Sie, etwas anderes auszuführen? Mein Open-Source-Dienstprogramm SprintDLL unterstützt vom Benutzer angegebene Parameterlisten, verschiedene Aufrufkonventionen und Skripts, um mit mehreren Funktionen und deren Ausgaben zu arbeiten. Wenn Sie lieber nur Windows-Tools verwenden, können Sie P / Invoke mit PowerShell ausführen .


Diese Frage und Antwort wurde als Referenz geschrieben, um diejenigen zu korrigieren, die rundll32eine zweifelhafte Verwendung vorschlagen . Wenn Sie Leute missbrauchen sehen rundll32, geben Sie ihnen einen Link zu dieser Seite!

Vielen Dank für die `ExitWindowsEx'-Funktion (oder sogar die Methode), davon wusste ich nichts. Zum Hinzufügen ist `tsdiscon` für [Tag: RDP] und es gibt` stop-computer` [tag: cmdlet] zum Herunterfahren. w17t vor 6 Jahren 0