[지난 이야기]
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
'삽질의 현장 > - 윈도우 커널' 카테고리의 다른 글
윈도우커널_#019_RtlInitUnicodeString & InitializeObjectAttributes & ZwOpenKey & IoCreateDevice (0) | 2015.06.09 |
---|---|
윈도우커널_#018_Driver 까본다는 사람이... Driver 개발의 기본 DriverEntry도 몰라? (0) | 2015.06.09 |
윈도우커널_#016_커널을 까보자... Kernel Driver Debugging 도전기 (1) (0) | 2015.06.09 |
윈도우커널_#015_끝까지 물고늘어진다! 윈도우 커널 디버깅 끝판왕!!! (0) | 2015.06.09 |
윈도우커널_#014_에라 모르겠다! WinDbg로 커널 드라이버를 씹어먹자! (0) | 2015.06.09 |