커널 모드 DLL (Export Driver)

드라이버를 개발하다 보면 아래와 같은 일이 가끔 생깁니다.
- 필요할 때만 호출해서 쓰고 싶다.
- 여러 드라이버에서 공유해서 사용하고 싶다.

유저모드라면 DLL Implicit loading을 사용하면됩니다. 까먹고 있다가 아주 오래 전에 export driver라는 걸 들어본적이 있어서 검색해보니 MSDN(Miscellaneous Driver Programming Techniques → Creating Export Drivers)에 잘 소개되어 있습니다. 그 때는 그냥 "아 드라이버로 DLL처럼 쓸 수 있게 하는 일종의 트릭이구나" 하고 넘어갔는데, 이게 실제로 필요해지니 느낌이 이상하네요 :) 아무튼 Kaspersky AV 드라이버를 추출해서 봤더니 실제로 얘네는 사용하더군요. Ahnlab도 솔루션 설치 경로에 가보면 커널모드 암호화 라이브러리 드라이버 파일이 있습니다. 아마 여러 드라이버에서 공유해서 사용하려고 만든 export driver겠죠. 

export driver의 특징입니다.
- DllInitialize(), DllUnload() 두 함수를 .def 파일에 PRIVATE export해야합니다.
- 일단은 드라이버 모습(sys)이기에 DriverEntry와 DriverUnload Routine이 있어야합니다.
- SCM을 사용하면 DriverEntry, Driver Unload Routine을 사용하고, 작업이 수동입니다.
- SCM을 사용하지 않으면 자동으로 아래와 같은 시나리오로 동작합니다.

export driver를 자동으로 사용하는 상황
1. a 드라이버가 로드되려고합니다.
2. os는 a를 로드하려면 c가 필요하다는 것을 알고 c를 로드합니다.
3. c를 로드하면서 DllInitialize 함수를 호출합니다.
4. c가 로드된 후에 a 드라이버를 로드합니다.
5. b 드라이버가 로드되려고합니다.
6. 이미 c가 로드되어 있어서 c 드라이버의 레퍼런스 카운트만 증가시킵니다.
7. b를 로드합니다.
8. a가 언로드합니다.
9. a가 언로드되서 c 드라이버의 레퍼런스 카운트를 감소시킵니다.
10. b가 언로드됩니다.
11. c 드라이버의 레퍼런스 카운트가 0이 되어서 DllUnload 함수를 호출합니다.
12. c 드라이버가 언로드됩니다.

그래서 결론은,
수동으로 로드 할 것인지, 자동으로 로드 할 것인지 선택하면 됩니다. 요새는 IDE가 너무 좋아져서 프로젝트 속성에서 export driver로 선택할 수 있고, 소스 추가에서 def 추가한 다음 유저모드 DLL처럼 작성해주시면 알아서 한번에 빌드가 됩니다.

댓글 없음:

댓글 쓰기

Microcurruption Addis Ababa

11 Microcurruption의 Addis Ababa다. 4482: 3f40 0a00 mov #0xa, r15 4486: b012 5045 call #0x4550 <putchar> 448a: 8193 0...