본문 바로가기

reversing/Windows Driver

Minifilter - User Mode Communication

SMALL

1. Filter Communication Port Object


보안을 고려하고, 다중 통신 채널을 구성하기 위해서, 미니필터 통신 포트(minifilter communication port)라는 새로운 오브젝트가 소개 됨.

해당 오브젝트는 커널 <->유저 통신을 위해 사용된다. 커널 <-> 커널 통신은 현재는 지원되지 않고 있다. 

하나의 포트는 보안 설명자(sd)가 있는 이름 있는 NT 오브젝트이다.

필터 매니저는 새로운 오브젝트 타입인 FilterConnectionPort를 위와 같은 통신을 가능하기 위해서 만든다.

필터 매니저는 이 새로운 오브젝트 타입을 만드는데, 어떤 미니필터가 로드 되기 전인, 드라이버의 시작 초기 루틴이 진행되는 동안에 만들어 진다.  

커널 모드의 드라이버만 미니필터 통신 포트를 생성할 수 있음. 아래의 API 함수를 이용해서


1
2
3
4
5
6
7
8
9
10
11
12
NTSTATUS
FltCreateCommunicationPort(
    IN PFLT_FILTER Filter, //
    OUT PHANDLE PortHandle,//
    IN POBJECT_ATTRIBUTES ObjectAttributes,//
    IN PVOID ServerPortCookie OPTIONAL,//
    IN PFLT_CONNECT_NOTIFY ConnectNotifyCallback,//
    IN PFLT_DISCONNECT_NOTIFY DisconnectNotifyCallback,//
    IN PFLT_MESSAGE_NOTIFY MessageNotifyCallback,//
    IN ULONG MaxConnections//
    );
 
cs


위의 함수에서 Filter 인자의 경우 통신 포트 오브젝트를 생성하는 미니 필터 오브젝트의 핸들 값이다. 해당 FltCreateCommunicationPort 함수에

의해서 성공적으로 호출이 되어서 생성된 핸들은 PortHandle값다.

다른 NT 오브젝트와 마찬 가지로 ObjectAttributes 인자의 경우 생성될 통신 포트 오브젝트이름, 속성 플래그, 보안 설명자를 초기화하는 

OBJECT_ATTRIBUTES 구조체 임.

해당 OBJECT_ATTRIBUTES 구조체를 초기화할 때 고려해야 할 점은 속성에서 OBJ_KERNEL_HANDLE 속성을 반드시 명시해주어야 함.

해당 통신 포트 오브젝트는 오직 커널 오브젝트로만 생성되기 때문이다.

ServerPortCookie는 미니 필터가 포트와 관계가 있는 context 이다. 해당 context는 필터 매니저 한테는 불투명한[알수없는] context이다.

모든 포트와 미니 필터간의 연결/비연결에 관한 알림은 해당 cookie를 통해서 전달 될 것이다. 

이 cookie는 port 배열[많은 포트]을 만드는 미니 필터들에게 유용하다. 그 이유는 cookie는 포트 배열 중 특정한 포트의 알림에 관한 루틴 없이도

어떤 포트에서접근했는지 식별할 수 있기 때문이다.

호출자(FltCreateCommunicationPort)는 통신 포트가 생성 될 때 세 가지 콜백을 등록합니다. 

ConnectNotifyCallback() 루틴

해당 루틴은 유저 모드 프로세스가 통신을 위해서 포트에 접근[open]할 때 호출된다. 미니 필터는 연결 요청이 실패했을때 사용할 옵션을 가질수 있다.

해당 실패를 알리는 루틴은 하나의 핸들을 전달 받게 되는데 그 핸들은 미니 필터가 통신에 사용될 연결에서 사용하는 핸들값이다.

각 연결 마다 고유한 핸들을 가지고 있다. 서버 포트와 연관된 ServerPortCookie도 전달된다. 

ConnectionCookie 인자의 경우 미니 필터에 의해서 값이 설정되는데 해당 값은 유저-커널간에 메시지가 전달 될때의 context와 연결이 해체 될 때의 context 값이 채워진다.


DisconnectNotifyCallback() 루틴

유저 모드에 의해서 포트가 닫힐때 호출되어 진다.


MessageNotifyCallback() 루틴

메시지가 전달받아 질 때 호출되어 진다.


MaxConnections 해당 통신 포트에서 최대로 가능한 연결 수를 지정한다. 기본 값은 없고 0보다 큰 값으로 구성되어야 한다.

name space의 루트에서 오브젝트의 이름이 생성된다고 보장되어 지지 않는다. --> 무슨 말인지.. 

필터 관리자가 내부적으로 \ FileSystem \ Filters 오브젝트 디렉토리 아래에 맵핑 할 수 있다. 

매핑이 발생하면, 유저모드와 미니 필터한테 공개된다. 이름에 의해서 통신 포트가 참조되어 질때, 양쪽의 구성요소들은 같은 이름을 사용한다.

스캐너 미니필터가 어떻게 동작하는지 예시를 보여준다.

위에 FLT_PORT_CONNECT 와 FLT_PORT_ALL_ACCESS 접근 타입은 InitializeObjectAttributes ()를 통해 개체에 대한 보안 설명자를

구성 할 때 API의 호출자가 사용자에게 부여 할 수있는 액세스 유형입니다.

_CONNECT는 사용자 모드를 포트에 연결하고 메시지를 보내고받을 수있게하는 데 충분합니다.

미니 필터가 포트를 생성하면 들어오는 연결을 포트에서 수신하기 시작합니다. ZwClose ()를 호출하여 포트 핸들을 닫을 때까지 계속 듣습니다.


2. Connecting to Communication Port from User Mode

기존의 legacy model과 마찬가지로 minifilter 통신 모델또한 비동기 적이다. 커널 종단 점에서 통신 포트를 생선한다.

유저모드 종단 점에서 해당 포트에 연결 한다.

유저 모드 앱에서 해당 포트에 접근할 수 있는 API 함수가 있다.

연결이 성립되어 질 때, ConnectNotify루틴은 미니 필터에게 연결 생성 요청이 들어왔다는 것을알린다.

또 한, 미니 필터의 포트 핸들은 연결을 통한 메시지 송신에 사용된다.

usermode 에서 연결할 때 사용하는 함수의 프로토 타입이다.


1
2
3
4
5
6
7
8
9
HRESULT
FilterConnectCommunicationPort(
    IN LPWSTR lpPortName,
    IN DWORD dwOptions,
    IN LPVOID lpContext,
    IN WORD wSizeOfContext,
    IN LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    OUT HANDLE *hPort
);
cs


Remarks

연결 함수 FilterConnectCommunicationPort에 의해서 서버 포트에 연결이 되면 어플리케이션은 미니 필터와 통신을 위해서 연결 완료된 핸들을

사용한다. 그 후, FilterSendMessage 함수, FilterGetMessage 함수, FilterReplyMessage 함수를 통해서 송/수신한다.







출처 : https://msdn.microsoft.com/en-us/library/windows/hardware/ff540460(v=vs.85).aspx

   Filter Driver Development Guide





LIST