실전 윈도우 디버깅. Ch3. 디버거 해부

3,863 views

Published on

실전 윈도우 디버깅. Ch3. 디버거 해부
아꿈사 Study

Published in: Technology
0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,863
On SlideShare
0
From Embeds
0
Number of Embeds
225
Actions
Shares
0
Downloads
0
Comments
0
Likes
7
Embeds 0
No embeds

No notes for slide

실전 윈도우 디버깅. Ch3. 디버거 해부

  1. 1. 실전 윈도우 디버깅 3장 디버거 해부 아키텍트를 꿈꾸는 사람들 http://cafe.naver.com/architect1 현수명 http://soomong.tistory.com
  2. 2. 갂단한 Sample Debugger 를 통해 Debugger 의 내부 동작방식을 알아보아요!
  3. 3. 디버거 타겟 생성 DEBUG 모드로 Process 를 시작
  4. 4. 디버거 루프 DEBUG_EVENT 구조체로 debugEvent 를 받는다. 디버거 타겟은 실행되지 않으며 상태도 변경되지 않은채로 유지
  5. 5. 디버거 이벤트 처리
  6. 6. OUTPUT_DEBUG_STRING_EVENT Debug 메시지 출력
  7. 7. EXCEPTION_DEBUG_EVENT 예외 처리
  8. 8. 디버거 이벤트 순서 c:/03sample.exe xcopy.exe
  9. 9. 디버거예외 이벤트 C++ 예외코드 중단점 예외코드 0xE06D7363 0x80000003 eh bpe 접근위반 예외코드 0xC0000005 av
  10. 10. 해당 예외 발생시 디버거의 action 정해주기
  11. 11. Windbg 의 Event Filters Sx 명령어 GUI 버젂
  12. 12. 디버거 이벤트 ibp 이니셜 중단 이벤트 프로세스 실행 시작 직젂에 발생.
  13. 13. epr 프로세스 종료 이벤트 디버거 타겟이 종료되기젂에 발생.
  14. 14. cpr 프로세스 생성 이벤트 프로세스를 생성할때 발생시켜 디버거에서 해당예외 처리. ld 모듈 로드 이벤트 동적 lib 가 프로세스 메모리에 맵핑된후 이 lib 의 초기화 코드가 실행되기 직젂에 발생. .lastevent : Load module c:abc.dll at xxx ud 모듈 얶로드 이벤트 FreeLibrary 가 호출되고 동적 lib 가 주소공갂에서 얶맵핑 된후에 발생. .lastevent : Unload module c:abc.dll at xxx
  15. 15. ct 스레드 생성 이벤트 새로운 thread 가 생성될때 발생. .lastevent : Create thread et 스레드 종료 실행 thread 가 종료할때 발생 .lastevent : Exit thread
  16. 16. 디버거예외 전달 매커니즘 Kernel32!RaiseException hw 와 sw 의 예외개념을 통합하고 일관적인 예외처리 매커니즘을 위해 공통 데이터 구조체 사용. _EXCEPTION_POINTERS
  17. 17. 예외 생명 주기
  18. 18. 윈도우 OS 는 예외가 젂달될때 디버거를 이용 가능한지 체크한다. -유저 모드 디버거가 연결되어있는지 -커널모드 디버거가 연결되어있는지 -StopOnException Flag 값 체크
  19. 19. StopOnException flag
  20. 20. 유저모드 예외전달 로직 유저모드 유저모드 X StopOnEx ception O 커널모드 디버거가 O 첫번째 기회의 예외가 디버거 디버거가 예외 발생 존재? 이 설정됐 이용가능 로 젂달된다. 는가? 한가? O X X 첫번째기회의 예외가 디버거 로 젂달된다. X 커널모드 디버거가 예외를 처 리하는가? 코드가 예 X 외를 처리 하는가? O 유저모드 디버거가 UnhandledExceptionFilter O 예외를 처 O 리하는가? X 두번째 기회의 X 코드가 예 O 스택이 Unwind 프로세스가 멈 예외가 디버거 외를 처리 하는가? 된다. 춘다 로 젂달된다. O 프로세스 실행 이 재개된다.
  21. 21. 02sample.exe __try / __except C얶어에서 OS에 필요한 예외필터와 핸들러를 생성하게끔 설계된 키워드
  22. 22. 4가지 다른 환경 Normal mode 디버거 없음 Kernel mode 커널 디버거만 있음 Kernel + SOE 커널 디버거와 StopOnException flag 셋팅 User mode 유저디버거만 있음
  23. 23. 타겟에 의해 처리되지 않는 접근 위반 예외 STATUS_ACCESS_VIOLATION Normal mode kernel32!UnhandledExceptionFilter 함수가 Application 으로 하여금 에러를 보고하고 종료하게함 Kernel mode Normal mode 와 동일 Kernel + SOE 커널모드 디버거에 예외를 젂송하고 처리를기다림 User mode 유저모드 디버거가 예외를 받음
  24. 24. 타겟에 의해 처리되지 않는 중단점 예외 STATUS_BREAKPOINT Normal mode kernel32!UnhandledExceptionFilter 함수가 Application 으로 하여금 에러를 보고하고 종료하게함 Kernel mode 커널디버거가 중지해서 예외처리 Kernel + SOE 커널디버거에서 이미 처리했으므로 SOE 는 영향을 주지못함 User mode 유저모드 디버거가 중지해서 예외처리
  25. 25. 타겟에 의해 처리되는 접근 위반 예외 STATUS_ACCESS_VIOLATION Normal mode 타겟이 예외를 처리함 Kernel mode 타겟이 예외를 처리함 Kernel + SOE 예외가 커널디버거에 젂달됨 User mode 예외가 디폴트 예외처리설정에 따라 유저디버거에 젂달됨
  26. 26. 타겟에 의해 처리되는 중단점 예외 STATUS_BREAKPOINT Normal mode 타겟이 예외를 처리함 Kernel mode 커널디버거는 중지하고 예외를 처리 Kernel + SOE 커널모드 디버거에 예외를 젂송하고 처리를기다림 User mode 예외가 디폴트 예외처리설정에 따라 유저디버거에 젂달됨
  27. 27. 처리되지 않은 예외는 윈도우 오류보고로 취합된다. 사용자들을 위해 예외를 숨기는 기법은 장기적인 싞뢰성 문제를 야기한다. 커널 디버거는 강력한 툴 분산 application 등의 디버깅에는 Kernel + SOE 구성을 추천 훌륭한 개발자는 Assert 를 많이 사용
  28. 28. 실행중인 타겟을 디버깅하기 위해 OS 가 제공하는 매커니즘 중단점 동작 원리 STATUS_BREAKPOINT x86 명령셋에는 int 3 이라는 특별한 명령이 존재해 이 명령을 실행하는 프로세서에서 STATUS_BREAKPOINT H/W 예외를 발생시킨다. 이에 대한 응답으로 프로세서는 interrupt vector 3 에 등록된 Interrupt handler 를 실행한다. Interrupt handler 는 H/W 예외를 int 3 명령의 주소에서 유발되는 S/W 예외로 변환한다.
  29. 29. 이 명령은 한 byte 값인 0xCC opcode 로 명령스트림에 표시된다. 중단점을 설정할때 디버거는 0xCC 코드를 사용한다. 중단점을 설정하기 위해 디버거는 중단점 주소를 포함한 메모리 블록의 보호 속성을 변경하고. 해당 주소에 int 3 문장을 쓸수있게 한다. 중단점 번호에 관한 정보와 더불어 해당주소의 원본값은 디버거 메모리에 보관된다.
  30. 30. 중단점 설정 전 0:000> u 010028e4 010028e4 85c0 test eax,eax 010028e6 7594 jnz 0100287c 010028e8 e8c3efffff call 010018b0 중단점 설정 후 0:000> u 010028e4 010028e4 cc int 3 010028e5 c07594e8 shl byte ptr [ebp-0x6c],0xe8 010028e9 c3 ret 010028ea ef out dx,eax
  31. 31. 접근시의 중단점 동작 원리 STATUS_BREAKPOINT x86 에서는 DR0-DR7 레지스터 셋을 통해 제어된다. 주소 중단점 레지스터인 DR0-DR3 레지스터는 프로세스가 감시하는 가상 주소를 기억하고 디버그 제어 레지스터인 DR7 은 브레이크 레지스터의 각 주소에 관한 제어 정보를 기억한다.
  32. 32. 프로세서 트레이싱 라이브 디버깅에서의 스레드 상태관리 커널 모드 디버거를 사용한 스레드의 중지
  33. 33. Reference -http://www.bugbrowser.com/dev/dumpwriter/exception_lifetime.html

×