Windows รุ่นใดเคยทำเช่นนี้มาก่อนหรือไม่?


36

แรงบันดาลใจจากบทความ DailyWTF วันนี้

การเรียกร้องของผู้เขียนที่ไฟล์จะถูกดำเนินการเมื่อคลิกที่ทางลัดไปสู่การยกตัวอย่างเช่น C:\Program.exeC:\Program Files\Doom 2\doom2.exe -nomusic

สมมุติว่า Windows พยายามเรียกใช้C:\Programอาร์กิวเมนต์Files\Doom 2/doom2.exe -nomusicก่อน

ถ้าไม่มีC:\Program.exeมันก็พยายามที่มีการขัดแย้งC:\Program Files\Doom2/doom2.exe -nomusic

และถ้าไม่มีC:\Program Files\Doom.exe\ก็จะพยายามC:\Program Files\Doom 2\doom2.exe -nomusicและประสบความสำเร็จในที่สุด

ฟังดูไร้สาระสมบูรณ์แบบสำหรับฉัน ฉันไม่อยากจะเชื่อเลยว่ามันจะได้ผลเช่นนี้ ผู้แสดงความคิดเห็นพูดได้ดี :

ฉันพบว่ามันยากที่จะเชื่อว่า Windows รุ่นที่วางจำหน่ายใด ๆ ที่เคยทำตามวิธีการทดลองและข้อผิดพลาดที่อธิบายโดย OP

ฉันเชื่ออย่างแน่นอนว่า Windows รุ่นที่ออกวางจำหน่ายมีพฤติกรรมที่ทำให้สมองตายเป็นค่าเริ่มต้น ฉันมีประสบการณ์โดยตรงหลายต่อหลายครั้ง

สิ่งที่ฉันไม่เชื่อว่าเป็นรุ่นที่วางจำหน่ายของ Windows มีนี้พฤติกรรมของสมองที่ตายตามที่อธิบายบทความ เป็นข้อบกพร่องด้านความปลอดภัยที่ใหญ่เกินไปที่จะไม่ได้สังเกตจนกว่าจะมีการส่งแบบสุ่มรายวัน WTF แบบสุ่มที่เปิดเผยอย่างน้อยหนึ่งทศวรรษต่อมา

แก้ไขเพื่อความชัดเจน:นี่คือวิธีทดสอบตัวเอง

  1. คัดลอก notepad.exe ไปยัง C: \ program.exe
  2. เรียกใช้ C: \ program files \ Internet explorer \ iexplore.exe
  3. เปิด Notepad สิ่งนี้คาดหวังเพราะพบสิ่งที่เรียกว่า C: \ program
  4. ย้าย progam.exe ไปยัง C: \ program files \ Internet.exe
  5. เรียกใช้ C: \ program files \ Internet explorer \ iexplore.exe

ตามที่ผู้เขียนบทความ ( และบทความนี้จาก Microsoft ), notepad ควรจะยังคงเปิดอยู่ แต่ไม่เป็นเช่นนั้นคำสั่งจะล้มเหลวด้วยข้อความนี้:

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

อีกครั้งฉันไม่ได้โต้แย้งการอ้างสิทธิ์ของบทความที่จะเรียกใช้โปรแกรม C: \ ฉันกำลังถกเถียงกันอยู่ว่า Windows พยายามทำซ้ำทุกไดเรกทอรีจนกว่าจะถึงการแข่งขัน

ดังนั้น Windows รุ่นใดที่เคยทำงานเช่นนี้มาก่อนหรือไม่


1
ใช่ ! ดูคำตอบของ @ grawity ที่นี่: superuser.com/a/373756/100787
iglvzx

2
คุณควรตรวจสอบความคิดเห็นทั้งหมด;) msdn.microsoft.com/en-us/library/windows/desktop/…
Baarn

ดูเหมือนว่ามีสอง (หรือมากกว่า) คำถามที่แยกจากกันเกิดขึ้นที่นี่: Windows จะช่วยให้คุณสร้างทางลัดไปยังC:\Program Files\...และ Windows จะแปลความหมายดังกล่าวเป็นทางลัด (หรือเรียกใช้คำสั่งหรือคำสั่งพร้อมรับคำสั่งหรือบางวิธีอื่น ๆ ) "C:\Program" Files\...ในฐานะ ส่วนแรกดูเหมือนไม่แน่ แต่ส่วนที่สองดูเหมือนว่าเป็นไปได้และคาดหวังให้ฉัน
mwfearnley

