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

윈도우커널_#017_커널을 까볼자! Kernel Driver Debugging 도전기 (2)

shovelman 2015. 6. 9. 23:29

 

 

 

[지난 이야기]

 

 

016. 커널을 까보자... Kernel Driver Debugging 도전기 (1) : http://sapzape.tistory.com/26

 

 

 

 


 

안녕하십니까.

무식한데 무작정 달려들어 임무를 반드시 수행하고자 하기에 

뵈는게 없는 삽잡이입니다.

 

우선, 들어가기 앞서서...  

 

 

* 저와 같이 삽질중이신 초짜 여러분! 함수명 중에서,

 

Open은 '어떠한 Object에 엑세스를 할 수 있는 권한을 얻어온다'

Initialize는 'Object를 생성하기 전에, 미리 수행해야 하는 작업이다'

 

라고 이해하시고 디버깅에 임해보세요!

물론 여러분의 친구 MSDN과 구글링도 함께 해서요! 

열심히 검색하다가 좋은 답변이 하나 있길래 저도 이 답변을 참조해서

더욱 달려봐야겠습니다!

 

 

 

그럼 이제 시작해봅시다. ㅎㅎ

지난시간에 이어서... 저 아랫놈! KphDynamicImport() 부터 까보도록 하겠습니다!

자... 들어가봅시다!

 


 

...?...  쫄지 마십쇼! 별거 없습니다! 여호수아와 갈렙 같이 담대하게 나아가라!

지금  저한테 하는말입니다! 푸하하.. 혼자놀기... 죄송합니다...

 

KphDynamicImport 는 동적으로 routine을 import 합니다.

Window 8보다 크면, KphGetSystemRoutineAddress를 호출하여 변수에 집어넣네요...

 

ExfUnblockPushLock... PushLock을 잠금 해제하는 것 같은데...

 

 

* 안에 있는 함수들은 뭐이리 자료가 없을까요... 물론 제가 못찾는 거겠죠... 허허...

뭐... 한번 보고 말 것도 아니고...

여러번 디버깅을 진행해보며 완전히 제것으로 만들기를 시도할 것이니

계속해서 알아보도록 하겠습니다...

 

 

KphGetSystemRoutineAddress() 함수는,

NTOS, HAL 에서 주소를 검색해서 가져오는 함수입니다. 아래 함수의 주소를 받아옵니다.

 


 

자... 그다음 계속 해서 진행하겠습니다. KphDynamicImport를 빠져나오고,

KphpReadDriverParameters가 나옵니다.

들어가볼까요?

함수명 그대로 드라이버 변수를 읽어옵니다.

RegistryPath 을 Open 하는데요,

 


 

RtlInitUnicodeString() 음... count 된 유니코드 문자열을 초기화 합니다.

첫번째 인자값으로, count 된 유니코드 문자열을 초기화할 버퍼를 써줬습니다.

 

UNICODE_STRING 구조체로 선언한 parameterKeyName 변수도 초기화 해주네요.

parameterKeyName의 길이와 최대 길이는 아래와 같고요

parameterKeyName.Buffer 는 ExAllocatePoolWithTag 함수를 썼습니다.

해당 함수는.. 메모리를 할당 해주는 함수입니다~

 

 

그리고 memcpy() 메모리 영역을 복사하네요!

parametersKeyName.Buffer 메모리에 RegistryPath->Buffer 메모리를 복사하고...

음... 두번째는... 뭘까요... 흠... 이부분은 좀 생각좀 해봐야겠습니다... 
초짜인 저에게 시간을~~

 


 

다음으로~ InitializeObjectAttributes() 함수입니다.

objectAttributes 변수의 타입 구조(OBJECT_ATTRIBUTES) 로 초기화 합니다.

 

 

 

그리고 ZwOpenKey() 함수의 return 값을 status에 넣네요...

해당 함수는 존재하는 레지스트리 키 값을 오픈합니다.  

 


 

다음으로 중요합니다!

ExFreePoolWithTag() 함수를 통해서 할당한 메모리를 해제해줘야됩니다!

꼭 입니다! 자칫하다 난리납니당~

 


자... 이제 초기화 하고 키값 열고 이것 저것 했으니

내용을 읽어보도록 하겠습니다...

 

KphParameters라는 구조체 변수안에

KphpReadIntegerParameter() 함수의 리턴값을 저장합니다.

 

각각 유니코드 문자열을 초기화 해주고,

KphpParameters 안의 SecurityLevel과 DisableDynamicProcedureScan 에 

kphReadIntegerParameter()함수 리턴값을 저장합니다. 

 

 다음으로 KphReadDynamicDataParameters() 함수를 통해

동적 데이터 변수를 읽어냅니다.

 


 

자...  오늘은 드라이버를 읽어와서 읽어내는(?) 과정까지 살펴봤습니다.

말이 이상하군요... 허허...

아무튼 kphReadIntegerParameter(), KphReadDynamicDataParameters()

이 부분도 좀 까봐야할것 같습니다.

 

후훗... 재미있네요...

아직 부족함이 많이 보이지만... 끝까지 판다.. 미친삽 삽잡이를 보여드리도록 하겠습니다...

헛된곳 파지 않도록 기도좀 해주세요... 푸하하...

 

그럼 다음시간에 더욱 더 파보도록 하겠습니다!

이상 삽잡이였습니다!

 

 

 

[출처 및 참고자료]

 

http://msdn.microsoft.com/ko-KR/ <-- 나에게 도움을 주면서... 한편으론 영어의 한계를 깨우쳐주는... 곳...

http://cafe.naver.com/malzero/93235 <-- 드라이버 읽는 방법을 쉽게 설명해준...

 

 

[구글 키워드]

 

Window Driver

WinDbg

WinDbg Kernel Debugging

 

 

http://sapzape.tistory.com/27