파일 시스템은 파일 시스템 드라이버(NTFS, FAT32, Ect)에 의해 기록되어 관리되다가 삭제가 되는
그 순간까지 데이터의 관리를 도와줍니다.
파일 시스템 Miniflter는 기존의 파일 시스템 필터 드라이버의 여러 문제점을 보안하여 개발되었습니다.
이 MiniFlter는 기존의 파일 시스템 필터 드라이버의 모든 동작을 구현 할 수 있고 파일에 대한
I/O를 콜백 방식으로 받아 처리할 수 있다.
FLT_OPERATION_REGISTRATION에 IRP_MJ_DIRECTORY_CONTROL를 등록해주면 기존의 파일 시스템 필터 드라이버와 동일하게
IRP_MJ_DIRECTORY_CONTROL에 대한 정보를 받을 수 있다.
IRP_MJ_DIRECTORY_CONTROL 의 IRP는 디렉토리 ClassId가 존재하는데 파일을 숨기기 위해서는 아래와 같은 ID를 사용하게 된다.
해당 ID는 운영체제에 따라 사용되며, Data->Iopb->Parameters.DirectoryControl.QueryDirectory.FileInformationClass에서 받을 수 있다.
FileIdBothDirectoryInfomation vista ~
FileBothDirectoryInformation xp
해당 ClassId 일때 IRP의 Data->Iopb->Parameters.DirectoryControl.QueryDirectory.DirectoryBuffer는 FILE_ID_BOTH_DIR_INFORMATION와 또는 PFILE_BOTH_ID_DIR_INFORMATION 와 매칭 시킬 수 있다.
해당 버퍼의 구조체는 싱글 링크드 리스트로 구조는 아래와 같다.
NextEntryOffset은 각 다음 노드의 오프셋을 가리키며, 맨 마지막 노드의 NextEntryOffset은 0이다.
해당 디렉토리 리스트 구조는 상위 디렉토리를 C:\A 라고 하고 ‘A’ 디렉토리 안에 또 A,B,C가 있다고 가정하면,
C:\A 디렉토리를 열거 시 A,B,C 라는 링크드 리스트 구조로 가져 오게 된다.
파일 & 디렉토리 숨김은 첫노드 ‘A’에서 다음 노드 ‘B’를 가리키고 있는 NextEntryOffset을 .’C’노드를 가리키게 변경 하는 NextEntryOffset 조작을 통해 ‘B’ 노드를 숨길 수 있다.