본문 바로가기

My Study/Programming&Theory

전역적 필터 드라이버

 키보드 필터 드라이버를 만들면서 이 방법은 쓰지 않았지만 
하나의 드라이버가 생성한 여러 디바이스 스택들 위에 전부 필터 드라이버 생성한 디바이스 오브젝트를 넣는 방법입니다.

보통 특정 디바이스 스택 위에 디바이스 오브젝트를 끼워 넣을 때 사용하는 함수는 IoAttachDevice입니다.

한번 코드를 봐보겠습니다.

IoCreateDevice로 디바이스 생성 후 IoAttachDevice로 해당 디바이스 스택에 끼워넣는 것입니다.
이 때 IoAttachDevice함수 인자를 보시면 타겟 디바이스의 이름이 들어가게 됩니다.

그러므로 하나의 드라이버에서 여러개의 디바이스를 생성시켰다면 전역적 필터는 힘들 것입니다.
( 불가능 하다고 안 적은 이유는... 비록 저는 방법을 모르지만 분명 누군가는 할줄 알 것이기 때문입니다;; )

그래서 제가 사용한 함수는 IoAttachDeviceToDeviceStack 입니다.

해당 함수는 2개의 인자를 받습니다.
1. 특정 디바이스 스택에 포함시킬 디바이스 오브젝트
2. 타겟 디바이스 오브젝트

IoAttachDevice와 다른 점은 디바이스 오브젝트를 전달한다는 것입니다.
그러므로 DEVICE_OBJECT 구조체 멤버인 NextDevice, AttachDevice 인자를 잘 활용하면 전역적으로 필터가 가능한 것입니다.

제가 구현해본 코드를 보시겠습니다.

Get_DriverObject 함수는 인자로 전달된 디바이스를 생성시킨 드라이버 오브젝트 주소를 구해오는 함수입니다.
( 코드는 그냥 IoGetDeviceObjectPointer함수를 사용해 간단히 구현했습니다..; )
드라이버 오브젝트를 구해온 후 해당 드라이버가 생성한 디바이스가 있으면 안으로 들어옵니다.
그리고 제가 만든 디바이스를 드라이버가 만든 디바이스 스택 최상위에 넣습니다.

이 때 AttachDevice 필드를 쭉 따라서 디바이스 스택의 최상위 디바이스를 지정해주지 않은 이유는 IoAttachDeviceToDeviceStack 함수에서 자동으로 해당 디바이스가 속해있는 최상위 디바이스 위에 끼워주기 때문입니다.

그리고 나서 드라이버가 생성한 또 다른 디바이스가 있는지 확인을 한 후 있으면 해당 디바이스 스택에 또 끼워주는 것입니다.

간단하게 만들어본 키보드 필터 드라이버면서 전역적으로 후킹을 하는 모습을 봐보겠습니다. ( 영상 )
(Ctrl + 마우스 휠.. 로 영상 크기 조절해서 보세요. )

여러 필터 드라이버를 만들어보면서 써야할 때가 오겠죠??;; 킁...