Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #57, АВГУСТ 2005 г.

Мануальная терапия

Крис Касперски ака мыщъх

Спецвыпуск: Хакер, номер #057, стр. 057-080-1


Учимся легко обходить точки останова

Если защита не будет препятствовать модификации своего собственного кода, ее немедленно хакнут, а если воспрепятствует - хакнут тем более. Контроль утрачивает свою силу, когда становится явным. Лобовые решения здесь бесполезны! Чтобы выжить, защитный механизм должен хитрить, используя все преимущества страничной организации виртуальной памяти. В этой статье автор делится с читателями передовыми идеями, выдранными из лучших защитных механизмов, которые только существуют.

Традиционные методики контроля целостности в большинстве своем сводятся либо к подсчету контрольной суммы, либо к проверке какого-то конкретного байта. Оба способа просты в реализации, но слишком гуманны. Во всех этих случаях происходит явное обращение к некоторой ячейке памяти, что не есть хорошо! Всякий хакер, хотя бы однажды видевший SoftIce, немедленно нажмет <Ctrl-D> и поставит бряк на эту ячейку, чтобы узнать, какая зараза ее контролирует. Конечно, защитный механизм может активно противодействовать отладчику, но это будет уже перебор. Грамотная антиотладка отнимает уйму времени и усилий, а безграмотная отламывается в два счета.

Необходимо найти такой способ самоконтроля, который никак не препятствует отладке, но волшебным образом обходит все точки останова, даже при запуске под отладчиком-эмулятором. И такие способы есть! Рассмотрим один из них.

Для этого нам понадобится hex-редактор HTE, который можно бесплатно скачать с сервера http://hte.sourceforge.net. Это могучий и послушный инструмент, намного более функциональный, чем HIEW, и к тому же распространяемый в исходных текстах, что позволило портировать его под множество платформ. Правда, набор горячих клавиш не совпадает с HIEW, что поначалу очень раздражает (как ни крути, многолетняя привычка к HIEW берет свое). Впрочем, раскладку горячих клавиш изменить нетрудно. Однако во избежание никому не нужной путаницы в этой статье будет использоваться оригинальная раскладка.

Идея

Страничная организация памяти, используемая в 386+-процессорах, абстрагирует нас от физических адресов. Один и тот же физический регион памяти может проецироваться по нескольким виртуальным адресам, но ни отладчик, ни дизассемблер об этом даже не догадываются, поскольку опираются исключительно на виртуальные адреса.

Спроецируем физическую страницу F по виртуальным адресам A и B. Тогда, при записи в страницу A, все изменения немедленно отобразятся в странице B, поскольку в действительности это одна и та же страница! Как можно использовать это на практике? Создадим две переменных var_a и var_b. Первую из них мы разместим на странице A, а вторую - на странице B. Образуется что-то вроде нуль-пространственного туннеля, пригодного для контрабандной переброски данных из одного конца программы в другой. Убийственный трюк, не правда ли?! Допустим, переменная var_a отвечает за флаг регистрации. Дизассемблер покажет множество перекрестных ссылок, ведущих к разным частям защитного кода, но… среди них не будет ни одной перекрестной ссылки на var_b, а значит, часть проверок регистрационного кода останется незамеченной, и хакер будет долго ломать голову, как это так. Самое главное: точка останова, установленная на запись/чтение переменной var_a, при обращении к переменной var_b не вызовет всплытия отладчика!

Содержание  Вперед на стр. 057-080-2