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

윈도우커널_#016_커널을 까보자... Kernel Driver Debugging 도전기 (1)

shovelman 2015. 6. 9. 23:28

 

 

 

 


 

 

안녕하십니까...

완전한 야매로 커널을 디버깅중인... 초짜 삽잡이입니다...

 

현재 저는 커널 드라이브 디버깅에 빠져있습니다...

뭔말인지 솔직히 확신이 안설때가 있긴하지만... 무식하게 나아가고 있습니다...

계속 나아가고 맨 밑까지 찍고,

다시 올라가서... 다시 맨 밑까지 찍고...

계속 하다보면 언젠가 Kernel의 고수가 되어있지 않겠습니까?

또 혹시 모르죠... 리버싱의 대가... 푸하하 죄송합니다...

아직 꿈만 꾸고 삽질만 하는 초짜입니다... 하지만 조금씩 실력은 늘지 않을까요?

하나님께 기도하며 Kernel 과의 싸움에서 승리해보이겠습니다! 

 

 

디버깅할 모듈에 break point를 걸고, Target PC에서 드라이버를 로드함으로

커널 드라이버를 분석해보겠습니다!

 

Driver 소스의 Entry Point 인 Driver Entry부터 시작됩니다.

 


 

KphDynamicDataInitialization() 함수를 통해 Window 버전 정보를 얻어 냅니다.

 

 

해당 함수를 보면

dwOSVersionInfoSize에 RTL_OSVERSIONINFOEXW의 사이즈 값을 넣네요...

 


 

RTL_OSVERSIONINFOEXW 에는 아래와 같은 변수들이 들어 있습니다.

MajorVersion 부터 BuildNumber에... ~_~ 뭘까요 계속 봅시다~

 


 

동적 데이터를 레지스트리로 부터 읽어야되는데,

processhacker 에서는 아래와 같은 함수로 대체를 한다고 합니다.

x86, x64 버전별로 아래와 같은 함수를 쓰네요...

저는 Win7 (x86)을 쓰고 있으니 한번 들어가 보겠습니다.

 


 

Target PC의 OS 버전에 맞도록 변수에 저장이 됩니다...

전 Major 버전은 6, Minor 버전은 1이 저장 됬습니다.

 



짜잔! 해당 값대로 OS를 찾아갔습니다.

 


 

KphGetSystemRoutineAddress() 함수는,

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

음... LsaFreeReturnBuffer, RtlMapGenericMask 함수의 주소를 가져오는데요...

흠.. 우선 계속 가보겠습니다..

 

 

위의 함수들을 저장한 변수들에 맞춰서

INIT_SCAN이라는 메크로 함수에 값을 넣어줍니다.

해당 메크로 함수에는 scan, bytes, length, address, scanLength, displacement

인자값들을 받는데요~ 

scan이라는 단어를 보니... 뭔가 OS 버전에 맞게 Scan을 하는 작업을 진행할 듯 합니다.

 

내용들을 살펴보도록 하겠습니다. 아래와 같이 되있습니다.



 

첫번째 인자로, 스캔 결과 값을 가지고 있는 구조체 변수의 주소값을 받고있습니다.

두번째, 세번째 인자... 선언된 곳을 찾아봤습니다. 근데.. 뭐지;;

 

 

주석을 살펴보니...

 

 "a lot of functions seem to share the first 16 bytes of the Windows 7 PsTerminateProcess,and a few even share the first 24 bytes."

 

흠... 많은 함수들은  Windows 7 PsTerminateProcess 의 첫 16 Byte만 공유를 하는 것처럼 보인다... 그리고 몇몇은 첫 24 Byte만 공유를 한다...

 

PsTerminateProcess 는 커널 모드 내부의 함수인데요... 해당 함수를 구글링하여 찾아보니...

중요 프로세스인지 체크하고,  thread를 가져와서 kill 하고, handle table을 깨끗하게 하는

아주 어마무시한 함수네요.. 덜덜...

 

감히 풋내기 주제에 왜 이 배열을 사용하고 저렇게 주석을 달았을지 추측을 해본다면...

함수의 첫 16Byte, 혹은 24Byte만을 공유하는 것을 봤을 때PsTerminateProcess () 가 프로세스 체크를 하고 thread를 검색하는 부분등 kill 하기 전까지의 값만 참조하고자 하는 ProcessHacker 개발자의 뜻 아닐까요?? 

 

아무튼... 계속 가봅시다.. 그 외 다른 인자값들을 받고요...

serchOffset2 도 비슷하게 진행하겠네요...

 

그리고 이 험난한 길을 뚫고 ...

 

 

나왔습니다! 얼마나 왔나 했더니 KphDynamicDataInitialization() 하나 봤군요... 허허...

 

갈길이 험난합니다. 하지만 쫄지 않고 나아가겠습니다!

이상 삽잡이였습니다!

 

 

[출처 및 참고자료]

 

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

 

 

[구글 키워드]

 

Window Driver

WinDbg

WinDbg Kernel Debugging

 

http://sapzape.tistory.com/26