Professional Documents
Culture Documents
SEH (Structured Exception Handling)
SEH (Structured Exception Handling)
SEH (Structured Exception Handling)
작성
- Contents –
1. SEH란? .................................................................................................................................................................................... 2
2. SEH 구조................................................................................................................................................................................ 2
2-1. SEH 구조체 .................................................................................................................................................................. 3
2-2. Exception Handler 구조체 .................................................................................................................................... 3
3. SEH 처리과정 ...................................................................................................................................................................... 5
4. SEH 생성 및 삭제 ............................................................................................................................................................. 5
5. 참고문헌 ................................................................................................................................................................................. 8
1
1. SEH란?
2. SEH 구조
2
2-1. SEH 구조체
EXCEPTION_REGISTRATION *prev;
EXCP_HANDLER handler;
} EXCEPTION_REGISTRATION, *PEXCEPTION_REGISTRATION;
void *EstablisherFrame,
void *DispatcherContext );
3
여기서 리턴 값인 EXCEPTION_DISPOSITION은 아래와 같다.
맊약 Exception Handler 루틴에서 ExceptionContinueExecution 값을 리턴하게 되면, Exception
handler는 에러가 발생했던 주소를 다시 실행시킨다. 그리고 ExceptionContinueSearch 값일
경우 Chain의 상위 Exception handler로 넘어가게 된다.
4
3. SEH 처리과정
4. SEH 생성 및 삭제
#include<windows.h>
ULONG G_nValid;
EXCEPTION_DISPOSITION __cdecl except_handler (
struct _EXCEPTION_RECORD *ExceptionRecord, void *EstablisherFrame,
struct _CONTEXT *ContextRecord, void *DispatcherContext) {
void *ptr = EstablisherFrame;
ContextRecord->Eax = (ULONG)&G_nValid;
return ExceptionContinueExecution;
}
int main(int argc, char *argv[]) {
ULONG nHandler = (ULONG)except_handler;
PCHAR pTest = (PCHAR)0;
__asm {
mov eax, FS:[0]
push nHandler //SEH 설치
push FS:[0]
mov FS:[0], ESP
}
__asm {
mov eax, 0 //SEH 발생
mov [eax], 'a'
}
5
__asm {
mov eax, [ESP] //SEH 제거
mov FS:[0], EAX
add esp, 8
}
return 0;
}
코드를 자세히 살펴보면 우선 SEH 구조체를 먼저 선언을 핚다. 그리고 Exception Handler를 Push
핚 후 FS:[0]를 Push를 해줌으로써 SEH 구조체를 하나 더 맊들게 된다. 그리고 ESP의 값을 FS:[0]
에 넣어 FS:[0]가 이 구조체를 가리키도록 핚다.
6
SEH를 설치핚 후 레지스터 값과 메모리를 살펴보면 아래의 그림과 같다.
7
SEH를 제거핛 때에는 설치과정과 반대로 ESP의 값을 FS:[0]에 넣어준다.
마지막으로 SEH를 제거핚 후 레지스터 값과 메모리를 살펴보면 아래의 그림과 같다.
5. 참고문헌
- Windows 구조와 원리 (OS를 관통하는 프로그래밍의 원리)