คำถามที่สามผมคิดว่าเป็น: Windows วิธีการใดก็ตามคำสั่งการทำงานจะแปลความหมายC:\Program Filesเป็น"C:\Program Files"? จากการอ่านเล็กน้อยดูเหมือนว่าคำตอบในบางกรณีอาจเป็น "ใช่" ซึ่งเป็นพื้นที่ที่ไม่คาดคิดจริงๆเท่านั้น
mwfearnley

คำตอบ:


32

Windows ทุกรุ่นตั้งแต่ชื่อไฟล์ยาวที่เพิ่มเข้ามาทำงานด้วยวิธีนี้จาก Windows 95 และรวมถึง Windows 7

นี่คือพฤติกรรมที่บันทึกไว้ :

lpApplicationNameพารามิเตอร์สามารถเป็นโมฆะ ในกรณีนั้นชื่อโมดูลจะต้องเป็นโทเค็นช่องว่างสีขาวตัวแรกใน สตริงlpCommandLine หากคุณกำลังใช้ชื่อไฟล์แบบยาวที่มีช่องว่างให้ใช้สตริงที่มีเครื่องหมายคำพูดเพื่อระบุว่าชื่อไฟล์สิ้นสุดที่ใดและอาร์กิวเมนต์เริ่มต้น มิฉะนั้นชื่อไฟล์จะคลุมเครือ ตัวอย่างเช่นพิจารณาสตริง "c: \ program files \ sub dir \ program name" สตริงนี้สามารถตีความได้หลายวิธี ระบบพยายามตีความความเป็นไปได้ตามลำดับต่อไปนี้:

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

ว่าทำไมจะถามวิธีนี้ - เพื่อที่จะไม่ทำลายโปรแกรมที่ไม่สามารถจัดการกับช่องว่างในชื่อไฟล์ได้อย่างถูกต้อง

แก้ไข ดูเหมือนว่าคำสั่ง "Run" จะไม่ทำงานเช่นนี้ - จะต้องมีตรรกะพิเศษเพิ่มเติมเพื่อจัดการกรณีที่แน่นอนนี้ อย่างไรก็ตามพยายามที่จะเรียกใช้จากที่อื่น - รวมถึงการใช้CreateProcessฟังก์ชั่นโดยตรงซึ่งเป็นสิ่งที่แอปพลิเคชันส่วนใหญ่จะใช้ในการเรียกใช้คำสั่ง

ดูพฤติกรรมนี้ในการทำงาน:

  1. เปิดพรอมต์คำสั่งของผู้ดูแลระบบ
  2. วิ่ง: copy c:\Windows\System32\notepad.exe c:\program.exe
  3. วิ่ง: c:\Program Files\Internet Explorer\iexplore.exe
  4. Notepad จะเปิดขึ้นโดยบอกว่าหาไม่เจอ Files\Internet Explorer\iexplore.exe
  5. พิมพ์c:\Program Files\Internet Explorer\iexplore.exeเป็นตัวเลือก Run และ IE จะเปิดอย่างถูกต้อง

แก้ไข 2ในกรณีC:\program files\internet.exeตัวอย่างของคุณ ฉันเชื่อว่านี่เป็นล่ามบรรทัดคำสั่งที่ได้รับในทาง มันพยายามที่จะประมวลผลและโทเค็นบรรทัดคำสั่งเป็นพารามิเตอร์ที่แยกตามช่องว่าง ดังนั้นจึงใช้C:\programเป็นโทเค็นแรกและตีความว่าเป็นชื่อโปรแกรมที่เหลือเป็นพารามิเตอร์

สำหรับการทดสอบฉันได้สร้างแอปพลิเคชั่นขนาดเล็กที่เรียกใช้CreateProcessโดยตรงและจะทำงานเหมือนกับที่บันทึกไว้ ของคุณตัวอย่างเช่นจะเปิดตัวC:\program files\internet.exe C:\program files\internet.exeดังนั้นจึงปรากฏว่าลักษณะการทำงานขึ้นอยู่กับว่าวิธีการที่คำสั่งจะถูกรัน - CreateProcessบางสิ่งบางอย่างอาจจะมีการประมวลผลบรรทัดคำสั่งก่อนที่จะผ่านไปยัง

โปรแกรมตัวอย่าง:

#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
ดูการแก้ไขของฉันเพราะเหตุใดสิ่งนี้จึงไม่ตอบคำถามของฉัน คุณทดสอบเฉพาะสิ่งแรกตามลำดับที่ให้ฉันถามเกี่ยวกับสิ่งที่สอง
dpatchery

ฉันได้ทำการค้นคว้าเพิ่มเติมเล็กน้อยแล้วและฉันเห็นด้วยกับการแก้ไขล่าสุดของคุณ - ดูเหมือนความคลาดเคลื่อนอยู่ระหว่าง cmd.exe และฟังก์ชัน CreateProcess ทำให้ฉันเชื่อ!
dpatchery

