본문 바로가기
카테고리 없음

[ROOTKIT #4] 디바이스 생성

by dladbru 2014. 6. 22.

유저 모드와 커널 모드 사이에 의사소통을 하려면 드라이버는 디바이스를

생성해야 합니다. 디바이스를 생성할때 IoCreateDevice 함수를 사용하는데

인자중에 UNICODE_STRING 구조체를 요구합니다. 이 구조체를 만드는데는

RtlInitUnicodeString 함수가 사용되며 인자로 디바이스 이름을 Unicode String 형태로

전달해야 합니다.







[ 코드 해석 ]


5   디바이스 이름을 MyDevice 로 정하고 앞에 붙은 L 은 Unicode String 을 의미

6   IoCreateDevice 함수가 생성해주는 디바이스 객체를 담을 변수

13  NTSTATUS 타입의 ntStatus 변수 선언

14  UNICODE_STRING 타입의 deviceNameUnicodeString 변수 선언

16~17  RtlInitUnicodeString 함수를 호출하여 UNICODE_STRING 구조체를 만듭니다.

19  IoCreateDevice 함수를 호출하여 디바이스 객체를 생성합니다.

 

     MSDN 을 참조해보면;

 

     NTSTATUS IoCreateDevice( IN PDRIVER_OBJECT  DriverObject,
                                             IN ULONG  DeviceExtensionSize,
                                             IN PUNICODE_STRING  DeviceName  OPTIONAL,
                                             IN DEVICE_TYPE  DeviceType,
                                             IN ULONG  DeviceCharacteristics,
                                             IN BOOLEAN  Exclusive,
                                             OUT PDEVICE_OBJECT  *DeviceObject  );

 

     총 7 개의 인자가 있고 중요한 것들만 살펴보면;

 

19  myDriver   <- 드라이버 객체

21  &deviceNameUnicodeString   <- 디바이스 이름을 갖고 있는 UNICODE_STRING 구조체

22  FILE_DEVICE_UNKNOWN   <- 디바이스 타잎

24  TRUE   <- 디바이스 핸들을 하나만 오픈

25  &pMyDevice   <- 생성된 디바이스 객체

27~30  디바이스 생성이 실패한 경우 디버깅메시지를 출력합니다.

          NT_SUCCESS 함수는 ntStatus 값이 성공인 경우 참

34  STATUS_SUCCESS 대신 ntStatus 변수명 사용

반응형

댓글