본문 바로가기
코드/kernel

커널 파일 시스템 MiniFlter를 이용한 폴더 숨기기

by WeZZ 2017. 5. 15.


파일 시스템은 파일 시스템 드라이버(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 일때 IRPData->Iopb->Parameters.DirectoryControl.QueryDirectory.DirectoryBufferFILE_ID_BOTH_DIR_INFORMATION와  또는 PFILE_BOTH_ID_DIR_INFORMATION  와 매칭 시킬 수 있다.

해당 버퍼의 구조체는 싱글 링크드 리스트로 구조는 아래와 같다.


 



NextEntryOffset은 각 다음 노드의 오프셋을 가리키며, 맨 마지막 노드의 NextEntryOffset0이다.

 

해당 디렉토리 리스트 구조는 상위 디렉토리를 C:\A 라고 하고 ‘A’ 디렉토리 안에 또 A,B,C가 있다고 가정하면,

 

C:\A 디렉토리를 열거 시 A,B,C 라는 링크드 리스트 구조로 가져 오게 된다.

 

파일 & 디렉토리 숨김은 첫노드 ‘A’에서 다음 노드 ‘B’를 가리키고 있는 NextEntryOffset.’C’노드를 가리키게 변경 하는 NextEntryOffset 조작을 통해 ‘B’ 노드를 숨길 수 있다.