Всем привет. Хочу разместить на сайте wasm.ru свою статью, но не могу отправить письмо на wasm@wasm.ru -- возвращает с ошибкой. Делаю приложение с материалами, если администрацию заинтересует, то исходник можно взять отсюда. С уважением.
7mm Вы для начала разберитесь со стандартными механизмами, которые уже описаны. Голый механизм исключений на статью не тянет. Если есть идеи пишите в топик http://wasm.ru/forum/viewtopic.php?id=32181&p=3
У меня не было цели открыть Америку. Я изложил известные моменты с примерами, пояснениями и иллюстрациями. Возможно, кому-то это будет полезно.
7mm На кого расчитываете? На крипторщика, либо авера, либо малварщика, прикладника или драйвериста и т.д. и т.п. Описав целевую аудиторию, вы сможете отмазаться от тех кому чтото не нравится словами : "вы принадлжите к ... а я писал исключительно на ...". Более того позволит выкинуть моменты, которые не относятся к целевой аудитории!
Там в первом варианте есть ошибки, второй не читал, может там уже исправлено, но всё-таки... Ты путаешь <int 3> и <int3>.... по-моему, есть разница int3 - это 0xCC. А твоё - 0xCD03 (два байта). Возможно кто-нибудь раскажет для чего нужны двухбайтовые инты, Mikl__?
Это вы про пример?.. Ошибки бывают, факт. Кроме того, что в комментарии опкод неверный стоит (нужно 0xCC, вместо 0xCD), что-то ещё?..
Я, в общем-то, особо не искал, просто это бросилось в глаза. Честно говоря получил разрыв шаблона . Согласен, ошибки бывают, это нормально. Про ошибку написал с самыми лучшими чувствами
Z3N из 0xCC и 0xCD03 при сборке int3 и int 3 у меня всегда 0xCC, то бишь второй вариант нужно чуть ли не ручками побайтно прописывать
Двухбайтная Int 3 не желательна для применения. Так как она вызывает ловушку, то Ip ядро корректирует, аналогично и для Into, вот только без всевозможных поправок, просто выполняя декремент ссылки. Посему для двухбайтной Int 3, либо для инструкций с префиксами после обработки ядром Ip будет указывать не на начало инструкции, что может вызвать проблемы. Самый серьёзнай баг связан с TF. Например: Код (Text): push EFLAGS_TF or EFLAGS_MASK ; 0x302 popfd Int3 или любой иной сепшен, это требует софтверной поправки обязательно.
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.
Исправил некоторые неточности в листинге RtlDispatchException. Спасибо, Sol_Ksacap, а также всем остальным, кто комментирует.
Да, я читал о таком свойстве KiTrap03 у Clerk'а. Применять не приходилось, поэтому и всплыла эта неточность...