Microsoft 고유의 예외 처리 메커니즘
Microsoft-specific exception handling mechanismsMicrosoft Windows 시리즈 운영 체제에서는 몇 가지 특정 예외 처리 메커니즘을 사용합니다.
구조화된 예외 처리
Microsoft Structured Exception Handling은 Windows의 네이티브 예외 처리 메커니즘이며 VEVE([1]Vectored Exception Handling)의 선구자 기술입니다.이 제품은finally
메커니즘은 표준 C++ 예외에는 존재하지 않습니다(다만 나중에 도입된 대부분의 명령어 언어에는 존재합니다).SEH는 실행 스레드별로 개별적으로 설정 및 처리됩니다.
사용.
Microsoft는 컴파일러 수준의 프로그래밍 기술로서만 SEH를 지원합니다.MS Visual C++ 컴파일러에는, 다음의 3개의 비표준 키워드가 있습니다.__try
,__except
그리고.__finally
- 이 목적을 위해.기타 예외 처리 측면은 다음과 같은 많은 Win32 API [2]함수에 의해 지원됩니다.RaiseException
SEH 예외를 수동으로 발생시킵니다.
실행
IA-32
Windows IA-32 Edition 또는 x86-64 버전용 WoW64 에뮬레이션레이어의 각 실행 스레드에는 문서화되어 있지 않은 링크가 있습니다. 스레드 정보 블록의 선두에 있는 _EXCEPTION_RECTION_RECORDLIST.그__try
스테이트먼트는 본질적으로 컴파일러 정의의EH_prolog
기능.이 함수는 스택에 _EXCEPTION_REGISTRATION_RECORD를 할당합니다.__except_handler3
[a] 에서 기능하다.msvcrt.dll
그러면 레코드가 목록 선두에 추가됩니다.[b]마지막에는__try
컴파일러 정의 블록EH_epilog
역연산을 하는 함수를 호출합니다.이러한 컴파일러 정의 루틴 중 하나는 인라인일 수 있습니다.모든 프로그래머 정의__except
그리고.__finally
블록은 내부에서 호출됩니다.__except_handler3
프로그래머 정의 블록이 존재하는 경우 에 의해 작성된_EXCEPTION_REGISTRATION_RECORDEH_prolog
는 에서 사용되는 몇 개의 추가 필드를 사용하여 확장됩니다.__except_handler3
를 클릭합니다.[3]
사용자 모드 코드의 예외의 경우 운영시스템은[c] 스레드의 _EXCEPTION_REGISTRATION_RECORD 목록을 해석하고 핸들러가 예외를 처리했음을(반환값으로) 신호하거나 목록이 모두 사용될 때까지 각 예외 핸들러를 차례로 호출합니다.리스트의 마지막은 항상kernel32!UnhandledExceptionFilter
General protection fault 오류 [d]메시지가 표시됩니다.그런 다음 목록을 다시 한 번 통과하면 핸들러가 사용된 리소스를 정리할 수 있습니다.마지막으로 프로세스가 재개되거나 종료되는 커널[e] 모드로 돌아갑니다.
이 모드의 SEH US5628016 특허는 2014년에 만료되었습니다.
x86-64
64비트 Windows 에서의 SEH 에는 런타임 예외 핸들러 리스트는 포함되지 않습니다.대신 스택 언바인딩 테이블을 사용합니다( ).UNWIND_INFO
예외 발생 [4][5]시 시스템에 의해 해석됩니다.이는 컴파일러가 수동으로 스택 언바인딩을 수행하고 예외 핸들러를 적절하게 호출하기 위해 추가 코드를 생성할 필요가 없음을 의미합니다.스택 프레임레이아웃 및 지정된 예외 핸들러에 대한 테이블 언바인드 형식으로 정보를 전송하기만 하면 됩니다.
지지하다
Mingw-w64의 GCC 4.8+에서는 C++ 예외에 대해 64비트 SEH 사용이 지원됩니다.LLVM Clang 지원__try
x86과 [6]x64의 양쪽 모두에서.
벡터된 예외 처리
Vectored Exception Handling은 Windows [7]XP에서 도입되었습니다.벡터 예외 처리는 C++ 및 Visual Basic 등의 언어를 사용하는 Windows 프로그래머가 사용할 수 있습니다.VEH는 Structured Exception Handling(SEH; 구조화 예외 처리)을 대체하는 것이 아니라 VEH와 SEH가 공존하며 VEH 핸들러가 SEH [1][7]핸들러보다 우선합니다.SEH에 비해 VEH는 커널에서 전달되는 Unix 신호에 [8]더 가깝습니다.
메모들
- ^ 이름은 VC 런타임 버전에 따라 다릅니다.
- ^
ntdll.dll
그리고.kernel32.dll
VC 런타임에 스태틱하게 링크된 다른 프로그램과 함께 이 함수를 컴파일합니다. - ^ 좀 더 구체적으로 말하면
ntdll!RtlDispatchException
호출된 시스템 루틴ntdll!KiUserExceptionDispatcher
이것은 차례로 에서 호출됩니다.nt!KiDispatchException
커널 함수(을 참조해 주세요.Ken Johnson (November 16, 2007). "A catalog of NTDLL kernel mode to user mode callbacks, part 2: KiUserExceptionDispatcher". 상세) - ^ 프로세스의 오류 모드를 변경하여 메시지를 무음화할 수 있습니다.기본 마지막 핸들러는 SetUnhandledExceptionFilter API로 대체할 수 있습니다.
- ^
ntdll!KiUserExceptionDispatcher
어느 쪽인가에 대해서nt!ZwContinue
또는nt!ZwRaiseException
레퍼런스
- ^ a b "Vectored Exception Handling in Windows Server 2003 (Through Internet Archive)". Archived from the original on 2008-01-18.
- ^ Microsoft Corp. (2009-11-12). "Structured Exception Handling Functions". MSDN Library. Retrieved 2009-11-17.
- ^ 컴파일러 기반의 구조화된 예외 처리Peter Kleissner (February 14, 2009). "Windows Exception Handling - Peter Kleissner". Archived from the original on October 14, 2013. Retrieved 2009-11-21. 섹션
- ^ "Exceptional Behavior - x64 Structured Exception Handling". The NT Insider.
- ^ "x64 exception handling". VC++ 2019 documentation.
- ^ "MSVC compatibility". Clang 11 documentation.
- ^ a b "Under the Hood: New Vectored Exception Handling in Windows XP". Archived from the original on 2008-09-15.
- ^ "Windows Server 2003 Discover Improved System Info, New Kernel, Debugging, Security, and UI APIs". Archived from the original on 2008-05-05.
외부 링크
- Microsoft Corp. (2009-11-12). "Structured Exception Handling". MSDN Library. Retrieved 2009-11-17.
- Matt Pietrek (Jan 1997). "A Crash Course on the Depths of Win32 Structured Exception Handling". MSJ. 12 (1). Archived from the original on 2003-07-10. 여기에 제시된 예는 최신 Windows 시스템(XP SP2 이후)에서는 동작하지 않습니다.이는 초기 SEH 설계에서 발생한 보안 문제에 대처하기 위해 Microsoft가 변경했기 때문입니다.이 예제는 컴파일된 경우 최신 버전의 Windows에서 계속 작동합니다.
/link /safeseh:no
. - "win32: Safe Structured Exception Handling". Yasm manual.
- 미국 특허 7,480,919 - 세이프 예외
- Johannes Passing (May 20, 2008). "Fun with low level SEH". 최신 Windows에서 낮은 수준의 SEH(특히 SafeSEH) 코드를 사용하기 위해 필요한 불분명한 세부 사항에 대해 설명합니다.
- Igor Skochinsky (March 6, 2006). "Reversing Microsoft Visual C++ Part I: Exception Handling". OpenRCE. Retrieved 2009-11-17.
- Matt Miller (2 Feb 2009). "Preventing the Exploitation of Structured Exception Handler (SEH) Overwrites with SEHOP". Technet.
- Stéfan Le Berre, Damien Cauquil (22 Dec 2009). "Bypassing SEHOP" (PDF). Sysdream. Archived from the original (PDF) on 2012-09-07.
- Joshua J. Drake (10 Jan 2012). "Old Meets New: Microsoft Windows SafeSEH Incompatibility". Windows 7 SP1이 일부 오래된 바이너리에 대해 SafeSEH를 무시하고 Windows XP SP3가 SafeSEH를 사용하는 이유를 설명하는 기사입니다.