Windows 버전이 이런 식으로 동작 했습니까?


36

오늘의 DailyWTF 기사에서 영감을 얻었습니다 .

저자는 C:\Program.exe예를 들어 바로 가기를 클릭하면 파일 이 실행될 것이라고 주장합니다 C:\Program Files\Doom 2\doom2.exe -nomusic.

아마도 Windows는 먼저 C:\Programarguments 를 사용하여 호출하려고 시도합니다 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 년이 지난 후 임의의 일일 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
! 여기
@grawity

2
) 당신은 모든 의견을 확인해야 msdn.microsoft.com/en-us/library/windows/desktop/...
Baarn

여기에 두 가지 이상의 별도의 질문이있는 것처럼 보입니다 .Windows가에 대한 바로 가기를 만들 수 있고 C:\Program Files\...Windows가 바로 가기 (또는 실행 명령 또는 명령 프롬프트 명령 또는 다른 방법)를 다음과 같이 해석합니다 "C:\Program" Files\.... 첫 번째 부분은 거의 보이지 않지만 두 번째 부분은 나에게 가능성이 있고 예상되는 것 같습니다.
mwfearnley 2016 년

세 번째 질문은 다음과 같습니다. 주어진 Windows 명령 실행 방법 C:\Program Files"C:\Program Files"? 약간의 독서에서, 어떤 경우에는 대답이 "예"일 수 있으며, 이것이 실제로 예상치 못한 유일한 영역입니다.
mwfearnley

답변:


31

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

이 동작은 문서화되어 있습니다 .

lpApplicationName의 매개 변수가 될 수 NULL . 이 경우 모듈 이름은 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

이 때문에 - 그것은 이런 식으로 묻는 이유에 제대로 파일 이름에 공백을 처리 할 수있는 프로그램을 중단하지 않습니다 .

편집 "실행"명령이 이와 같이 동작하지 않는 것 같습니다. 정확한 경우를 처리하기 위해 추가 로직이 추가되어야합니다. 그러나 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.exe실행 옵션을 입력 하면 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를 : \ 프로그램 파일은 C를 시작합니다 internet.exe 예를 \ : \ 프로그램 파일 \ internet.exe
다니엘 벡

CreateProcessMSDN 의 페이지에 따르면 lpApplicationName 매개 변수가 NULL 인 경우에만 발생 합니다 . 그렇지 않으면 시스템은 해당 매개 변수를 시작하는 프로그램으로 사용하며 찾기 위해 검색하지 않습니다. 여기서는 "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가 있어도 적용을 누르면 따옴표가 자동으로 삽입됩니다. 구문 분석 할 때 폴더를 선호하거나 경로의 일부로 마지막 '\'앞의 모든 것을 처리한다고 생각합니다. Program과 Files 사이에 공백을 두 개 삽입 한 경우에만 인수가있는 C : \ Program.exe를 가리키는 것으로 구문 분석됩니다. 텍스트 편집기에서 바로 가기를 편집 할 수있는 경우 (일반 텍스트 아님) 제대로 작동 할 수 있습니다.

바로 가기와 마찬가지로 실행 대화 상자도 문자열을 올바르게 구문 분석합니다. 상대적으로 낮은 수준의 명령 콘솔에서만 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 프로그래머는이 실수를하지 않을 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.