2009. 9. 14. 14:11

MAX_PATH가 넘어가는 Path 생성하기

:: CreateFile(...) API MSDN에 가보면, Naming a file이 있습니다.
(http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx)

MAX_PATH가 넘어가는 Path를 사용하기 위해서는,
\\?\ 프리픽스를 사용하라고 나옵니다.
(해당 글에서는, 보통의 윈도우 API들은 MAX_PATH의 제한이 있다고 나옵니다. 특히, Shell API 등은,
CchLength가 Parameter에 없는 관계로, MAX_PATH가 넘어가는 파일은 탐색기를 통한 탐색이 불가합니다.
따라서, 해당 파일을 삭제하기 위해서는 ::DeleteFile(\\?\\...)가 실행되어야 합니다.)

즉, C:\abc.txt -> \\?\C:\abc.txt
와 같이 사용하면, 32K 길이의 파일이름을 지정할 수 있습니다.

위 코드들을 통해 확인하면,
\\?\ 를 사용하지 않을때의 긴 Path(MAX_PATH 넘어서는...)인 경우에는,
3(=ERROR_PATH_NOT_FOUND)가 발생합니다. 물론, 긴 Path의 경로는 있는 상황에서 말입니다.

만약, 위 코드가 유니코드를 지원하지 않는 (즉, Proprocessor definitions에 _UNICODE/UNICODE 빠져있고, MBCS가 있는 경우)
에는, 206(=ERROR_FILENAME_EXCED_RANGE)이 발생합니다.

여하튼, MAX_PATH가 넘어가는 경로에 대한 지원을 해야 하는 경우는,
필히 \\?\ 가 사용되어야 합니다. 물론, 굉장히 귀찮겠죠.

상상훈련을 통해 아래 코드를 공유합니다. (슈도 코드이니... CTRL+C, CTRL+V 불가)
MAX_PATH가 넘어가는 Path를 지원하는 CreateFile(...) 코드 입니다.

실행시마다, CchLength를 구해야 하기 때문에, 속도에서 이득을 보지 못하죠.
대략 코드이니, 이해하는데에만 사용하세요.





만약,
악성코드들이 자신의 실행파일을 MAX_PATH보다 길게 저장을 해놓고,
레지스트리에 자신의 실행 경로를 \\?\C:\VERY_LONG_PATH\....\virus.exe
로 해놓는다면, 과연... AV 제품에서 해당 파일을 삭제할 수 있을까? 에 대해 결과가 궁금하네요.