2015-01-13 2 views
1

В x86 вы можете просто зарегистрировать обработчик со следующими тремя инструкциями.Как зарегистрировать структурированный обработчик исключений в сборке на архитектуре x86-64 в Windows?

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

Но это не работает на 64-битной Windows.

Я прочитал обработчик исключения x64, основанный на таблицах, и блоки __try и __except Visual C++ жестко подключены к каталогу исключений. Означает ли это, что Microsoft полностью отказалась от этого старого метода? Есть ли способ зарегистрировать обработчики программно из кода?

+0

Возможно, вы ищете функцию [AddVectoredExceptionHandler] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms679274.aspx)? – Jester

+0

Да, это пропало, это было слишком полезно для использования вредоносными программами. SAFESEH - это большая тема, найдите помощь по поиску «обработка исключений ml64». –

ответ

2

В Windows x64 используется обработка исключений на основе таблиц (в отличие от x86, где используется обработка на основе фреймов).

Каждое изображение имеет таблицу связанных с ним структур (обычно генерируемых компилятором). Структура в основном описывает функцию (или ее часть) на изображении и содержит информацию о том, как разматывать стек в этой функции. Он также может содержать информацию об обработчике исключений, которая должна быть вызвана внутри функции.
При возникновении исключения система находит таблицу, которая принадлежит изображению, в котором произошло исключение, и использует таблицу для перемещения/разматывания стека до тех пор, пока она не удалит обработчик исключений, который мог бы обрабатывать исключение.

Это означает, что вы не можете использовать [fs:0] для регистрации обработчика исключений.

Хотя можно создать таблицы RUNTIME_FUNCTION для загруженного/сгенерированного изображения, а затем зарегистрировать его через RtlAddFunctionTable или RtlInstallFunctionTableCallback API.

Вы можете найти хорошие статьи об обработке исключений Windows x64 по адресу Nynaeve's blog.
Также в MSDN содержится статья о структурах, используемых для Exception Handling (x64).