20. cpr 프로세스 생성 이벤트
프로세스를 생성할때 발생시켜
디버거에서 해당예외 처리.
ld 모듈 로드 이벤트
동적 lib 가 프로세스 메모리에 맵핑된후
이 lib 의 초기화 코드가 실행되기 직젂에 발생.
.lastevent : Load module c:abc.dll at xxx
ud 모듈 얶로드 이벤트
FreeLibrary 가 호출되고 동적 lib 가
주소공갂에서 얶맵핑 된후에 발생.
.lastevent : Unload module c:abc.dll at xxx
21. ct 스레드 생성 이벤트
새로운 thread 가 생성될때 발생.
.lastevent : Create thread
et 스레드 종료
실행 thread 가 종료할때 발생
.lastevent : Exit thread
22. 디버거예외 전달 매커니즘
Kernel32!RaiseException
hw 와 sw 의 예외개념을 통합하고
일관적인 예외처리 매커니즘을 위해
공통 데이터 구조체 사용.
_EXCEPTION_POINTERS
29. 유저모드 예외전달 로직
유저모드 유저모드 X StopOnEx
ception
O 커널모드
디버거가
O 첫번째 기회의
예외가 디버거
디버거가
예외 발생 존재?
이 설정됐 이용가능
로 젂달된다.
는가? 한가?
O
X X
첫번째기회의
예외가 디버거
로 젂달된다. X 커널모드
디버거가
예외를 처
리하는가?
코드가 예 X
외를 처리
하는가?
O
유저모드
디버거가
UnhandledExceptionFilter
O 예외를 처
O
리하는가?
X
두번째 기회의 X 코드가 예 O 스택이 Unwind 프로세스가 멈
예외가 디버거 외를 처리
하는가?
된다. 춘다
로 젂달된다.
O
프로세스 실행
이 재개된다.
31. 4가지 다른 환경
Normal mode
디버거 없음
Kernel mode
커널 디버거만 있음
Kernel + SOE
커널 디버거와 StopOnException flag 셋팅
User mode
유저디버거만 있음
32. 타겟에 의해 처리되지 않는 접근 위반 예외
STATUS_ACCESS_VIOLATION
Normal mode
kernel32!UnhandledExceptionFilter 함수가
Application 으로 하여금 에러를 보고하고 종료하게함
Kernel mode
Normal mode 와 동일
Kernel + SOE
커널모드 디버거에 예외를 젂송하고 처리를기다림
User mode
유저모드 디버거가 예외를 받음
33. 타겟에 의해 처리되지 않는 중단점 예외
STATUS_BREAKPOINT
Normal mode
kernel32!UnhandledExceptionFilter 함수가
Application 으로 하여금 에러를 보고하고 종료하게함
Kernel mode
커널디버거가 중지해서 예외처리
Kernel + SOE
커널디버거에서 이미 처리했으므로 SOE 는 영향을 주지못함
User mode
유저모드 디버거가 중지해서 예외처리
34. 타겟에 의해 처리되는 접근 위반 예외
STATUS_ACCESS_VIOLATION
Normal mode
타겟이 예외를 처리함
Kernel mode
타겟이 예외를 처리함
Kernel + SOE
예외가 커널디버거에 젂달됨
User mode
예외가 디폴트 예외처리설정에 따라
유저디버거에 젂달됨
35. 타겟에 의해 처리되는 중단점 예외
STATUS_BREAKPOINT
Normal mode
타겟이 예외를 처리함
Kernel mode
커널디버거는 중지하고 예외를 처리
Kernel + SOE
커널모드 디버거에 예외를 젂송하고 처리를기다림
User mode
예외가 디폴트 예외처리설정에 따라
유저디버거에 젂달됨
36. 처리되지 않은 예외는
윈도우 오류보고로 취합된다.
사용자들을 위해 예외를 숨기는 기법은
장기적인 싞뢰성 문제를 야기한다.
커널 디버거는
강력한 툴
분산 application 등의 디버깅에는
Kernel + SOE 구성을 추천
훌륭한 개발자는
Assert 를 많이 사용
37. 실행중인 타겟을 디버깅하기 위해
OS 가 제공하는 매커니즘
중단점 동작 원리
STATUS_BREAKPOINT
x86 명령셋에는 int 3 이라는 특별한 명령이 존재해
이 명령을 실행하는 프로세서에서
STATUS_BREAKPOINT H/W 예외를 발생시킨다.
이에 대한 응답으로 프로세서는 interrupt vector 3 에 등록된
Interrupt handler 를 실행한다.
Interrupt handler 는 H/W 예외를 int 3 명령의 주소에서
유발되는 S/W 예외로 변환한다.
38. 이 명령은 한 byte 값인 0xCC opcode 로 명령스트림에 표시된다.
중단점을 설정할때 디버거는 0xCC 코드를 사용한다.
중단점을 설정하기 위해 디버거는 중단점 주소를 포함한
메모리 블록의 보호 속성을 변경하고.
해당 주소에 int 3 문장을 쓸수있게 한다.
중단점 번호에 관한 정보와 더불어 해당주소의 원본값은
디버거 메모리에 보관된다.
39. 중단점 설정 전
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
40. 접근시의 중단점 동작 원리
STATUS_BREAKPOINT
x86 에서는 DR0-DR7 레지스터 셋을 통해 제어된다.
주소 중단점 레지스터인 DR0-DR3 레지스터는 프로세스가
감시하는 가상 주소를 기억하고
디버그 제어 레지스터인 DR7 은 브레이크 레지스터의
각 주소에 관한 제어 정보를 기억한다.