본문 바로가기

My Study/Reversing

커널모드에서 유저모드 디버깅

WinDbg를 통해 커널 디버깅이 가능한건 다들 알고 계실 것입니다.
하지만 커널 디버깅 상태에서 특정 프로세스를 어떻게 디버깅 할까요??
비록 유저모드 디버거로써 올디와 IDA라는 강력한 디버거들이 있지만 언젠간 WinDbg에서 커널 디버깅 도중 특정 프로세스 디버깅 할 일이 생길꺼 같아 공부를 했습니다.

먼저 WinDbg로 커널을 들어옵니다.

이제 우리는 대표적인 실험대상 윈도우 자제 게임을 대상으로 해보겠습니다. ( 핀볼 )
먼저 디버기를 실행 상태로 만들어 놓고 디버기에서 핀볼을 킵니다.

위와 같이 디버기에서 핀볼을 켰습니다. 이제 WinDbg에서 Ctrl + Break를 누릅니다.
그러면 커맨드 창이 활성화 될건데요. 거기서 !process 누릅니다.
!process : 디버기에서 실행 중이 었던 프로세스 정보를 보여준다.

실행 중이었던 프로세스를 보니 Idle입니다. 거의 저 프로세스로 나오더군요. 하지만 우리가 원하는 프로세스는 저 프로세스가 아닙니다. 바로 우리가 원하는 프로세스 즉, 핀볼로 프로세스 컨텍스트를 변경해야 합니다. 

이제 디버기에서 실행 중이었던 프로세스 목록을 봐보겠습니다. 명령어는 "!process 0 0" 입니다.

프로세스가 많지만 제가 생략 좀 했습니다 ;;
빨간색 네모 친 프로세스를 봐보니 핀볼이네요. Process주소는 81e62588입니다.
이제 저 프로세스 주소를 가지고 프로세스 컨텍스트를 맞춰주겠습니다.
".process  /i 81e62588"
라고 입력해 주시면 됩니다.

계속하려면 g쓰고 엔터. 그 프로세스가 동작하게 멈추게 됩니다.
이제 F5를 눌러 디버기를 실행시키고 핀볼을 동작해봅시다.

F5를 누르자마자 바로 멈췄습니다. 해당 프로세스가 동작을 하고 있었기 때문에 그렇네요;;
이제 해당 프로세스의 가상주소에 브포를 걸수 있습니다. 브포를 걸 주소는 이미 올디로 찾아놨습니다.

01012868  |.  FF15 3C130001 CALL DWORD PTR DS:[<&msvcrt.sprintf>]    ; \sprintf

이 부분으로 핀볼을 하다가 죽게되면 멈추는 부분입니다.
"bp 1012868"
위와 같이 해당 주소에 브포를 걸어줍니다.

브포 리스트를 보면 잘 걸려있습니다. 뒤에 함수 명까지 제대로 나오는 이유는 유저모드 모듈의 심볼을 웹심볼서버에서
가져오는데 핀볼의 심볼파일도 가져오더군요. 마소에서 게임 심볼도 전부 웹에 올려놨나봅니다.

다시 디버기를 활성화 시키고 게임을 하다가 죽게되면 WinDbg 커맨드 창이 활성화 되시는 것을 보실 수 있습니다.
해당 주소에서 멈춘걸 보실 수 있습니다. 이제 커널모드에서 유저모드 디버깅을 하시면 됩니다.

그래도 유저모드 디버깅만 할 때는 머니머니해도 올디와 IDA...

'My Study > Reversing' 카테고리의 다른 글

TLS Callback 안티 디버깅  (3) 2010.04.04
IDA v5.2 동 네트워크 대역에서 동시 사용  (0) 2010.03.13
Vmware를 사용한 커널 디버깅  (2) 2010.03.11
Segment Register  (0) 2010.03.10
Assembly 점프 문  (4) 2010.02.26