Hat sich eine Windows-Version jemals so verhalten?

Hat sich eine Windows-Version jemals so verhalten?

Inspiriert vonder heutige DailyWTF-Artikel.

Der Autor behauptet, dass eine Datei C:\Program.exeausgeführt würde, wenn beispielsweise auf eine Verknüpfung geklickt würde C:\Program Files\Doom 2\doom2.exe -nomusic.

C:\ProgramAngeblich versucht Windows zuerst , mit den Argumenten aufzurufen Files\Doom 2/doom2.exe -nomusic.

Wenn kein vorhanden ist C:\Program.exe, wird es C:\Program Files\Doommit den Argumenten versucht 2/doom2.exe -nomusic.

Und wenn es kein gibt C:\Program Files\Doom.exe\, versucht es das schließlich C:\Program Files\Doom 2\doom2.exe -nomusicund es gelingt ihm.

Das klingt für mich nach völligem Unsinn. Ich kann nicht glauben, dass das jemals so funktioniert hat.Ein Kommentator bringt es gut auf den Punkt:

Ich kann kaum glauben, dass bei einer veröffentlichten Windows-Version jemals der vom OP beschriebene Versuch-und-Irrtum-Ansatz angewendet wurde.

Ich bin absolut davon überzeugt, dass eine veröffentlichte Version von Windows standardmäßig ein hirntotes Verhalten aufwies. Ich habe das viele, viele Male selbst erlebt.

Was ich nicht glaube, ist, dass eine veröffentlichte Version von WindowsDashirnloses Verhalten, wie im Artikel beschrieben. Es ist ein zu großer Sicherheitsfehler, als dass er unbemerkt geblieben wäre, bis ihn ein zufälliger Beitrag von Daily WTF aufgedeckt hätte, mindestens ein Jahrzehnt später, da es sich um eine Windows-Version handeln müsste, die vor XP existierte.

Zur Verdeutlichung bearbeiten:So habe ich es selbst getestet.

  1. Kopieren Sie notepad.exe nach C:\program.exe
  2. Führen Sie C:\Programme\Internet Explorer\iexplore.exe aus.
  3. Der Editor wird geöffnet. Dies ist zu erwarten, da er etwas namens C:\program findet.
  4. Verschieben Sie progam.exe nach C:\Programme\Internet.exe
  5. Führen Sie C:\Programme\Internet Explorer\iexplore.exe aus.

Laut dem Autor des Artikels (und dieser Artikel von Microsoft), sollte der Editor trotzdem geöffnet werden. Aber das tut er nicht, der Befehl schlägt mit dieser Meldung fehl:

C:\program is not recognized as an internal or external command, operable program or batch file.

Auch hier bestreite ich nicht die Behauptung des Artikels, dass C:\program aufgerufen würde. Ich bestreite, dass Windows rekursiv alle Verzeichnisse durchprobiert, bis es eine Übereinstimmung findet.

Hat irgendeine Windows-Version jemals auf diese Weise funktioniert?

Antwort1

Jede Windows-Version seit der Hinzufügung langer Dateinamen funktioniert auf diese Weise, von Windows 95 bis einschließlich Windows 7.

Dieses Verhalten istdokumentiert:

DerlpAnwendungsnameParameter kannNULL. In diesem Fall muss der Modulname das erste durch Leerzeichen getrennte Token im lpCommandLineZeichenfolge. Wenn Sie einen langen Dateinamen verwenden, der ein Leerzeichen enthält, verwenden Sie Anführungszeichen, um anzugeben, wo der Dateiname endet und die Argumente beginnen. Andernfalls ist der Dateiname mehrdeutig. Betrachten Sie beispielsweise die Zeichenfolge „c:\Programme\Unterverzeichnis\Programmname“. Diese Zeichenfolge kann auf verschiedene Arten interpretiert werden. Das System versucht, die Möglichkeiten in der folgenden Reihenfolge zu interpretieren:

c:\program.exe files\sub dir\program name
c:\program files\sub.exe dir\program name
c:\program files\sub dir\program.exe name
c:\program files\sub dir\program name.exe

Warum fragt man so - damit esbricht keine Programme ab, die mit Leerzeichen in Dateinamen nicht richtig umgehen können.

Bearbeiten Es scheint, dass sich der Befehl „Ausführen“ nicht so verhält – ihm muss eine zusätzliche Logik hinzugefügt werden, um genau diesen Fall zu behandeln. Der Versuch, ihn von einem anderen Ort aus auszuführen – einschließlich der CreateProcessdirekten Verwendung der Funktion, die die meisten Anwendungen zum Ausführen eines Befehls verwenden würden – ist jedoch nicht erfolgreich.

