FileMap을 이용한 파일엑세스 모니터링

FileSystem 필터 드라이버를 작성해서, 파일의 Read/Write를 감시 차단하는 기능을 구현했다.
그런데 이상하게도 notepad text파일을 여는 경우에 대해서는 감시가 되지 않는다.

내용을 확인해 본 즉슨,
notepad
는 파일을 R/W할 때 ReadFile/WriteFile API를 사용하지 않고, 파일을 Create한 후,  CreateFileMapping()를 이용하여 파일의 내용을 메모리에 올린 후 작업하는 것으로 분석이 된다.

FileSystem 필터 드라이버에서 감지되는 내용은 notepad에서 해당 파일을 메모리에 mapping하기 위해 텍스트 파일을 Create(Open)하는 과정 뿐이다.

기존의 드라이버의 경우, NativeAPI NtCreateSection()을 후킹하여 처리되었던 부분인데,
64bit OS
까지 한 벌의 소스로 작성해야 하는지라 NtCreateSection을 후킹 하기에는 문제가 있어 보인다.

정말 파일 시스템 필터 드라이버만으로 불가능 한가???

웹 검색해봐도 딱히 나오는 정보도 없고, 사실 거의 포기할 뻔 했다.
Read
대상 파일이 Memory map되고 난 이후에는 Read동작을 모니터링 할 수 없으므로,
map
되는 시점을 로깅 시점으로 잡아야 한다.( 이건 안될거 같고 )
그냥 Read를 차단하면 파일 Create 자체를 막는 방식으로 돌려서 처리를 하던 중...


filemon
소스에서 아래의 코드를 발견하긴 했지만.
DriverObject->FastIoDispatch->AcquireFileForNtCreateSection
FastIoDispatch->AcquireFileForNtCreateSection
XP이상에서는 사용되지 않는 것으로 MSDN에 명시되어 있으며, windows 2000에서 테스트 해본 결과로는 filemap을 생성하더라도 호출되지 않는다.

하지만 다행히도 연관검색어로 찾아낸 함수가 하나 있었으니 FsRtlRegisterFileSystemFilterCallbacks() 함수를 사용하면 된다.


PreAcquireForSectionSynchronization
에 대한 Callback을 등록하여, Callback함수 호출 시 차단하거나 로깅 하면 FileMapping을 이용하는 I/O동작 또한 처리가 가능하다.

다만 FsRtlRegisterFileSystemFilterCallbacks() 함수는 XP 이상에서만 사용할 수 있다.

결국 windows 2000에서는 Read차단시 file create를 차단하는 방법으로 구현할 수 밖에 없었지만,
XP
이상에서는 정확히 처리 할 수 있다.

언제나 찾기전에는 도저히 검색되지 않던 정보들이, 답을 알고 나면 보이는 법....
WDK
FileSpy 샘플을 보면 콜백등록 소스가 포함되어 있다..
진즉 볼것을....

 

 

  1. 박진용 2014.08.13 11:48

    저에게 큰 도움이 되었습니다. 감사합니다. ^^

+ Recent posts