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를 위치시켜보면 정상으로 나오긴 한다.
.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를 위치시켜보면 정상으로 나오긴 한다.
댓글
댓글 쓰기