Sehen Sie dieses Verhalten in Aktion:

  1. Öffnen Sie eine administrative Eingabeaufforderung
  2. Laufen:copy c:\Windows\System32\notepad.exe c:\program.exe
  3. Laufen:c:\Program Files\Internet Explorer\iexplore.exe
  4. Notepad öffnet sich und meldet, dass es nicht gefunden werden kannFiles\Internet Explorer\iexplore.exe
  5. Geben Sie es c:\Program Files\Internet Explorer\iexplore.exein die Option „Ausführen“ ein und der IE wird korrekt geöffnet.

Bearbeiten 2In Ihrem Beispiel C:\program files\internet.exeglaube ich, dass der Befehlszeileninterpreter hier im Weg ist. Er versucht, die Befehlszeile zu verarbeiten und in durch Leerzeichen getrennte Parameter zu zerlegen. Er nimmt also C:\programdas erste Token und interpretiert es als Programmnamen und den Rest als Parameter.

Für einen Test habe ich eine kleine Anwendung erstellt, die CreateProcessdirekt aufruft und sich genau wie dokumentiert verhält. Ihr C:\program files\internet.exeBeispiel wird starten C:\program files\internet.exe. Es scheint also, dass das Verhalten davon abhängt, wie genau der Befehl ausgeführt wird – möglicherweise verarbeitet etwas die Befehlszeile, bevor sie an weitergegeben wird CreateProcess.

Beispielprogramm:

#include <Windows.h>

void main()
{
    STARTUPINFO si = {0};
    si.cb= sizeof(si);
    PROCESS_INFORMATION pi = {0};

    CreateProcess(NULL, "c:\\program files\\internet explorer\\iexplore.exe",
            NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
}

Antwort2

Ich möchte den vorherigen Antworten nur etwas hinzufügen.

Obwohl es möglich ist, dieses Verhalten durch Anstrengung, schlechte Programmierung (nicht RTFM) oder den nicht nachweisbaren perfekten Sturm, der durch dieses bestimmte Antivirenprogramm verursacht wurde, zu erzwingen, hätte nichts das im Artikel beschriebene Verhalten verursacht. Unter keinen Umständen würde eine korrekt erstellte Verknüpfung, z. B. eine, die auf „C:\Programme\Microsoft\Office\Word.exe“ mit den Anführungszeichen abzielt, C:\Program.exe ausführen. Dasselbe gilt für Firefox. Verdammt, es ist im Grunde unmöglich, eine Verknüpfung zu erstellen, die nicht ordnungsgemäß maskiert würde, weil dies auf intelligente Weise geschieht.

Wenn Sie auf Ihrem Desktop eine Verknüpfung erstellen, die auf Firefox verweist, wird diese ordnungsgemäß maskiert. Wenn Sie mit der rechten Maustaste -> Eigenschaften klicken und versuchen, die Anführungszeichen zu entfernen, werden sie automatisch eingefügt, wenn Sie auf „Übernehmen“ klicken, selbst wenn C:\Program.exe vorhanden ist. Wenn das analysiert wird, gehe ich davon aus, dass entweder dem Ordner der Vorzug gegeben wird oder alles vor dem letzten „\“ als Teil des Pfads behandelt wird. Nur wenn Sie zwei Leerzeichen zwischen „Programm“ und „Dateien“ einfügen, wird es als Verweis auf C:\Program.exe mit Argumenten analysiert. Wenn Sie die Verknüpfung in einem Texteditor bearbeiten können (es ist kein Klartext), funktioniert es möglicherweise.

Ähnlich wie bei Tastenkombinationen analysiert auch der Ausführen-Dialog die Zeichenfolge korrekt. Nur in der relativ einfachen Befehlskonsole wird fälschlicherweise C:\Program.exe aufgerufen, die anderen Möglichkeiten werden jedoch nicht ausprobiert. Das heißt, es wird fälschlicherweise versucht, „C:\Program.exe“ aufzurufen, aber nicht „C:\Programme\Internet.exe“ oder etwas anderes, selbst wenn diese Möglichkeiten bestehen. Es wird eine Fehlermeldung zurückgegeben, dass C:\Program.exe nicht gefunden werden kann.

Und wenn sich eine Program.exe im Ordner C:\ befindet, wird beim Start eine Warnung angezeigt und gefragt, ob Sie sie umbenennen möchten. Dies wurde für XP, Vista und Windows 7 überprüft und ich kann jetzt auch Windows 8 überprüfen (http://goo.gl/eeNCp).Vielleichtdies war in Windows 9x möglich, aber ich bezweifle es.

Unterm Strich ist dies offensichtlich und kein Windows-Programmierer würde diesen Fehler machen.

verwandte Informationen