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.
rundll32
ist 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 rundll32
Schnittstelle 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
/ CALLBACK
Aufrufkonvention 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 ExitWindowsEx
passt 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? rundll32
geht 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 rundll32
als etwas anderes interpretiert werden, da die Funktion erwartet, dass sich ihre Parameter im Stack befinden. Die erste Datumsversorgung rundll32
ist 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 rundll32
nimmt 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, rundll32
um damit umzugehen, aber das gibt Ihnen keine Entschuldigung, um ihn weiterhin zu missbrauchen.
Wenn Sie rundll32
eine kompatible Funktion in einer DLL eines Drittanbieters aufrufen, die auf diese Weise verwendet werden soll, können Probleme auftreten. rundll32
wä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 shutdown
Dienstprogramm 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
rundll32
eine zweifelhafte Verwendung vorschlagen . Wenn Sie Leute missbrauchen sehenrundll32
, geben Sie ihnen einen Link zu dieser Seite!