От­ладчи­ки, работа­ющие через MS Debugging API (OllyDbg, IDA-Pro, MS VC), вынуж­дены мирить­ся с тем, что отла­доч­ные про­цес­сы «стра­дают» хро­ничес­кими осо­бен­ностя­ми поведе­ния. Они «лома­ют» логику прог­раммы, и это с огромной выгодой исполь­зуют защит­ные механиз­мы. В час­тнос­ти, API-фун­кция SetUnhandledExceptionFilter() под отладчи­ком вооб­ще не вызыва­ется — вов­се не баг отладчи­ка, а докумен­тирован­ная фича сис­темы!

Fundamentals

Рас­смат­ривая обра­бот­ку струк­турных исклю­чений в пре­дыду­щем выпус­ке, мы мель­ком упо­мяну­ли, что вся­кий про­цесс от рож­дения получа­ет пер­вичный обра­бот­чик струк­турных исклю­чений, наз­нача­емый опе­раци­онной сис­темой по умол­чанию. Если прог­раммист забыл (или не захотел) наз­начать свои собс­твен­ные обра­бот­чики, то все исклю­чения, воз­ника­ющие при выпол­нении прог­раммы, попада­ют в пасть пер­вично­го обра­бот­чика. Он рас­положен в NTDLL.DLL и, в зависи­мос­ти от нас­тро­ек оси, либо вызыва­ет «Док­тора Ват­сона», либо выводит зна­мени­тый диалог о кри­тичес­кой ошиб­ке с вари­анта­ми: ОK — завер­шить при­ложе­ние в ава­рий­ном режиме и Cancel — вызывать Just-in-Time-отладчик (в роли которо­го может выс­тупать и «Оль­га»).

OllyDbg 1.x имеет коварный баг!

«Оль­га» вер­сии 1.10 име­ет неп­рият­ный баг — если непос­редс­твен­но за INT 03h сле­дует коман­да PUSHFD, затал­кива­ющая фла­ги в стек, отладчик едет кры­шей и теря­ет управле­ние над отла­жива­емой прог­раммой, даже если мы нажима­ем F7/F8 (Step Into / Step Over). Для демонс­тра­ции бага дос­таточ­но вот­кнуть в лис­тинг пару команд PUSHFD/POPFD. А вот те же самые коман­ды, отде­лен­ные от INT 03h одной или нес­коль­кими инс­трук­циями NOP (или любыми дру­гими), работа­ют впол­не нор­маль­но.

В «Оль­ге» 2.х ошиб­ка уже исправ­лена, одна­ко, учи­тывая, что 2.х все еще находит­ся в ста­дии раз­работ­ки, основным инс­тру­мен­том хакеров оста­ется «Оль­га» 1.10 с багом на бор­ту.

То же самое про­исхо­дит, если прог­раммист уста­нав­лива­ет один или нес­коль­ко обра­бот­чиков струк­турных исклю­чений, но ник­то из них не в сос­тоянии спра­вить­ся с ситу­ацией — вот они и переда­ют исклю­чение друг дру­гу, пока оно не докатит­ся до сис­темно­го обра­бот­чика. Сис­темный обра­бот­чик лег­ко под­менить сво­им (было бы желание). Дос­таточ­но вмес­то ссыл­ки на пре­дыду­щий EXCEPTION_REGISTRATION затол­кать в поле prev зна­чение -1. Это будет сви­детель­ство­вать, что дан­ный обра­бот­чик — пос­ледний в цепоч­ке.

Как вари­ант, мож­но вос­поль­зовать­ся API-фун­кци­ей SetUnhandledExceptionFilter(), перек­рыва­ющей обра­бот­чик исклю­чений вер­хне­го уров­ня (top-level exception handler). Да, имен­но «вер­хне­го», пос­коль­ку Windows соз­давалась в Аме­рике, рас­положен­ной на про­тиво­полож­ной сто­роне Зем­ли, где люди ходят вверх ногами. Пер­вичный сис­темный обра­бот­чик, с их точ­ки зре­ния, находит­ся на вер­шине пирами­ды струк­турных исклю­чений, в то вре­мя как рус­ские прог­раммис­ты склон­ны рас­смат­ривать его как «осно­вание». Но это все лирика, а дело‑то в том, что...

SetUnhandledExceptionFilter() на MSDN
SetUnhandledExceptionFilter() на MSDN

Фун­кция SetUnhandledExceptionFilter(), перек­рывая сис­темный обра­бот­чик, в неволе работать отка­зыва­ется, то есть получа­ет управле­ние, толь­ко ког­да про­цесс не находит­ся под отладчи­ком. В про­тив­ном слу­чае исклю­чение переда­ется непос­редс­твен­но самому отладчи­ку. Это — задум­ка про­екти­ров­щиков, кста­ти ска­зать доволь­но ори­гиналь­ная и полез­ная. Если отладчи­ка нет — уста­нов­ленный прог­раммис­том обра­бот­чик берет управле­ние на себя и завер­шает работу прог­раммы мак­сималь­но кор­рек­тным обра­зом. Если же про­цесс находит­ся под отладкой, опе­раци­онная сис­тема переда­ет браз­ды прав­ления отладчи­ку, поз­воляя разоб­рать­ся с ситу­ацией, пос­коль­ку пос­ле завер­шения прог­раммы раз­бирать­ся будет не с чем и некому.

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии