Windows'un bir sürümü hiç bu şekilde davrandı mı?


36

Bugünün DailyWTF makalesinden esinlenilmiştir .

Yazar C:\Program.exe, örneğin bir kısayola tıklandığında bir dosyanın çalıştırılacağını iddia ediyor C:\Program Files\Doom 2\doom2.exe -nomusic.

Güya, Windows ilk C:\Programargümanlarla çağırmaya çalışır Files\Doom 2/doom2.exe -nomusic.

Hayır ise C:\Program.exe, daha sonra C:\Program Files\Doomargümanlarla çalışır 2/doom2.exe -nomusic.

Ve eğer yoksa, C:\Program Files\Doom.exe\nihayet dener C:\Program Files\Doom 2\doom2.exe -nomusicve başarılı olur.

Bu bana tamamen saçmalık gibi geliyor. Bu şekilde çalıştığına inanamıyorum. Bir yorumcu iyi koyar :

Windows tarafından yayımlanan herhangi bir sürümünün OP tarafından açıklanan deneme yanılma yöntemini yaptığına inanmak zor.

Windows'un yayımlanan bir sürümünün varsayılan olarak beyin ölümü davranışına sahip olduğuna kesinlikle inanıyorum. Bunu ilk elden, birçok kez deneyimledim.

İnanmadığım şey, Windows’un yayımlanmış bir sürümünün makalede açıklandığı gibi bu beyin ölümü davranışına sahip olduğudur. Bazı rastgele Günlük WTF gönderimleri ortaya çıkana kadar farkedilmeden geçilmesi çok büyük bir güvenlik açığı, en azından on yıl sonra XP'yi başlatan bir Windows sürümü olması gerekecekti.

Netlik için düzenleyin: İşte bunu kendim nasıl test ettiğim.

  1. Notepad.exe dosyasını C: \ program.exe dosyasına kopyalayın
  2. C: \ program files \ Internet explorer \ iexplore.exe'yi çalıştırın
  3. Not defteri açılır. Bu bekleniyor çünkü C: \ program adında bir şey buluyor.
  4. Progam.exe'yi C: \ program files \ Internet.exe'ye taşı
  5. C: \ program files \ Internet explorer \ iexplore.exe'yi çalıştırın

Makalenin yazara göre ( ve Microsoft'tan bu makale ) not defteri hala açılmalıdır. Ancak öyle değil, komut bu mesajla başarısız oluyor:

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

Yine, makalenin C: \ programının başlatılacağı iddiasını tartışmıyorum. Windows'un, bir dizine basana kadar her dizini yinelemeli olarak denediğini düşünüyorum.

Peki, herhangi bir Windows sürümü bu şekilde çalıştı mı?


1
Evet ! Burada @ grawity'nin cevabını görün: superuser.com/a/373756/100787
iglvzx

2
Bütün yorumları kontrol etmeliydin;) msdn.microsoft.com/en-us/library/windows/desktop/…
Baarn

Burada olup biten iki (veya daha fazla) ayrı soru var gibi görünüyor: Windows bir kısayol oluşturmanıza izin verir C:\Program Files\...ve Windows gibi bir kısayolu (veya Çalıştır komutunu veya komut istemi komutunu veya başka bir yöntemi) yorumlayabilir "C:\Program" Files\.... İlk bölüm pek mümkün görünmüyor, fakat ikinci bölüm bana çok muhtemel ve bekleniyor gibi görünüyor.
mwfearnley

Üçüncü soru, sanırım şöyledir: herhangi bir Windows komut çalışan yöntem yorumlamak olur C:\Program Filesolarak "C:\Program Files"? Biraz okumadan, bazı durumlarda cevabı gerçekten beklenmedik alan olan "evet" olabilir gibi görünüyor.
mwfearnley

Yanıtlar:


32

Windows'un eklenmiş olduğu uzun dosya adlarından bu yana her sürümü Windows 95'ten Windows 7'ye kadar bu şekilde çalışır.

Bu davranış belgelenmiştir :

LpApplicationName parametre olabilir NULL . Bu durumda, modül adı lpCommandLine dizgisinde ilk beyaz boşlukla ayrılmış belirteç olmalıdır . Boşluk içeren uzun bir dosya adı kullanıyorsanız, dosya adının nerede bittiğini ve bağımsız değişkenlerin nerede başladığını belirtmek için belirtilen dizeleri kullanın; Aksi takdirde, dosya adı belirsizdir. Örneğin, "c: \ program files \ sub dir \ program name" dizesini düşünün. Bu dize çeşitli şekillerde yorumlanabilir. Sistem olanakları aşağıdaki sırayla yorumlamaya çalışır:

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

Neden bu şekilde sorduğuna gelince - dosya adlarındaki boşlukları doğru kullanamayan programları bozmaz .

Düzenleme "Çalıştır" komutu bu şekilde davranmıyor gibi görünüyor - bu olayı ele almak için ek bir mantık eklenmiş olmalı. Ancak başka herhangi bir yerden çalıştırmaya çalışmak - CreateProcessçoğu uygulamanın bir komutu çalıştırmak için kullanacağı işlevi doğrudan kullanmak da dahil .

