삽질의 현장/- 윈도우 커널

윈도우커널_#019_RtlInitUnicodeString & InitializeObjectAttributes & ZwOpenKey & IoCreateDevice

shovelman 2015. 6. 9. 23:30





안녕하세요... 삽잡이입니다.

연초 계획은 잘들 짜셨는지... 저는 살좀 빼야될거 같습니다... 

주변 사람들에게는 누누히 말하지만, 몸무게가 단기간에 확 많이 쪘었는데요... 안빠집니다...

살빼야죠... 배가 너무 나와서... 

겨울에는 어느정도 커버를 치겠는데 여름만 생각하면 끔찍합니다... ㅋㅋㅋㅋㅋ


아무튼... 이번에는 kprocesshacker.sys 파일을 디버깅하다가...

무작정 달려드니, 좀 정리해보자 싶은 기초(?) 함수들을 포스팅하려 합니다~



RtlInitUnicodeString 함수에 대해서 알아보도록 하겠습니다....

MSDN에는 어떻게 설명이 되있냐면요...

 

"Initializes a counted Unicode string."

 

음... 유니코드 스트링을 초기화 하는 기능을 가지고있다 하네요..

어떻게 생겨먹었을까요... 요렇게 생겨먹었네요...

 

 

유니코드 스트링 구조체에 Soruce String을 저장합니다.


왜 굳이 유니코드 스트링으로 변환하여 사용할까요?

우선 유니코드란문자 인코딩 방법으로서

각 나라별 모든 문자를 단일 문자셋으로 인코딩될 수 있도록 해줍니다....

(Naver 지식 백과를 참조했습니다. 미안 Daum...)

그렇다면, 사용이유는...

윈도우 자체가 완전하게 유니코드를 인식하기 때문에 유니코드로 변환하겠죠... 허허...

 

아무튼... RtlInitUnicodeString 함수는 유니코드 스트링으로 초기화한다! 군요...

디버깅하는데 자주 보이더라구요 ㅎㅎㅎ

 

 

다음으로, InitializeObjectAttributes 함수에 대해서 알아보도록 하겠습니다...

이 또한 MSDN의 설명을 참조해보겠습니다.

 

"The InitializeObjectAttributes macro initializes the opaque 

OBJECT_ATTRIBUTES structure, which specifies the properties of an object handle 

to routines that open handles."

 

하... 설명이 윗놈보다 깁니다... 발번역 들어갑니다...

 

InitializeObjectAttribute

open handles 방법을 위한 object 핸들의 특성을 명세화 하여...

OBJECT_ATTRIBUTES 구조체로 초기화해주는 기능을 가지고 있습니다...

그렇다고 합니다... 네... 그렇다네요... 허허... 

쉽게 말해서, 인자로 받은 값을 OBJECT_ATTRIBUTES 구조로 초기화 한다는 뜻이군요!

 

요놈은 잘 생겼으려나~ 죄송합니다...

 

 

그렇다면...

 

유니코드 스트링 구조체 변수가

POBJECT_ATTRIBUTES 구조체 변수로 초기화 되는 사실을 알게됬습니다...


디버깅시 볼 수 있다면 보여드리도록 하겠습니다...

(더욱 자세한 내용을 보시고자 한다면 아래의 참고 자료를 참고해주세요 ^^)

 

 

세번째로, ZwOpenKey 함수에 대해서 알아보도록 하겠습니다.

 

 

자.. MSDN 설명!

 

"The ZwOpenKey routine opens an existing registry key."

 

존재하는 레지스트리의 키를 오픈한다라고 합니다.

 



참고로, 레지스트리는 시스템의 모든 설정 데이터를 모아두는데요...

컴퓨터와 관련된 주요 정보들이 저장되어 있습니다. 드라이버 로드해도 확인 할 수 있어요!

 

 

자... 마지막으로 IoCreateDevice 함수에 대해서 알아보도록 하겠습니다.

 

"The IoCreateDevice routine creates a device object for use by a driver."

 

드라이버를 사용하기 위한 Device Object 를 생성합니다.

 

요렇게 생겼습니당...

 



첫번째 인자로 DriverEntry 인자로 받은 DriverObject의 포인터를 받네요!

(드라이버 호출시 I/O Manager가 던져준다 했었죠 ㅋㅋㅋ)

두번째로 DEVICE_OBJECT 구조체 변수의 device extension에 할당된 크기를 받고 있군요..

다음으로, 

드라이버 이름을 받고...  DEVICE_OBJECT 구조체 안의 device type, characteristics

를 받습니다.

여섯번째 인자인 Exclusive는 보통 False로 설정한다고 합니다.

(True로 설정시 여러 모둘로부터 접근할 수 없다고 합니다.)

마지막으로 할당된 Device Object 구조체 변수를 받습니다.

 

IoCreateDevice가 사용된 실제 예제 소스의 일부입니다.

(해당 예제는 processhacker에서 가져왔습니다.)

 



이런식으로 사용합니다...


4,5 번째의 파라메터는 MSDN을 참조하여 자세하게 살펴보시길 바랍니다.

Type과 Characteristics에 대해 자세하게 나와있습니다.

 

자... 지금까지.. 간단하게

RtlInitUnicodeString, InitializeObjectAttributes, ZwOpenKey, IoCreateDevice

함수에 대해서 알아봤습니다!

 

 

하나하나 알아가는 재미가 있는것... 같습니다. 푸하하

읽으시는 여러분도 재미가 있으시도록... 눈살 찌푸리지 않으시도록...

뽜이아 하겠습니다!!!


이상 삽잡이였습니다!

 

 

 

[참고 자료]

http://skmagic.tistory.com/entry/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C%EC%99%80-%EB%A9%80%ED%8B%B0%EB%B0%94%EC%9D%B4%ED%8A%B8

<-- 유니코드 설명 자료

http://msdn.microsoft.com/ko-KR/windows/hardware/ <-- 나의 조력자 MSDN !

 

 

[구글 키워드]

Windows Driver

RtlInitUnicodeString

InitializeObjectAttributes

ZwOpenKey

IoCreateDevice

 

 

http://sapzape.tistory.com/30