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

Немой укор за компьютерный хардкор

Крис Касперски

Спецвыпуск: Хакер, номер #048, стр. 048-058-2


Сгенерированная перекрестная ссылка ведет в глубину библиотечной функции _printf, случайно оказавшейся на этом месте. Сам же модифицируемый код ничем не выделяется на фоне остальных машинных команд, и взломщик будет абсолютно уверен, что здесь находится именно "JZ", а не "JNZ"! Естественно, в данном случае это не сильно усложнит анализ, ведь защитная процедура (protect_proc) торчит у хакера под самым носом и он обязательно полюбопытствует. Однако если подвергнуть самомодификации алгоритм проверки серийных номеров, заменяя ROR на ROL, взломщик будет долго материться, удивляясь, почему его хакерский генератор не срабатывает. А когда запустит отладчик, будет ругаться еще больше, поскольку обнаружит, что его поимели, незаметно заменив одну машинную команду на другую. Большинство взломщиков, кстати, именно так и поступают - запрягают отладчик и дизассемблер в одну упряжку.

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

Статическая шифровка (характерная для большинства навесных протекторов) в настоящее время признана совершенно бесперспективной. Дождавшись момента завершения расшифровки, хакер снимает дамп и затем исследует его стандартными средствами. Естественно, защитные механизмы так или иначе пытаются этому противостоять. Они искажают таблицу импорта, затирают PE-заголовок, устанавливают атрибуты страниц в NO_ACCESS, однако опытных хакеров такими фокусами надолго не остановишь. Любой, даже самый изощренный, навесной протектор вручную снимется без труда, а для некоторых имеются и автоматические взломщики.

Ни в какой момент времени весь код программы не должен быть расшифрован целиком! Возьми себе за правило, расшифровывая один фрагмент, зашифровывать другой. Причем расшифровщик должен быть сконструирован так, чтобы хакер не мог использовать его для расшифровки программы. Это типичная уязвимость большинства защитных механизмов. Хакер находит точку входа в расшифровщик, восстанавливает его прототип и пропускает через него все зашифрованные блоки, получая на выходе готовый к употреблению дамп. Причем, если расшифровщик представляет собой тривиальный XOR, хакеру будет достаточно определить место хранения ключей, а расшифровать программу он сможет и сам.

Назад на стр. 048-058-1  Содержание  Вперед на стр. 048-058-3