날먹을 위한 몸부림/Driver

사기꾼을 위한 햄날먹 드라이버 개발 - 4

프로그래밍하는 지팡이 2023. 1. 14. 15:47

이전에 드라이버 통신 예제를 살펴봄

뭐 햄는지 기억안나면 이전글 보셈

 

https://boa9448.tistory.com/34

 

사기꾼을 위한 햄날먹 드라이버 개발 - 3

이번에는 커널 드라이버와 유저모드 프로그램이 통신하는 예제 뭐 했는지 기억안나면 앞에 글 보셈 빈 솔루션을 하나 만들고 프로젝트 2개를 추가한다 유저모드 프로그램으로 작성될 빈 프로젝

boa9448.tistory.com

 


드라이버와 유저모드 프로그램이 통신하려면 다음 작업들이 필요함

 

유저모드 요청에 대응할 루틴 등록 (IRP_MJ_*)

디바이스 생성(IoCreateDevice)

프로그램에 노출시킬 심볼릭링크 생성(IoCreateSymbolicLink)

 

 

유저모드와 드라이버와 통신하는 방법은 파일을 읽고 쓰는것과 매우 유사함

CreateFile로 드라이버의 핸들을 얻고

ReadFile, WriteFile로 드라이버의 데이터를 읽거나 쓸 수 있음 (DeviceIoControl는 다음에 함)

 

유저모드에서 파일 입출력 관련 함수들을 호출하면 드라이버에는 IRP가 전달되고

그와 관련된 디스패처가 호출됨

만약 사용자가 드라이버를 대상으로 CreateFile을 호출하게 되면

IRP_MJ_CREATE의 디스패처가 호출되며 IRP가 전달됨

 

만약 디스패처가 등록되지 않은 함수가 호출된다면 해당 함수의 호출은 실패함

등록되었더라도 지원하지 않음(STATUS_NOT_SUPPORTED)과 같은 IRP 상태 코드를 리턴하게 되면

해당 함수의 호출은 의도하지 않은 결과가 나올 수 있음

 

다음은 IRP 디스패처를 등록하는 코드임

먼저 모든 IRP Major Function들을 기본 핸들러로 등록한 뒤

필요한 기능들만 함수들로 따로 등록함

 

다음은 기본 핸들러함수 코드임

반환값이 STATUS_NOT_SUPPORTED인 것을 확인

 

 

드라이버의 IRP 주요 디스패처를 등록한것으로 끝이 아님

사용자에게 실제 드라이버에 대해서 노출해야지 정말 끝난것으로 볼 수 있음

사용자에게 기능을 노출 하려면 다음 2가지가 필요함

 

드라이버가 IO를 처리할 논리적, 물리적 장치를 나타내는 디바이스 (IoCreateDevice)

유저모드에서 드라이버의 핸들을 열 때 쓸 수 있는 심볼릭링크 (IoCreateSymbolicLink)

 

다음은 디바이스와 심볼릭 링크는 만드는 코드임

 

이 작업까지 마무리해야지 실제로 유저모드와 통신할 수 있는 준비가 모두 끝남

 

 

유저모드에서 ReadFile, WriteFile이 드라이버를 대상으로 호출되면 등록해둔 디스패처가 호출됨

해당 디스패처에서는 IRP의 버퍼와 정보를 이용해서 해당 요청을 처리하면됨