2015-01-13 5 views
1

x86에서는 핸들러를 다음 세 가지 명령어로 등록하기 만하면됩니다.Windows의 x86-64 아키텍처에서 구조적 예외 핸들러를 어셈블리에 등록하려면 어떻게해야합니까?

push addrOfExceptionHandler 
push dword [fs:0] 
mov [fs:0],esp 

하지만 64 비트 Windows에서는 작동하지 않습니다.

x64 예외 처리기가 테이블 기반이고 Visual C++의 __try__except 블록이 예외 디렉토리에 하드 연결되어 있음을 읽었습니다. 이것은 Microsoft가이 오래된 방법을 완전히 삭제했음을 의미합니까? 코드에서 프로그래밍 방식으로 핸들러를 등록하는 방법이 있습니까?

+0

아마도 [AddVectoredExceptionHandler] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms679274.aspx) 함수를 찾고 계십니까? – Jester

+0

예, 사라졌습니다. 악성 코드에서도 악용되었습니다. SAFESEH는 큰 주제이며, "ml64 예외 처리"를 검색하여 도움을 얻습니다. –

답변

2

Windows x64는 테이블 기반 예외 처리 (프레임 기반 처리가 사용되는 x86과 달리)를 사용합니다.

모든 이미지에는 테이블이 연관되어 있습니다 (보통 컴파일러에서 생성 됨). RUNTIME_FUNCTION 구조는 기본적으로 이미지에서 함수 (또는 그 부분)를 설명하고 해당 함수에서 스택을 푸는 방법에 대한 정보를 포함합니다. 또한 함수 내에서 호출되어야하는 예외 핸들러에 대한 정보를 포함 할 수도 있습니다.
예외가 발생하면 시스템은 예외가 발생한 이미지에 속한 테이블을 찾고 예외를 처리 할 수있는 예외 처리기에 도달 할 때까지 테이블을 사용하여 스택을 보행/풀기합니다.

이것은 예외 처리기 등록에 더 이상 [fs:0]을 사용할 수 없음을 의미합니다.

로드/생성 된 이미지에 대해 RUNTIME_FUNCTION 개의 테이블을 생성 한 다음 RtlAddFunctionTable 또는 RtlInstallFunctionTableCallback API를 통해 등록 할 수는 있지만,

Nynaeve's blog에서 Windows x64 예외 처리에 대한 유용한 자료를 찾을 수 있습니다.
또한 MSDN에는 Exception Handling (x64)에 사용 된 구조에 대한 기사가 포함되어 있습니다.