Có phải một phiên bản Windows đã hành xử theo cách này?


36

Lấy cảm hứng từ bài báo DailyWTF ngày nay .

Tác giả tuyên bố rằng một tập tin C:\Program.exesẽ được thực thi khi nhấp vào một phím tắt, ví dụ , C:\Program Files\Doom 2\doom2.exe -nomusic.

Giả sử, Windows trước tiên cố gắng gọi C:\Programvới các đối số Files\Doom 2/doom2.exe -nomusic.

Nếu không có C:\Program.exe, thì nó sẽ thử C:\Program Files\Doomvới các đối số 2/doom2.exe -nomusic.

Và nếu không có C:\Program Files\Doom.exe\, cuối cùng nó cũng cố gắng C:\Program Files\Doom 2\doom2.exe -nomusicvà thành công.

Điều này nghe có vẻ vô nghĩa với tôi. Tôi không thể tin nó từng hoạt động theo cách này. Một bình luận đặt nó tốt :

Tôi thấy khó tin rằng bất kỳ phiên bản Windows được phát hành nào đã từng thực hiện phương pháp thử và sai được mô tả bởi OP.

Tôi hoàn toàn tin rằng một phiên bản Windows được phát hành có hành vi chết não như một mặc định. Tôi đã trải nghiệm nó trực tiếp nhiều lần.

Điều tôi không tin là một phiên bản Windows được phát hành có hành vi chết não này , như được mô tả trong bài viết. Đó là một lỗ hổng bảo mật quá lớn đã không được chú ý cho đến khi một số bài nộp WTF ngẫu nhiên hàng ngày phát hiện ra nó, ít nhất một thập kỷ sau vì nó sẽ phải là một phiên bản Windows có trước XP.

Chỉnh sửa cho rõ ràng: Đây là cách tôi tự kiểm tra điều này.

  1. Sao chép notepad.exe sang C: \ program.exe
  2. Chạy C: \ tệp chương trình \ Internet explorer \ iexplore.exe
  3. Notepad mở ra. Điều này được mong đợi bởi vì nó tìm thấy một cái gì đó gọi là chương trình C: \
  4. Di chuyển progam.exe sang C: \ chương trình tập tin \ Internet.exe
  5. Chạy C: \ tệp chương trình \ Internet explorer \ iexplore.exe

Theo tác giả của bài viết ( và bài viết này của Microsoft ), notepad vẫn nên mở. Nhưng nó không, lệnh thất bại với thông báo này:

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

Một lần nữa, tôi không tranh luận về tuyên bố của bài báo rằng chương trình C: \ sẽ được gọi. Tôi đang tranh luận rằng Windows đệ quy thử mọi thư mục cho đến khi nó khớp.

Vì vậy, đã có phiên bản Windows nào hoạt động theo cách này chưa?


1
! Xem câu trả lời của @ grawity tại đây: superuser.com/a/373756/100787
iglvzx

2
Bạn nên kiểm tra tất cả các ý kiến;) msdn.microsoft.com/en-us/l Library / windows / desktop / Kẻ
Baarn

Có vẻ như có hai (hoặc nhiều) câu hỏi riêng biệt đang diễn ra ở đây: Windows có cho phép bạn tạo một lối tắt đến không C:\Program Files\..., và Windows sẽ giải thích một lối tắt như vậy (hoặc lệnh Run, hoặc lệnh nhắc lệnh, hoặc một số phương thức khác) như "C:\Program" Files\.... Phần đầu dường như không thể, nhưng phần thứ hai dường như có thể xảy ra và được mong đợi đối với tôi.
mwfearnley

Một câu hỏi thứ ba, tôi đoán, là: liệu bất kỳ phương thức chạy lệnh nào của Windows sẽ diễn giải C:\Program Filesthành "C:\Program Files"? Từ một chút đọc, có vẻ như câu trả lời trong một số trường hợp có thể là "có", đó là khu vực thực sự bất ngờ duy nhất.
mwfearnley

Câu trả lời:


32

Mọi phiên bản Windows kể từ tên tệp dài được thêm vào đều hoạt động theo cách này từ Windows 95 và cho đến cả Windows 7.

Đây là hành vi được ghi lại :

Các lpApplicationName tham số có thể NULL . Trong trường hợp đó, tên mô-đun phải là mã thông báo được phân tách không gian trắng đầu tiên trong chuỗi lpCommandLine . Nếu bạn đang sử dụng tên tệp dài chứa khoảng trắng, hãy sử dụng các chuỗi được trích dẫn để chỉ ra nơi tên tệp kết thúc và các đối số bắt đầu; mặt khác, tên tập tin là mơ hồ. Ví dụ: xem xét chuỗi "c: \ tệp chương trình \ thư mục con \ tên chương trình". Chuỗi này có thể được hiểu theo một số cách. Hệ thống cố gắng diễn giải các khả năng theo thứ tự sau:

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

Về lý do tại sao nó hỏi theo cách này - để nó không phá vỡ các chương trình không thể xử lý khoảng trắng trong tên tệp một cách chính xác .

Chỉnh sửa Nó xuất hiện lệnh "Chạy" không hoạt động như thế này - nó phải có thêm một số logic được thêm vào để xử lý trường hợp chính xác này. Tuy nhiên, cố gắng chạy từ bất cứ nơi nào khác - bao gồm sử dụng CreateProcesschức năng trực tiếp, đó là điều mà hầu hết các ứng dụng sẽ sử dụng để chạy lệnh.

