Apakah versi Windows pernah berperilaku seperti ini?

36

Terinspirasi oleh artikel DailyWTF hari ini .

Penulis mengklaim bahwa file C:\Program.exeakan dieksekusi ketika mengklik jalan pintas ke, misalnya C:\Program Files\Doom 2\doom2.exe -nomusic,.

Seharusnya, Windows pertama kali mencoba untuk mengajukan C:\Programargumen Files\Doom 2/doom2.exe -nomusic.

Jika tidak ada C:\Program.exe, maka akan mencoba C:\Program Files\Doomdengan argumen 2/doom2.exe -nomusic.

Dan jika tidak ada C:\Program Files\Doom.exe\, akhirnya mencoba C:\Program Files\Doom 2\doom2.exe -nomusicdan berhasil.

Ini kedengarannya seperti omong kosong bagi saya. Saya tidak percaya itu pernah bekerja seperti ini. Seorang komentator mengatakannya dengan baik :

Saya merasa sulit untuk percaya bahwa setiap versi Windows yang dirilis pernah melakukan pendekatan coba-coba yang dijelaskan oleh OP.

Saya benar-benar percaya bahwa versi Windows yang dirilis memiliki perilaku mati otak sebagai default. Saya sudah mengalaminya sendiri berkali-kali.

Apa yang saya tidak percaya adalah bahwa versi Windows yang dirilis memiliki perilaku yang mematikan otak ini , seperti yang dijelaskan oleh artikel. Terlalu besar kesalahan keamanan yang terjadi tanpa disadari sampai beberapa pengajuan Harian WTF acak membukanya, setidaknya satu dekade kemudian karena itu harus menjadi versi Windows yang mendahului XP.

Sunting untuk kejelasan: Inilah cara saya mengujinya sendiri.

  1. Salin notepad.exe ke C: \ program.exe
  2. Jalankan C: \ program file \ Internet explorer \ iexplore.exe
  3. Notepad terbuka. Ini diharapkan karena ia menemukan sesuatu yang disebut program C: \
  4. Pindahkan progam.exe ke C: \ program file \ Internet.exe
  5. Jalankan C: \ program file \ Internet explorer \ iexplore.exe

Menurut penulis artikel ( dan artikel ini dari Microsoft ), notepad harus tetap terbuka. Tetapi tidak, perintah gagal dengan pesan ini:

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

Sekali lagi, saya tidak memperdebatkan klaim artikel bahwa program C: \ akan dipanggil. Saya memperdebatkan bahwa Windows secara rekursif mencoba setiap direktori sampai hits pertandingan.

Jadi, apakah ada versi Windows yang pernah bekerja dengan cara ini?

dpatchery
sumber
1
Ya ! Lihat @ grawity jawaban di sini: superuser.com/a/373756/100787
iglvzx
2
Anda harus memeriksa semua komentar;) msdn.microsoft.com/en-us/library/windows/desktop/…
Baarn
Sepertinya ada dua (atau lebih) pertanyaan terpisah yang terjadi di sini: apakah Windows mengizinkan Anda membuat pintasan C:\Program Files\..., dan apakah Windows akan menafsirkan pintasan seperti itu (atau perintah Run, atau perintah prompt perintah, atau beberapa metode lain) sebagai "C:\Program" Files\.... Bagian pertama tampaknya tidak mungkin, tetapi bagian kedua tampaknya mungkin dan diharapkan untuk saya.
mwfearnley
Pertanyaan ketiga, saya kira, adalah: apakah ada metode menjalankan perintah Windows yang diinterpretasikan C:\Program Filessebagai "C:\Program Files"? Dari sedikit bacaan, sepertinya jawabannya dalam beberapa kasus mungkin "ya", yang merupakan satu-satunya area yang benar-benar tidak terduga.
mwfearnley

Jawaban:

32

Setiap versi Windows sejak nama file yang panjang di mana ditambahkan bekerja dengan cara ini dari Windows 95 dan hingga termasuk Windows 7.

Ini adalah perilaku yang didokumentasikan :

The lpApplicationName parameter dapat NULL . Dalam hal itu, nama modul harus menjadi token putih-spasi pertama dalam string lpCommandLine . Jika Anda menggunakan nama file panjang yang berisi spasi, gunakan string yang dikutip untuk menunjukkan di mana nama file berakhir dan argumen dimulai; jika tidak, nama file tidak jelas. Sebagai contoh, perhatikan string "c: \ program files \ sub dir \ nama program". String ini dapat diartikan dalam beberapa cara. Sistem mencoba menafsirkan kemungkinan dalam urutan berikut:

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

Seperti mengapa ia bertanya seperti ini - sehingga tidak merusak program yang tidak dapat menangani spasi dalam nama file dengan benar .

Edit Tampaknya perintah "Jalankan" tidak berperilaku seperti ini - itu harus memiliki beberapa logika tambahan yang ditambahkan untuk menangani kasus yang tepat ini. Namun mencoba untuk menjalankan dari tempat lain - termasuk menggunakan CreateProcessfungsi secara langsung yang sebagian besar aplikasi akan gunakan untuk menjalankan perintah.

