NTLL!KiUserExceptionDispatcher(두번째 파라미터)

두번째 파라미터값에 대해서 조사를 해봐서 ContextFlags(1003f)이면
.cxr로 해당 컨텍스트로 이동해 볼수 있다

typedef struct _EXCEPTION_POINTERS {
   PEXCEPTION_RECORD ExceptionRecord; // CPU 독립적인 정보
   PCONTEXT ContextRecord; // CPU 의존적인 정보
} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;

해당 정보는 다음의 2가지 경우에 저장이 될 수 있다.
1) exception filter 수행중 덤프 수집된 경우
2) exception filter 수행중 얻은 exception 정보를 저장한 경우(크래쉬 덤프)


A) NTDLL!KiUserExceptionDispatcher ; 두번재 파라미터가 PCONTEXT
B) kv 커맨드 ; CONTEXT @ 0f123456
C) msvcrt!__InternalCxxFrameHandler
   - kpL 커맨드로 쉽게 볼 수 있다(첫번째 파라미터 Exception Record, 세번째 파라미터 Context Record)
D) !dumpstack

또한 ContextRecord의 ContextFlags값은 i386 기준으로 1003f임

팁으로 s 커맨드로 범위내의 1003f 값을 갖는 경우를 찾기 위해서 다음과 같이도 할 수 있음
x86> s -d start_addr end_addr 1003f

약간 이상하기는 한데
ntdll!RtlDispatchException
ntdll!KiUserExceptionDispatcher(2, 8, ...)

처럼 KiUser~() 두번째 파라미터가 CONTEXT를 가리키고 있지 않다면 위쪽에서(RtlDispatchException)을 검사해 봐라. 해당 위치에서는 i386인데도 1007f값을 가리킨다. 해당 위치로 CONTEXT를 위치시켜보면 정상으로 나오긴 한다.

댓글

이 블로그의 인기 게시물

[WinAPI] 모달리스 다이얼로그 설명

[WinDbg] Debugging a stack overflow

[WinDbg] first-chance, second-chance Exception