Windows 버전이 이런 식으로 작동한 적이 있습니까?

Windows 버전이 이런 식으로 작동한 적이 있습니까?

에서 영감을 받다오늘의 DailyWTF 기사.

저자는 C:\Program.exe예를 들어 C:\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 버전에이것기사에 설명된 바와 같이 뇌사 행동. 이는 XP 이전 버전의 Windows 버전이어야 했기 때문에 적어도 10년이 지난 후 임의의 Daily WTF 제출이 이를 발견할 때까지 눈에 띄지 않게 지나치기에는 너무 큰 보안 결함입니다.

명확성을 위해 편집하십시오.제가 직접 테스트한 방법은 다음과 같습니다.

  1. notepad.exe를 C:\program.exe에 복사합니다.
  2. C:\program files\Internet Explorer\iexplore.exe를 실행합니다.
  3. 메모장이 열립니다. 이는 C:\program이라는 항목을 찾았기 때문에 예상되는 현상입니다.
  4. progam.exe를 C:\program files\Internet.exe로 이동합니다.
  5. C:\program files\Internet Explorer\iexplore.exe를 실행합니다.

기사 작성자에 따르면 (그리고 이 기사는 Microsoft에서 제공한 것입니다.), 메모장은 계속 열려 있어야 합니다. 하지만 그렇지 않습니다. 다음 메시지와 함께 명령이 실패합니다.

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

다시 말하지만, C:\program이 호출될 것이라는 기사의 주장에 대해 토론하는 것이 아닙니다. Windows는 일치하는 항목이 나올 때까지 모든 디렉터리를 재귀적으로 시도한다고 논쟁 중입니다.

그렇다면 Windows의 모든 버전이 이런 방식으로 작동한 적이 있습니까?

답변1

추가된 긴 파일 이름 이후의 모든 Windows 버전은 Windows 95부터 Windows 7까지 이러한 방식으로 작동합니다.

이것은 행동이다문서화:

그만큼lp애플리케이션 이름매개변수는없는. 이 경우 모듈 이름은 공백으로 구분된 첫 번째 토큰이어야 합니다. lp명령줄끈. 공백이 포함된 긴 파일 이름을 사용하는 경우 따옴표로 묶은 문자열을 사용하여 파일 이름이 끝나고 인수가 시작되는 위치를 나타냅니다. 그렇지 않으면 파일 이름이 모호해집니다. 예를 들어 "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

왜 이런 식으로 묻는지 - 그래서파일 이름의 공백을 올바르게 처리할 수 없는 프로그램을 중단하지 않습니다..

편집하다 "실행" 명령은 이와 같이 동작하지 않는 것 같습니다. 정확한 이 경우를 처리하려면 추가 논리가 추가되어야 합니다. 그러나 CreateProcess대부분의 응용 프로그램이 명령을 실행하는 데 사용하는 기능을 직접 사용하는 것을 포함하여 다른 곳에서 실행하려고 합니다 .

이 동작이 실제로 수행되는 것을 확인하십시오.

  1. 관리 명령 프롬프트 열기
  2. 달리다:copy c:\Windows\System32\notepad.exe c:\program.exe
  3. 달리다:c:\Program Files\Internet Explorer\iexplore.exe
  4. 메모장이 열리면서 찾을 수 없다는 메시지가 나타납니다.Files\Internet Explorer\iexplore.exe
  5. 실행 옵션을 입력하면 c:\Program Files\Internet Explorer\iexplore.exeIE가 올바르게 열립니다.

편집 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);
}

답변2

이전 답변에 뭔가를 추가하고 싶습니다.

노력, 잘못된 프로그래밍(RTFM 아님) 또는 이 특정 바이러스 백신 프로그램으로 인한 검증할 수 없는 완벽한 폭풍을 통해 이 동작을 강제할 수는 있지만 기사에서 설명하는 동작을 유발하는 것은 아무것도 없습니다. 예를 들어 따옴표가 있는 "C:\Program Files\Microsoft\Office\Word.exe"를 대상으로 하는 바로 가기는 C:\Program.exe를 실행하는 것과 같이 올바르게 생성된 바로 가기가 전혀 없습니다. 파이어폭스도 마찬가지다. 도대체 제대로 이스케이프되지 않는 바로가기를 만드는 것은 기본적으로 불가능합니다. 지능적으로 수행되기 때문입니다.

Firefox를 가리키는 바로가기를 데스크탑에 생성하면 올바르게 이스케이프됩니다. -> 속성을 ​​마우스 오른쪽 버튼으로 클릭하고 따옴표를 제거하려고 하면 C:\Program.exe가 존재하더라도 적용을 누르면 자동으로 따옴표가 삽입됩니다. 이를 구문 분석할 때 폴더에 우선 순위를 부여하거나 마지막 '\' 이전의 모든 항목을 경로의 일부로 처리하는 것 같습니다. Program과 Files 사이에 두 개의 공백을 삽입하는 경우에만 인수가 있는 C:\Program.exe를 가리키는 것으로 구문 분석됩니다. 텍스트 편집기에서 바로가기를 편집할 수 있다면(일반 텍스트가 아님) 작동할 수 있습니다.

바로가기와 마찬가지로 Run Dialog도 문자열을 올바르게 구문 분석합니다. 상대적으로 낮은 수준의 명령 콘솔에서만 C:\Program.exe를 잘못 호출하지만 다른 다양한 가능성을 시도하지는 않습니다. 즉, "C:\Program.exe" 호출을 잘못 시도하지만 "C:\Program Files\Internet.exe" 또는 다른 항목은 호출하지 않습니다. 이러한 가능성이 있더라도 마찬가지입니다. C:\Program.exe를 찾을 수 없다는 오류가 반환됩니다.

무엇보다도 C:\ 폴더에 Program.exe가 있으면 시작 시 경고를 표시하고 이름을 바꿀지 묻는 메시지를 표시합니다. 이는 XP, Vista, Windows 7에서 확인되었으며 이제 Windows 8(http://goo.gl/eeNCp).아마도이것은 Windows 9x에서 가능했지만 의심스럽습니다.

결론적으로 이것은 명백하며 어떤 Windows 프로그래머도 이런 실수를 하지 않을 것입니다.

관련 정보