삽이 부서질 때까지 삽질

mini filter driver 스터디 - 미니 필터 드라이버 생성 및 기본 개념 본문

driver

mini filter driver 스터디 - 미니 필터 드라이버 생성 및 기본 개념

xinfo 2017. 9. 24. 19:31

미니필터 드라이버 스터디용!!

공부용이니 틀리거나 모르는 부분은 덧글, 메일, 카톡으로 주세요~


카톡은 지인 한정이겠죠? ㅎ


환경입니다.

--host--

win10 x64

vs2015

sdk 1703

wdk 1703


virtualKD 3.0

git


python 3.x(선택 사항)

vcpkg (선택 사항)

 - boost 패키지

 - curl 패키지

 - sqlite3 패키지

 - jsoncpp 패키지

 - gtest 패키지


--guest--

win10 x64

virtualKD 3.0




미니 필터 드라이버 설치 파일 및 스터디 진행할 때 사용하는 모든 걸 올려 놓은 git 주소입니다.

https://github.com/xinfolab/mini-filter-driver-study


가져가실 땐 출처를 남겨주세요.



먼저 프로젝트 생성해보죠.



생성했으면 자신의 환경에 맞춰서 빌드를 해봅니다. 그러면 에러가 발생할거에요.

그 에러를 따라 들어가보면 .inf 파일이 열립니다




https://msdn.microsoft.com/en-us/windows/hardware/gg462963

이 링크를 따라가보면 필터 요구사항이라고 하는데 Altitudes 요청하는 법과 각종 Altitudes 드라이버들이 나옵니다.

Altitudes 란 미니 필터 드라이버에서 중요한 개념입니다. 


Altitudes 는 필터 매니저에서 실행되는 순서와 관련이 있는데요. Altitudes 가 높으면 높을 수록 먼저 실행되고, 낮으면 낮을 수록 늦게 실행이 됩니다. 

[출처 : MSDN]


자세한 정보는 아래 링크를 통하여 읽으시면 됩니다.

https://docs.microsoft.com/en-us/windows-hardware/drivers/ifs/filter-manager-concepts



계속 진행해보죠.

저희는 공부용이기 때문에 inf 파일의 세세한 부분 설정은 안하겠습니다.

원하시면 아래 링크를 통해서 배우시면 될거 같습니다.


미니 필터 드라이버 위한 inf 파일 생성하기 

https://docs.microsoft.com/en-us/windows-hardware/drivers/ifs/creating-an-inf-file-for-a-minifilter-driver


inf의 Class, Class GUIDs 정보

https://docs.microsoft.com/en-us/windows-hardware/drivers/ifs/file-system-filter-driver-classes-and-class-guids


Altitudes 라던가 클레스 이름이란가 신경 안쓰고 주석( ; ) 으로 처리 되어있는 것을 사용하죠.


이렇게 되어 있을 것을


이렇게 수정합니다.


    .inf 파일 수정

        ;Class = "_TODO_Change_Class_appropriately_"

        ;ClassGuid = {_TODO_Change_ClassGuid_appropriately_}

        https://docs.microsoft.com/en-us/windows-hardware/drivers/ifs/file-system-filter-driver-classes-and-class-guids

        부분 주석 또는 msdn 참고하여 class에 맞는 값으로 변경


        Class나 ClassGuid 를 개인적으로 만들어서 Altitude를 개인적으로 만들어도 됨. 단, 상업적으로는 고려해야함.

    

수정을 다 하셨으면 다시 한번 빌드해보시면 성공한 것을 볼 수 있습니다.



가끔...

ctrl + f5 를 눌러서 실행하시는 분들이 말하시길 

"실행 안되는데요??"

라고 하십니다

그건 당연한거죠!!

왜냐하면 결과물이 실행 파일이 아닌 sys 파일이기 때문입니다!!!



first 폴더에 있는 것을 자신의 환경에 맞춘 뒤 컴파일하고, vmware에서 control_frist.exe 를 실행시키면 됩니다.




마지막으로 미니 필터 드라이버에 디버거를 붙여보겠습니다.

!!! 주의사항

이때 HOST와 GUEST에 virtualKD 가 설치가 되어있어야 하며, HOST에 Windbg 설정까지 하셔야 합니다.


windbg에서 아래 아이콘을 눌러주면 guest가 멈추며 windbg에 입력을 할 수 있습니다.



windbg에 심볼을 넣어 줍니다.

사실 이 과정은 .symfix 라는 명령어로 해결할 수 있다고 하는데... 저는 환경설정에서 정확히 입력해주는 편입니다.

srv*C:\WebSymbols*http://msdl.microsoft.com/download/symbols; C:\mini-filter-driver-study


이때  C:\mini-filter-driver-study 는 자신의 미니 필터 드라이버 위치로 설정해야 합니다.


설정이 완료 되면

.reload

라고 명령어를 칩니다.

해당 명령어는 심볼을 로드하는 명령어입니다.




그리고 

bl

breakpoint list 약자입니다.

현재는 브레이크 포인트가 없기에 비어있지만,

bu filter_study!DriverEntry

라고 치시면 filter_study 라는 미니 필터 드라이버에 DriverEntry 함수가 실행되면 breakpoint를 걸어라 라는 명령어 입니다.

즉,

    bu [program_name]![funtion_name]

입니다.

정확히 따라오셨으면, control_first 를 실행하고 아무키를 입력하시면, windbg에 아래와 같은 화면을 보실 수 있을 겁니다.



후...

힘들다..................



2017-10-02 추가

추가적인 내용이 필요할거 같아서 내용을 수정할게요.



EXTERN_C_START

.

.

.

EXTERN_C_END

위 에있는 영역은 파일이 cpp로 컴파일되어도 해당 영역만큼은 c로 컴파일 하는 구간입니다. 이런 걸 name mangling 이라고 합니다.

간략히 소개하면 name mangling는 cpp와 c 했을 경우 object 링크할 때 symbol name을 생성하는 규칙이라고 설명할 수 있습니다.




이번엔 ALLOC_PRAGMA 영역입니다. #ifdef ~ #endif 로 묶여 있는데 이 영역에서 함수가 존재하는 메모리를 page_of_memory 나 non_page_of_memory 선택할 수 있도록 합니다. PAGE 라고 설정되면 page of memory out이 가능합니다.

page of memory      : paging out 할 수 있는 메모리

non page of memory  : 항상 memory에 상주해 있어야하는 메모리


이 두가지 추가하려고 했습니다.

Comments