여기서 설명할 미니필터 드라이버 무력화는 현재 상용제품들에서 사용하고 있는 미니필터를 대상으로 하는 것이 아닌 제가 만든 샘플 미니필터 드라이버를 대상으로 테스트를 해보았습니다. 그러므로 상용 제품들을 대상으로 테스트를 해볼 시에는 안될 수도 있습니다.
먼저 미니필터 드라이버란 기존에 존재하던 레가시 파일 시스템 필터 드라이버와 의미는 같지만 Windows의 필터 관리자를 통해 복잡한 I/O 를 관리하지 않고도 파일 시스템과 파일 시스템 필터 드라이버를 개발 할 수 있는 프레임워크를 사용한 필터 드라이버를 말합니다.
기존에 레가시 필터 드라이버는 각 볼륨 디바이스 스택에 어테치할 디바이스를 만들어주고 이를 IoAttachDeviceToDeviceStack 와 같은 함수를 사용해 어테치를 합니다. 그리고 끝나는 것이 아닌 각각의 IRP_MJ_Xxx 의 디스패치 루틴들을 각각 등록해주고 상황에 맞게 처리를 해주어야하며 Fast I/O Dispatch 루틴 또한 등록해 처리를 해주어야합니다. 아주 간단한 Create 하는 파일 명을 출력하는 예제만 만들더라도 수천줄에 달하는 코드를 작성해야되지요.
하지만 미니필터 드라이버를 사용하면 이러한 간단한 예제는 수백줄로 딱 줄어버리게 됩니다. 디바이스를 만들어줄 필요도 없고 어테치할 코드도 필요없고 단순히 FltRegisterFilter, FltStartFiltering 와 같은 필터 관리자가 제공해주는 API를 사용해 간단히 구현할 수 있습니다. 비록 레가시 필터 드라이버에 비하면 각 기능들을 세세하게 컨트롤 하긴 힘들지만 왠만한 기능은 다 해결되니 너무 걱정 안해도 됩니다. 안티 바이러스 제품들을 보면 파일 시스템 필터 드라이버를 사용하는데 대부분 미니필터 드라이버를 사용합니다. 또한 저같은 드라이버 초보 개발자에겐 미니필터를 사용하는 것이 더욱 안정적인 드라이버를 만들 수 있을 것 같습니다. BSOD를 100번 볼 것 10번만 볼 수 있겠네요 ㅎ_ㅎ
하지만!! 이러한 필터 드라이버들은 강력한 기능을 제공하지만 디바이스 스택에서 각 디바이스들과 연결고리가 약해 가위로 싹뚝 자르면 그냥 무력화됩니다.( 다른 방어 기법을 사용하지 않았다는 전제하에.. )
이는 Windows 7 에서 레가시 필터 드라이버를 설치하였을 때의 디바이스 스택 모습입니다. 위 그림처럼 가위로 표시된 부분을 싹뚝 잘라보죠.
FltMgr 의 DEVICE_OBJECT 의 AttachedDevice 부분을 0으로 싹 채워주면됩니다.
이 부분을 말이죠. 이 방법은 필터 드라이버 무력화 방법을 치시면 전형적으로 나오는 방법입니다. 악성코드에서 이런 방법을 사용했다고 하네요.
그러면 미니필터 드라이버는?? 레가시 필터 드라이버와 약간 필터의 원리는 다르지만 결국 위와 같은 방법으로 똑같이 무력화가 됩니다. ( 제 샘플 미니필터 드라이버에만 테스트 해보았음 )
( 이거 SWF 어떻게.. ㅠ ㅠ.. 우클릭방지 해제하고 확대에서 실행을 해야될 것 같은데.. 너무 불편하네요. 깔끔하게 올리는 방법좀 알려주세요 ㅠ )
아무리 미니필터 드라이버여도 각 볼륨에 어테치되어 작동하는 것은 변함없으므로 분명 무언가 어테치가 될 건데
미니필터 드라이버는 FltMgr 관리하게 요청이 처리되게 됩니다. 고로 FltMgr만 딱 잘라버린 것이지요.
귀찮아서 코드까진 짜진 않았습니다. Ntfs 디바이스 핸들 얻고 오브젝트 주소 얻은 다음 AttachedDevice 부분만 0으로 수정해주는 드라이버를 만드면 끝이니까요..
그리고 이 방법 말고도 FltMgr의 FLTP_FRAME 구조체를 뒤져서 원하는 미니필터를 찾고 FLT_FILTER 구조체 내부를 조져주면 다양한 방법으로 무력화가 가능합니다. 미니필터 드라이버의 특정 IRP의 콜백 루틴을 후킹할 수도 있습니다. :D
이제 이걸 막아야하는 입장에선?! 몇 가지가 떠오르는데 천천히 적용을 시켜봐야 할 것 같습니다.
'My Study > Programming&Theory' 카테고리의 다른 글
FltCancelFileOpen 궁금증 (4) | 2012.12.20 |
---|---|
Red-Black Tree - 2 (0) | 2012.12.19 |
Red-Black Tree - 1 (0) | 2012.12.10 |
GetFileTime 신뢰도 (2) | 2012.12.05 |
윈도우 커널 프로세스 당 스택 크기 (9) | 2012.12.04 |