Статья: Обработка user-mode исключений в Windows.

Тема в разделе "WASM.SITE", создана пользователем 7mm, 25 май 2010.

  1. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Всем привет.

    Хочу разместить на сайте wasm.ru свою статью, но не могу отправить письмо на wasm@wasm.ru -- возвращает с ошибкой. Делаю приложение с материалами, если администрацию заинтересует, то исходник можно взять отсюда.

    С уважением.
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    7mm
    Вы для начала разберитесь со стандартными механизмами, которые уже описаны. Голый механизм исключений на статью не тянет. Если есть идеи пишите в топик http://wasm.ru/forum/viewtopic.php?id=32181&p=3
     
  3. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    У меня не было цели открыть Америку. Я изложил известные моменты с примерами, пояснениями и иллюстрациями. Возможно, кому-то это будет полезно.
     
  4. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    7mm
    На кого расчитываете? На крипторщика, либо авера, либо малварщика, прикладника или драйвериста и т.д. и т.п. Описав целевую аудиторию, вы сможете отмазаться от тех кому чтото не нравится словами : "вы принадлжите к ... а я писал исключительно на ...". Более того позволит выкинуть моменты, которые не относятся к целевой аудитории!
     
  5. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    7mm
    нормально, мне понравилось - буду вникать
     
  6. Aquila

    Aquila Самурай дзена

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    1.467
    Адрес:
    Russia, Moscow
    Ок, выложу на днях.
     
  7. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Спасибо, тогда эту версию.
     
  8. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Там в первом варианте есть ошибки, второй не читал, может там уже исправлено, но всё-таки...

    Ты путаешь <int 3> и <int3>.... по-моему, есть разница int3 - это 0xCC. А твоё - 0xCD03 (два байта).
    Возможно кто-нибудь раскажет для чего нужны двухбайтовые инты, Mikl__?
     
  9. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Это вы про пример?.. Ошибки бывают, факт. Кроме того, что в комментарии опкод неверный стоит (нужно 0xCC, вместо 0xCD), что-то ещё?..
     
  10. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Я, в общем-то, особо не искал, просто это бросилось в глаза. Честно говоря получил разрыв шаблона :).
    Согласен, ошибки бывают, это нормально. Про ошибку написал с самыми лучшими чувствами :)
     
  11. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    Z3N

    из 0xCC и 0xCD03
    при сборке int3 и int 3 у меня всегда 0xCC, то бишь второй вариант нужно чуть ли не ручками побайтно прописывать
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Двухбайтная Int 3 не желательна для применения. Так как она вызывает ловушку, то Ip ядро корректирует, аналогично и для Into, вот только без всевозможных поправок, просто выполняя декремент ссылки. Посему для двухбайтной Int 3, либо для инструкций с префиксами после обработки ядром Ip будет указывать не на начало инструкции, что может вызвать проблемы.
    Самый серьёзнай баг связан с TF. Например:
    Код (Text):
    1.     push EFLAGS_TF or EFLAGS_MASK   ; 0x302
    2.     popfd
    3.     Int3
    или любой иной сепшен, это требует софтверной поправки обязательно.
     
  13. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Z3N
    7mm
    Для тех кто не в курсе или забыли. 0xCC это прерывание отладчика читайте точка останова. Специальный опкод. Конечно же CD 03 это тоже вызов 3его прерывания - но эта инструкция (INT imm8) предназначена, чтобы вызывать различные прерывания (а не только 3е). Собственно в досе, если кто еще помнит, мы часто вызывали int 20h (CD 20) int 21h (CD 21) и так далее.
    Просто однобайтовый опкод удобнее для отладки. Заменять то 1 байт проще чем 2. А так же у однобайтового опкода есть некие возможности которых нет у 2хбайтового (CD 03) (поправьте если не прав, но вроде так оно и было):
    1) В режиме VME (Virtual-8086 Mode Extension) мы не получим перенаправление вектора прерывания int 3, вместо этого прерывание вызовет обработчик защищенного режима.
    2) В режиме Virtual-8086 инструкция не проходит проверку IOPL и вызывает прерывание грубо говоря напрямую.

    Во всех остальных случаях эти опкоды идентичны, просто обычно, современный компилятор для x86-64, для мнемоники int 3 генерирует опкод CC.
    В ситуации с Windows, виндовый KiTrap03 обработчик "не понимает" опкод CD 03. Он послушно считает, что сработал int3 (СС) и "отматывает" EIP на 1 назад. В обычном случае эффект очевиден - управление останавливается перед бряком. А в этом же случае эффект не очень полезен - eip застрянет посередине опкода CD 03.
     
  14. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Исправил некоторые неточности в листинге RtlDispatchException. Спасибо, Sol_Ksacap, а также всем остальным, кто комментирует.
     
  15. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Да, я читал о таком свойстве KiTrap03 у Clerk'а. Применять не приходилось, поэтому и всплыла эта неточность...
     
  16. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    7mm
    Выполните push 0x302/popfd/[любая инструкцию вызывающая сепшен, но не рушащая стек].
     
  17. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Про safeseh не написано?
     
  18. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Нет.
     
  19. Aquila

    Aquila Самурай дзена

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    1.467
    Адрес:
    Russia, Moscow
    Статья размещена на сайте.