Сейчас на форуме: UniSoft, _MBK_, laslo, bartolomeo (+6 невидимых) |
eXeL@B —› Программирование —› CPPEH_RECORD и исключения |
Посл.ответ | Сообщение |
|
Создано: 29 июля 2011 07:20 · Поправил: DenCoder · Личное сообщение · #1 Пробелы в механизмах обработки исключительных ситуаций раньше меня мало волновали. Достаточно было перехватить обработчики... Но недавно решил покопать NtFlushInstructionCache и увидел такой код Code:
1) Локальная переменная ms_exc типа CPPEH_RECORD. Здесь ms_exc.disabled = 1, как я нашёл на васме, эквивалентно try{}. Но блок операторов пустой и следом же ms_exc.disabled = -1, что на великих просторах нигде не удалось найти, кроме как в листингах декомпиляции. Нашёл только, что ms_exc.disabled = -2 эквивалентно catch{}. Но опять же - непонятен механизм. 2) ms_exc почему-то всегда располагается в [ebp - 0x18]. Можно понять, что это связано с тем, что длина структуры sizeof(CPPEH_RECORD) = 0x18 и что механизм обработки исключений связан с расположением этой переменной в начале стека... но какой? 3) Ида больше знает об этой структуре, чем где-нибудь ещё. На сайте microsoft вообще почему-то о ней умалчивают... По крайней мере, запрос в лоб ничего не даёт. Code:
4) Вернёмся к коду выше. Этот кусок - главный смысл всей функции NtFlushInsructionCache. Как видно, цикл продолжается, пока [ebp - 0x20] не равно нулю. Но внутри цикла нет никаких операций над этой переменной... Есть только джамп в середину из обработчика. Code:
Следовательно, одна из инструкций или вся последовательность 80587C6A 05C C7 45 FC 01 00 00 00 mov [ebp+ms_exc.disabled], 1 80587C71 05C 83 4D FC FF or [ebp+ms_exc.disabled], 0FFFFFFF вызывает исключение. 5) Смотрим на ссылку o Code:
Знакомое дело - здесь 2 группы обработчиков. По-моему, в каждой первый - обработка самой исключительной ситуации, второй - завершающий, __finally{}. Собственно, вот и главный кусок кода функции, расположенный в 1-ом обработчике, без которого функция работать не будет Code:
О том, как регистрируются обработчики, ещё более менее можно найти. Где можно почитать о ms_exc и как влияет на ход выполнения программы ms_exc.disabled = 1 и ms_exc.disabled = -1 ? ----- IZ.RU |
|
Создано: 29 июля 2011 13:47 · Личное сообщение · #2 |
|
Создано: 29 июля 2011 14:44 · Поправил: DenCoder · Личное сообщение · #3 reverser, спасибо, чуть больше разобрался. Используется схема SEH3... Что-то как-то я сам не догадался реверснуть главный хэндлер, там было бы понятно... Но остаётся только один вопрос: Code:
здесь нет инструкций, вызывающих исключение... Эксперимента ради (меня и так уже сконфузили эти 2 команды ))) нашёл в блокноте такой же пролог для SEH3, поставил бряки на всех обработчиках, вставил эти 2 инструкции и... естественно ничего . Как тогда работает NtFlushInstructionCache? )) Варька слетела при обновлении, надо заново ставить... а так давно бы глянул... У меня подозрения, что она вообще не работает, просто цепляется к процессу и отцепляется, а если процесс текущий - то этого вообще не происходит... Или я что-то пропустил и туплю сижу Code:
Code:
----- IZ.RU |
|
Создано: 29 июля 2011 14:46 · Личное сообщение · #4 Code:
__except для TryLevel = 0 Code:
__finally для TryLevel = 0 Code:
__except для TryLevel = 1 Code:
__finally для TryLevel = 1 Code:
----- IZ.RU |
|
Создано: 30 июля 2011 00:31 · Личное сообщение · #5 Смотрим в исходники: private\ntos\mm\flushbuf.c: Code:
private\ntos\inc\i386.h: Code:
|
|
Создано: 30 июля 2011 08:05 · Личное сообщение · #6 |
|
Создано: 30 июля 2011 19:37 · Личное сообщение · #7 |
|
Создано: 30 июля 2011 21:51 · Личное сообщение · #8 |
eXeL@B —› Программирование —› CPPEH_RECORD и исключения |