이전에 드라이버 통신 예제를 살펴봄
뭐 햄는지 기억안나면 이전글 보셈
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의 버퍼와 정보를 이용해서 해당 요청을 처리하면됨
끝
'날먹을 위한 몸부림 > Driver' 카테고리의 다른 글
사기꾼을 위한 햄날먹 드라이버 개발 - 6 (2) | 2023.02.06 |
---|---|
사기꾼을 위한 햄날먹 드라이버 개발 - 5 (0) | 2023.01.16 |
사기꾼을 위한 햄날먹 드라이버 개발 - 3 (0) | 2023.01.12 |
사기꾼을 위한 햄날먹 드라이버 개발 - 2 (0) | 2023.01.11 |
사기꾼을 위한 햄날먹 드라이버 개발 - 1 (4) | 2023.01.11 |