프로세스와 쓰레드 프로세스와 쓰레드 및 SEH
프로세스와 쓰레드 관계
프로세스와 쓰레드(1) 프로세스 쓰레드 프로그램(코드)가 메모리상에 읽혀져서 실행중인 상태. 각 프로세스는 별도의 리소스를 할당 받음. 쓰레드 하나의 프로그램 내에서 여러 개의 실행 흐름을 두기 위한 모델. 쓰레드들은 같은 프로세스에 있는 자원과 상태를 공유한다.
프로세스와 쓰레드(2) 쓰레드1 쓰레드2 프로세스 제어블록 (PCB) 쓰레드 제어 블록 쓰레드 제어 블록 핸들 테이블 . . . 프로세스 주소공간 사용자 스택 사용자 스택 커널 스택 커널 스택
커널 객체와 핸들 테이블(1) 커널 객체(Kernel Object) 핸들 테이블 커널에서 리소스를 원활히 관리하기 위해 중요한 정보를 담아둔 데이터 블록. 커널 객체는 운영체제 종속적이며, 소멸시점은 운영체제에 의해 결정된다. 핸들 테이블 프로세스에서 사용하는 모든 핸들들에 대한 커널 객체 포인터 정보를 배열 형태로 가지고 있는 공간.
커널 객체와 핸들 테이블(2) 커널 영역 유저 영역 프로세스 핸들 테이블 =커널 객체 헤더= HandleCount = 1 ReferenceCount = 2 핸들 5 =커널 객체 Body= union Body{ 파일객체; 타이머; 쓰레드; … } ObjectReference
핸들 테이블과 핸들 31 26 25 18 17 10 9 2 1 핸들값(32bit) Unused Layer1Index 핸들값(32bit) Unused Layer1Index Layer2Index Layer3Index Tag Layer3Array Layer1Array EProcess Layer2Array
EPROCESS와 PEB EPROCESS PEB 커널영역의 메모리에 표현된 프로세스 정보. 유저영역의 메모리에 표현된 프로세스의 추가적인 정보. 불필요한 커널레벨 진입을 줄임.
EPROCESS
PEB
ETHREAD 와 TEB ETHREAD TEB 실제로 CPU에 의해 명령어가 실행되어지는 실행의 주체. (이미지 로더와 DLL들)유저모드 컴포넌트의 컨텍스트 정보를 저장. 커널모드에서만 쓸수 있는 영역에 Write 하기 위해서 필요.
ETHREAD
TEB
전체 구조 프로세스 실행시 커널/유저 영역의 개략적인 상태 Vad Vad =TEB= Peb 쓰레드ID 유저영역 =PEB= Ldr =LDR_MODULE= Vad LDR_MODLE … 커널영역 커널Obj헤더 커널Obj헤더 =ETHREAD= Teb 프로세스ID 쓰레드ID ThreadListEntry =핸들테이블= EPROCESS ETHREAD =EPROCESS= 프로세스ID ObjectTable ThreadListHead Peb VadRoot ActiveProcessLinks EPROCESS 커널 Obj … ETHREAD 커널 Obj …
Structured Exception Handling(1) 키워드 _try _except() _finally 특징 _try{} _except(){} 혹은 _try{} finally{}형태로만 사용 가능.
Structured Exception Handling(2) try{ } finally{ } 프로그램이 정상/비 정상적으로 실행되더라도 반드시 실행되어야 하는 코드가 있는경우. try{ pMem = MemAlloc(100); a = b/c; //c=0 //MemRelease(pMem); }_finally{ if(pMem != NULL){ MemRelease(pMem); }
Structured Exception Handling(3) _try{ } _except(EXCEPTION_EXECUTE_HANDLER){ } 예외상황 발생시 예외처리 _try{ a = b/c; //c=0 print(“did you see this?); }_except(EXCEPTION_EXECUTE_HANDLER){ //예외 처리 }
Structured Exception Handling(4) _try{ } _except(EXECPTION_CONTINUE_EXECUTION){ } 예외상황 발생시 계속 진행 global int a = 0; _try{ int c = 10/a; print(“did you see this?”); }_except( RecoverException( GetExceptionCode() )){ } RecoverException(DWORD Ecode) { if(Ecode == 0나누기 예외) a = 2; } return EXCEPTION_CONTINUE_EXECUTION;
Structured Exception Handling(5) _try{ } _except(EXCEPTION_CONTINUE_SEARCH){ } 밖에 있는 예외 핸들러를 통해 예외를 처리. DivideZero(){ _try{ a = b/c; //c=0 }_exception( EXCEPTION_CONTINUE_SEARCH){ } _try{ DivideZero(); print(“did you see this”); }_except(EXCEPTION_EXECUTE_HANDLER){ //예외 처리 }