Bu davranışı çalışırken görün:

  1. Bir yönetici komut istemi açın
  2. Çalıştırmak: copy c:\Windows\System32\notepad.exe c:\program.exe
  3. Çalıştırmak: c:\Program Files\Internet Explorer\iexplore.exe
  4. Notepad, bulamadığını söyleyerek açılacak Files\Internet Explorer\iexplore.exe
  5. Tip c:\Program Files\Internet Explorer\iexplore.exeÇalıştır seçeneği içine ve IE doğru açılır.

Düzenleme 2 senin durumunda C:\program files\internet.exeörneğin; Bunun komut satırı yorumlayıcısının yoluna girdiğine inanıyorum. Komut satırını boşluklarla ayrılmış parametrelere dönüştürmeye ve belirtmeye çalışır. Bu yüzden C:\programilk belirteç olarak alır ve programın geri kalanını parametre olarak adlandırır.

Bir test için CreateProcessdoğrudan çağıran küçük bir uygulama oluşturdum ve tam olarak belgelendiği gibi davranıyor. Sizin C:\program files\internet.exeörnek başlatacak C:\program files\internet.exe. Böylece, davranış tam olarak komutun nasıl çalıştığına bağlı olarak ortaya çıkıyor - bir şey komut satırını geçmeden önce işliyor olabilir CreateProcess.

Örnek 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);
}

1
Bunun neden sorumu yanıtlamadığıyla ilgili düzenlememe bakın. Sadece ilk sırayı verilen sırayla test ettiniz, ikincisini soruyorum.
dpatchery

Kendimden biraz daha araştırma yaptım ve en son düzenlemenize katılıyorum - cmd.exe ile CreateProcess işlevi arasındaki uyuşmazlık gibi görünüyor. Beni ikna et!
dpatchery,

Bu kısım doğru görünmüyor: Sizin C: \ Program Files \ internet.exe örnek C başlatacak: \ Program Files \ internet.exe
Daniel Beck

MSDN'dekiCreateProcess sayfaya göre , bu yalnızca lpApplicationName parametresi NULL ise olur . Aksi halde, sistem bu parametreyi başlatılacak program olarak kullanır ve bulmak için arama yapmaz. "Çalıştır" komutunun burada bir NULL parametresi sağlamadığını , bu nedenle programı bu şekilde aramayacağını varsayardım .
Kevin Panko

1
@ shf301 Aslında kullanıyor ShellExecuteExve sonra çağırırCreateProcess
Kevin Panko

5

Sadece önceki cevaplara bir şeyler eklemek istiyorum.

Bu davranışı çaba, kötü programlama (RTFM değil) veya bu özel virüsten koruma programının neden olduğu doğrulanamayan mükemmel fırtına yoluyla zorlamak mümkün olsa da, hiçbir şey makalede açıklanan davranışa neden olmazdı. Kesinlikle hiçbir şekilde bir kısayol doğru oluşturulamaz, örneğin "C: \ Program Files \ Microsoft \ Office \ Word.exe" yi hedefleyen, C: \ Program.exe dosyasını çalıştırın. Firefox ile aynı. Cehennem, doğru şekilde kaçamayacak bir kısayol oluşturmak temelde imkansız çünkü akıllıca yapıldı.

Masaüstünüzde Firefox’a işaret eden bir kısayol oluşturursanız, düzgün bir şekilde atılır. - - özellikleri sağ tıklar ve tırnak işaretlerini kaldırmaya çalışırsanız, C: \ Program.exe olsa bile, geçerli olduğunda bunları otomatik olarak ekler. Bunu ayrıştırdığında, ya klasöre tercih verdiğini ya da son '\' dan önceki her şeyi yolun bir parçası olarak kabul ettiğini tahmin ediyorum. Yalnızca Program ve Dosyalar arasına iki boşluk eklerseniz, argümanlarla birlikte C: \ Program.exe'ye işaret olarak ayrıştırılır. Kısayolu bir metin düzenleyicide düzenleyebilirseniz (düz metin değildir), işe yarayabilir.

Kısayollar gibi, Çalıştır İletişim Kutusu da dizgiyi doğru ayrıştırır. Yalnızca nispeten düşük seviyeli Komut Konsolu'nda, yanlış C: \ Program.exe'yi arayacak, ancak diğer çeşitli olasılıkları deneyemeyecektir. Yani, yanlış bir şekilde "C: \ Program.exe" yi aramaya çalışacaktır, ancak bu olasılıklar mevcut olsa bile "C: \ Program Files \ Internet.exe" veya başka bir şeyi aramaya çalışmayacaktır. C: \ Program.exe dosyasını bulamadığını söyleyen bir hata döndürür.

Ve hepsinden önemlisi, C: \ klasöründe bir Program.exe olduğunda, başlangıçta sizi uyarır ve yeniden adlandırmak isteyip istemediğinizi sorar. Bu, XP, Vista, Windows 7 için doğrulandı ve şimdi Windows 8'i ( http://goo.gl/eeNCp ) doğrulayabilirim . Belki bu Windows 9x'ta mümkündü, ama şüpheliyim.

Alt satırda, bu açık ve hiçbir Windows programcısı bu hatayı yapmaz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.