Fundamentals
Рассматривая обработку структурных исключений в предыдущем выпуске, мы мельком упомянули, что всякий процесс от рождения получает первичный обработчик структурных исключений, назначаемый операционной системой по умолчанию. Если программист забыл (или не захотел) назначать свои собственные обработчики, то все исключения, возникающие при выполнении программы, попадают в пасть первичного обработчика. Он расположен в NTDLL.DLL и, в зависимости от настроек оси, либо вызывает «Доктора Ватсона», либо выводит знаменитый диалог о критической ошибке с вариантами: ОK — завершить приложение в аварийном режиме и Cancel — вызывать Just-in-Time-отладчик (в роли которого может выступать и «Ольга»).
OllyDbg 1.x имеет коварный баг!
«Ольга» версии 1.10 имеет неприятный баг — если непосредственно за INT
следует команда PUSHFD
, заталкивающая флаги в стек, отладчик едет крышей и теряет управление над отлаживаемой программой, даже если мы нажимаем F7/F8 (Step Into / Step Over). Для демонстрации бага достаточно воткнуть в листинг пару команд PUSHFD
/POPFD
. А вот те же самые команды, отделенные от INT
одной или несколькими инструкциями NOP (или любыми другими), работают вполне нормально.
В «Ольге» 2.х ошибка уже исправлена, однако, учитывая, что 2.х все еще находится в стадии разработки, основным инструментом хакеров остается «Ольга» 1.10 с багом на борту.
То же самое происходит, если программист устанавливает один или несколько обработчиков структурных исключений, но никто из них не в состоянии справиться с ситуацией — вот они и передают исключение друг другу, пока оно не докатится до системного обработчика. Системный обработчик легко подменить своим (было бы желание). Достаточно вместо ссылки на предыдущий EXCEPTION_REGISTRATION
затолкать в поле prev значение -1. Это будет свидетельствовать, что данный обработчик — последний в цепочке.
Как вариант, можно воспользоваться API-функцией SetUnhandledExceptionFilter(
, перекрывающей обработчик исключений верхнего уровня (top-level exception handler). Да, именно «верхнего», поскольку Windows создавалась в Америке, расположенной на противоположной стороне Земли, где люди ходят вверх ногами. Первичный системный обработчик, с их точки зрения, находится на вершине пирамиды структурных исключений, в то время как русские программисты склонны рассматривать его как «основание». Но это все лирика, а дело‑то в том, что...
Функция SetUnhandledExceptionFilter(
, перекрывая системный обработчик, в неволе работать отказывается, то есть получает управление, только когда процесс не находится под отладчиком. В противном случае исключение передается непосредственно самому отладчику. Это — задумка проектировщиков, кстати сказать довольно оригинальная и полезная. Если отладчика нет — установленный программистом обработчик берет управление на себя и завершает работу программы максимально корректным образом. Если же процесс находится под отладкой, операционная система передает бразды правления отладчику, позволяя разобраться с ситуацией, поскольку после завершения программы разбираться будет не с чем и некому.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»