본 프로젝트는 윈도우 파일탐색기를 후킹해서 특정 폴더를 숨기는 것이 목적이다.

0. 방법론

내가 생각한 것은 단순했다. explorer.exe 는 유저모드에서 동작하는 프로그램이기에 WinAPI를 이용해서 디렉토리의 구조를 받아서 이를 파싱해 화면에 출력해줄 것은 분명하다. 이 때 디렉토리의 구조를 받는 함수를 후킹해서 내가 숨기고 싶은 폴더만 빼주면 될 것이라고 생각했고, 파일 관련 API 부터 찾아보았다.

1. 파일 관련 API 들

윈도우에서 제공해주는 파일 탐색 API 들중 파일을 표시해주는 것과 관련된 API 들을 추려보았다.

fileapi.h 헤더에 존재한다 .

(https://docs.microsoft.com/en-us/windows/win32/api/fileapi)

FindFirstFileA , FindFirstFileExA , FindFirstFileExW FindFirstFileW

파일 경로에 특정 파일들이 있는지 검색을 해준다. 와일드카드를 사용할 수 있기 때문에 모든 파일들을 검색하는 것도 가능하다.

Ex 가 붙은 함수들은 검색에 특정한 조건들을 더 줄 수 있고, A(ANSI) 는 로컬 인코딩, W(Wide) 는 Unicode 인코딩 버전이다. 기본적으로 A가 붙은 함수들은 안쓰고 W가 붙은 함수들을 사용한다.

위 함수들은 핸들을 반환해서 아래에서 소개할 Next 함수들이 이용할 수 있게 한다. 또한 함수 호출이 성공하면 두번째 인자인 lpFindFileData 에는 첫번째 파일이나, 디렉토리에 대한 정보가 담기게 된다.

FindNextFileA , FindNextFileW

위에서 호출한 함수들이 넘겨준 핸들을 이용해서 파일이나 디렉토리를 순차적으로 탐색해나간다.

WIN32_FIND_DATA 구조체

우리가 위의 함수들을 호출할 때 두번째 인자로 WIN32_FIND_DATA 구조체 포인터를 넘겨주게 되고 결과값들이 여기 저장된다. 더이상 찾을 파일이 없으면 NULL 을 반환한다.