ส่วนนี้ดูไม่ถูกต้อง: ตัวอย่างC: \ program files \ internet.exe ของคุณจะเปิด C: \ program files \ internet.exe
Daniel Beck

ตามที่CreateProcessหน้า MSDN นี้เกิดขึ้นเฉพาะในกรณีที่lpApplicationNameพารามิเตอร์เป็นโมฆะ มิฉะนั้นระบบจะใช้พารามิเตอร์นั้นเป็นโปรแกรมในการเปิดใช้และจะไม่ค้นหาเพื่อค้นหา ฉันจะถือว่าคำสั่ง "Run" ไม่ได้ให้พารามิเตอร์NULLที่นี่ดังนั้นมันจะไม่ค้นหาโปรแกรมด้วยวิธีนี้
Kevin Panko

1
@ shf301 มันใช้งานได้จริงShellExecuteExและหลังจากนั้นก็โทรมาCreateProcess
Kevin Panko

5

ฉันแค่อยากจะเพิ่มบางอย่างให้กับคำตอบก่อนหน้า

แม้ว่าจะเป็นไปได้ที่จะบังคับให้เกิดพฤติกรรมนี้ผ่านความพยายามการเขียนโปรแกรมที่ไม่ดี (ไม่ใช่ RTFM) หรือพายุสมบูรณ์แบบที่พิสูจน์ไม่ได้ที่เกิดจากโปรแกรมป้องกันไวรัสนี้โดยเฉพาะ ทางลัดจะไม่ถูกสร้างขึ้นอย่างถูกต้องเช่นที่เป้าหมาย "C: \ Program Files \ Microsoft \ Office \ Word.exe" ด้วยเครื่องหมายคำพูดให้รัน C: \ Program.exe เหมือนกันกับ Firefox นรกนั้นเป็นไปไม่ได้ที่จะสร้างทางลัดที่ไม่สามารถหลบหนีได้อย่างถูกต้องเพราะมันทำอย่างชาญฉลาด

หากคุณสร้างทางลัดบนเดสก์ท็อปของคุณชี้ไปที่ Firefox มันจะถูกหลบหนีอย่างเหมาะสม ถ้าคุณคลิกขวา -> คุณสมบัติแล้วลองลบเครื่องหมายอัญประกาศมันจะแทรกโดยอัตโนมัติเมื่อคุณกดใช้แม้ว่าจะมี C: \ Program.exe อยู่ก็ตาม เมื่อมีการแยกวิเคราะห์นั้นฉันเดาว่าอาจให้ความสำคัญกับโฟลเดอร์หรือจัดการทุกอย่างก่อน '\' สุดท้ายเป็นส่วนหนึ่งของเส้นทาง เฉพาะในกรณีที่คุณแทรกช่องว่างสองจุดระหว่างโปรแกรมและไฟล์จะมีการวิเคราะห์คำแยกเป็นชี้ไปที่ C: \ Program.exe พร้อมอาร์กิวเมนต์ หากคุณสามารถแก้ไขทางลัดในโปรแกรมแก้ไขข้อความ (ไม่ใช่ข้อความธรรมดา) อาจใช้การได้

เช่นเดียวกับทางลัด Run Dialog แยกวิเคราะห์สตริงได้อย่างถูกต้องเช่นกัน เฉพาะใน Command Console ระดับค่อนข้างต่ำเท่านั้นที่จะเรียก C: \ Program.exe ไม่ถูกต้อง แต่จะไม่ลองความเป็นไปได้อื่น ๆ นั่นคือจะพยายามเรียก "C: \ Program.exe" อย่างไม่ถูกต้อง แต่จะไม่พยายามเรียก "C: \ Program Files \ Internet.exe" หรือสิ่งอื่นใดแม้ว่าจะมีความเป็นไปได้เหล่านั้นอยู่ก็ตาม จะส่งคืนข้อผิดพลาดที่แจ้งว่าหา C: \ Program.exe ไม่พบ

และเหนือสิ่งอื่นใดเมื่อมี Program.exe ในโฟลเดอร์ C: \ มันจะเตือนคุณเมื่อเริ่มต้นและถามว่าคุณต้องการเปลี่ยนชื่อหรือไม่ สิ่งนี้ได้รับการตรวจสอบแล้วสำหรับ XP, Vista, Windows 7 และตอนนี้ฉันสามารถตรวจสอบ Windows 8 ได้แล้ว ( http://goo.gl/eeNCp ) อาจเป็นไปได้ใน Windows 9x แต่ฉันสงสัย

บรรทัดล่างนี่ชัดเจนและไม่มีโปรแกรมเมอร์ Windows คนใดที่ทำผิดพลาดนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.