Lihat perilaku ini dalam aksi:

  1. Buka Prompt Perintah administratif
  2. Menjalankan: copy c:\Windows\System32\notepad.exe c:\program.exe
  3. Menjalankan: c:\Program Files\Internet Explorer\iexplore.exe
  4. Notepad akan terbuka memberitahu Anda bahwa itu tidak dapat ditemukan Files\Internet Explorer\iexplore.exe
  5. Ketik c:\Program Files\Internet Explorer\iexplore.exeopsi Run dan IE akan terbuka dengan benar.

Edit 2 Dalam hal C:\program files\internet.execontoh Anda ; Saya percaya ini adalah juru bahasa command line yang menghalangi. Itu mencoba untuk memproses dan tokenize baris perintah menjadi parameter yang dipecah oleh spasi. Jadi dibutuhkan C:\programsebagai token pertama dan mengartikannya sebagai nama program sebagai sisanya sebagai parameter.

Untuk tes saya membuat aplikasi kecil yang memanggil CreateProcesslangsung dan berperilaku persis seperti yang didokumentasikan. C:\program files\internet.exeContoh Anda akan diluncurkan C:\program files\internet.exe. Jadi kelihatannya perilaku tersebut tergantung pada bagaimana tepatnya perintah dijalankan - sesuatu mungkin memproses baris perintah sebelum meneruskannya CreateProcess.

Contoh program:

#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);
}
shf301
sumber
1
Lihat hasil edit saya mengapa ini tidak menjawab pertanyaan saya. Anda hanya menguji hal pertama dalam urutan yang diberikan, saya bertanya tentang yang kedua.
dpatchery
Saya telah melakukan sedikit lebih banyak riset sendiri dan saya setuju dengan hasil edit terakhir Anda - sepertinya memang ada perbedaan antara cmd.exe dan fungsi CreateProcess. Warnai aku yakin!
dpatchery
Bagian ini sepertinya tidak benar: Contoh C: \ program file \ internet.exe Anda akan meluncurkan C: \ program file \ internet.exe
Daniel Beck
Menurut CreateProcesshalaman di MSDN, ini hanya terjadi jika parameter lpApplicationName adalah NULL . Jika tidak, sistem akan menggunakan parameter itu sebagai program untuk diluncurkan dan tidak akan mencari untuk menemukannya. Saya akan menganggap perintah "Jalankan" TIDAK memberikan parameter NULL di sini, oleh karena itu, ia tidak akan mencari program dengan cara ini.
Kevin Panko
1
@ shf301 Ini benar-benar menggunakan ShellExecuteExdan kemudian memanggilCreateProcess
Kevin Panko
5

Saya hanya ingin menambahkan sesuatu ke jawaban sebelumnya.

Meskipun dimungkinkan untuk memaksa perilaku ini melalui upaya, pemrograman yang buruk (bukan RTFM), atau badai sempurna yang tidak dapat diverifikasi yang disebabkan oleh program antivirus khusus ini, tidak ada yang akan menyebabkan perilaku yang dijelaskan oleh artikel tersebut. Sama sekali tidak ada cara pintas dibuat dengan benar, misalnya yang menargetkan "C: \ Program Files \ Microsoft \ Office \ Word.exe", dengan tanda kutip, jalankan C: \ Program.exe. Sama dengan Firefox. Sial, pada dasarnya tidak mungkin untuk membuat jalan pintas yang tidak akan lolos dengan benar, karena dilakukan dengan cerdas.

Jika Anda membuat pintasan di desktop yang menunjuk ke Firefox, itu akan lolos dengan benar. Jika Anda klik kanan -> properti dan mencoba untuk menghapus tanda kutip, itu akan secara otomatis menyisipkan mereka ketika Anda menekan berlaku, bahkan jika C: \ Program.exe ada. Ketika mem-parsing itu, saya kira itu memberikan preferensi ke folder atau memperlakukan semuanya sebelum yang terakhir '\' sebagai bagian dari jalan. Hanya jika Anda menyisipkan dua spasi antara Program dan File yang akan diuraikan sebagai menunjuk ke C: \ Program.exe dengan argumen. Jika Anda dapat mengedit pintasan di editor teks (ini bukan plaintext), mungkin berhasil.

Sama seperti cara pintas, Run Dialog dengan benar mem-parsing string juga. Hanya di Command Console tingkat rendah yang akan salah memanggil C: \ Program.exe, tetapi tidak akan mencoba berbagai kemungkinan lainnya. Artinya, ia akan salah mencoba memanggil "C: \ Program.exe", tetapi tidak akan mencoba memanggil "C: \ Program Files \ Internet.exe" atau apa pun, bahkan jika kemungkinan itu ada. Ini akan mengembalikan kesalahan yang mengatakan tidak dapat menemukan C: \ Program.exe.

Dan di atas semua ini, ketika ada Program.exe di folder C: \, itu akan memperingatkan Anda saat memulai dan bertanya apakah Anda ingin mengganti nama. Ini telah diverifikasi untuk XP, Vista, Windows 7 dan sekarang saya dapat memverifikasi Windows 8 ( http://goo.gl/eeNCp ). Mungkin ini mungkin di Windows 9x, tapi saya ragu.

Intinya, ini jelas dan tidak ada programmer Windows yang akan membuat kesalahan ini.

lordcheeto
sumber