Xem hành vi này trong hành động:

  1. Mở một dấu nhắc lệnh hành chính
  2. Chạy: copy c:\Windows\System32\notepad.exe c:\program.exe
  3. Chạy: c:\Program Files\Internet Explorer\iexplore.exe
  4. Notepad sẽ mở cho bạn biết nó không thể tìm thấy Files\Internet Explorer\iexplore.exe
  5. Nhập c:\Program Files\Internet Explorer\iexplore.exevào tùy chọn Run và IE sẽ mở chính xác.

Chỉnh sửa 2 Trong trường hợp C:\program files\internet.exeví dụ của bạn ; Tôi tin rằng đây là trình thông dịch dòng lệnh đang cản trở. Nó cố gắng xử lý và mã hóa dòng lệnh thành các tham số được chia theo khoảng trắng. Vì vậy, nó lấy C:\programmã thông báo đầu tiên và giải thích rằng tên chương trình là phần còn lại làm tham số.

Đối với một thử nghiệm, tôi đã tạo ra một ứng dụng nhỏ gọi CreateProcesstrực tiếp và nó hoạt động chính xác như tài liệu. C:\program files\internet.exeVí dụ của bạn sẽ khởi chạy C:\program files\internet.exe. Vì vậy, có vẻ như hành vi phụ thuộc vào chính xác cách chạy lệnh - một cái gì đó có thể đang xử lý dòng lệnh trước khi chuyển nó đến CreateProcess.

Chương trình ví dụ:

#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
Xem chỉnh sửa của tôi để biết tại sao điều này không trả lời câu hỏi của tôi. Bạn chỉ kiểm tra điều đầu tiên theo thứ tự được đưa ra, tôi đang hỏi về điều thứ hai.
dpatchery

Tôi đã tự nghiên cứu thêm một chút và tôi đồng ý với chỉnh sửa mới nhất của bạn - có vẻ như sự khác biệt nằm giữa cmd.exe và chức năng CreatProcess. Màu tôi thuyết phục!
dpatchery

Phần này có vẻ không đúng: Ví dụ về tệp C: \ chương trình \ internet.exe của bạn sẽ khởi chạy tệp C: \ chương trình \ internet.exe
Daniel Beck

Theo CreateProcesstrang tại MSDN, điều này chỉ xảy ra nếu tham số lpApplicationNameNULL . Nếu không, hệ thống sẽ sử dụng tham số đó làm chương trình để khởi chạy và nó sẽ không tìm kiếm để tìm thấy nó. Tôi cho rằng lệnh "Run" KHÔNG cung cấp tham số NULL ở đây, do đó, nó sẽ không tìm kiếm chương trình theo cách này.
Kevin Panko

1
@ shf301 Nó thực sự sử dụng ShellExecuteExvà sau đó gọiCreateProcess
Kevin Panko

5

Tôi chỉ muốn thêm một cái gì đó vào các câu trả lời trước.

Mặc dù có thể buộc hành vi này thông qua nỗ lực, lập trình xấu (không phải RTFM) hoặc cơn bão hoàn hảo không thể kiểm chứng được gây ra bởi chương trình chống vi-rút cụ thể này, nhưng không có gì có thể gây ra hành vi được mô tả bởi bài viết. Hoàn toàn không có cách nào một phím tắt được tạo chính xác, ví dụ: một phím nhắm mục tiêu "C: \ Program Files \ Microsoft \ Office \ Word.exe", với dấu ngoặc kép, hãy chạy C: \ Program.exe. Tương tự với Firefox. Chết tiệt, về cơ bản là không thể tạo ra một lối tắt không thể thoát được, bởi vì nó được thực hiện một cách thông minh.

Nếu bạn tạo một lối tắt trên màn hình nền để trỏ tới Firefox, nó sẽ được thoát đúng. Nếu bạn nhấn phải -> thuộc tính và cố gắng xóa dấu ngoặc kép, nó sẽ tự động chèn chúng khi bạn nhấn áp dụng, ngay cả khi C: \ Program.exe tồn tại. Khi nó phân tích cú pháp đó, tôi đoán nó sẽ ưu tiên cho thư mục hoặc xử lý mọi thứ trước '\' cuối cùng như một phần của đường dẫn. Chỉ khi bạn chèn hai khoảng trắng giữa Chương trình và Tệp thì nó mới được phân tích cú pháp khi trỏ đến C: \ Program.exe bằng các đối số. Nếu bạn có thể chỉnh sửa lối tắt trong trình soạn thảo văn bản (nó không phải là văn bản gốc), nó có thể hoạt động.

Cũng giống như các phím tắt, Hộp thoại Run cũng phân tích chính xác chuỗi. Chỉ trong Bảng điều khiển lệnh cấp độ tương đối thấp, nó sẽ gọi C: \ Program.exe không chính xác, nhưng nó sẽ không thử các khả năng khác nhau. Đó là, nó sẽ cố gắng gọi "C: \ Program.exe" một cách không chính xác, nhưng sẽ không cố gọi "C: \ Program Files \ Internet.exe" hoặc bất cứ điều gì khác, ngay cả khi những khả năng đó tồn tại. Nó sẽ trả về một lỗi cho biết nó không thể tìm thấy C: \ Program.exe.

Và trên hết, khi có một Program.exe trong thư mục C: \, nó sẽ cảnh báo bạn khi khởi động và hỏi bạn có muốn đổi tên nó không. Điều này đã được xác minh cho XP, Vista, Windows 7 và bây giờ tôi có thể xác minh Windows 8 ( http://goo.gl/eeNCp ). Có lẽ điều này là có thể trong Windows 9x, nhưng tôi nghi ngờ nó.

Tóm lại, điều này là hiển nhiên và không có lập trình viên Windows nào mắc lỗi này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.