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

ОБФУСКАЦИЯ И ЕЕ ПРЕОДОЛЕНИЕ

КРИС КАСПЕРСКИ АКА МЫЩЪХ

Спецвыпуск: Хакер, номер #066, стр. 066-008-5


анализатор LOCO

СОЗДАН ТРОЙКОЙ МАГОВ: MATIAS MADOU, LUDO VAN PUT И KOEN DE BOSSCHERE. ЯВЛЯЕТСЯ ПРАКТИЧЕСКИ ЕДИНСТВЕННЫМ ДОСТУПНЫМ ИНСТРУМЕНТОМ. ДЛЯ ПРАКТИЧЕСКОЙ РАБОТЫ, ПРАВДА, ОН НЕПРИГОДЕН И БОЛЬШЕ НАПОМИНАЕТ ИГРУШКУ, СТОЯЩУЮ ТОГО, ЧТОБЫ ПОВОЗИТЬСЯ С НЕЙ.

ИСХОДНЫЙ КОД (ВМЕСТЕ С ДОКУМЕНТАЦИЕЙ И КУЧЕЙ ИНТЕРЕСНЫХ СТАТЕЙ НА ТЕМУ [ДЕ]ОБФУСКАЦИИ) МОЖНО БЕСПЛАТНО СКАЧАТЬ С ОФИЦИАЛЬНОГО САЙТА DIABLO — WWW.ELIS.UGENT.BE/DIABLO/?Q=OBFUSCATION. ПРАВДА, ОН БУДЕТ РАБОТАТЬ ТОЛЬКО ПОД UNIX.

[более совершенные обфускаторы] выполняют математические преобразования программного кода, а это кранты. В частности, команда «a++» может быть заменена на эквивалентную ей конструкцию a += (sin(x)2 + cos(x)2), где sin/cos вычисляются «вручную» посредством самого «тупого» и громоздкого алгоритма, распознать в котором исходную формулу не сможет и академик.

Классические трассеры данных уже не справляются с такой задачей: в этом случае граф не замыкается сам на себя и избыточность, внесенная обфускатором, не удаляется. Однако можно сделать кое-что в интерактивном режиме. Смотри. На входе мы имеем переменную «a», которая после долгих и загадочных манипуляций увеличивается на единицу. Если код линеен и инвариантен по отношению к другим данным (то есть не зависит от них), хакер может смело заменить всю эту замутку на «a++». Главное — чтобы исследовательский инструмент обеспечивал удобный, наглядный и непротиворечивый способ визуализации данных.

[чтобы ощутить все прелести обфускации] на собственной шкуре, достаточно взять Armadillo, упаковать свою собственную программу типа Hello, world!, а затем ковырнуть ее отладчиком или дизассемблером. Мама родная! Сколько ни трассируй программу, а смысла все равно не видно. Попадаешь в окружение кромешной тьмы и непроглядного мрака диких джунглей запутанного кода.

[с работающей программы] практически всегда можно снять дамп, как бы этому ни сопротивлялся распаковщик. Методики борьбы с распаковщиками довольно разнообразны и заслуживают отдельной статьи. Отметим лишь используемый Armadillo механизм динамической расшифровки CopyMem II, при котором память расшифровывается постранично.

Armadillo перехватывает обращение к зашифрованной странице через атрибут NO_ACCESS и механизм структурных исключений, расшифровывает ее, а затем зашифровывает вновь. Тем не менее, вполне реально написать драйвер, отслеживающий возникновение исключений и дампящий страницу после завершения ее расшифровки. Анализировать «запутанный» код протектора для этого совсем не обязательно, но не все и не всегда бывает так радужно…

Как бы хакер ни избегал анализа запутанного кода, рано или поздно он вляпается в ситуацию, когда полная реконструкция алгоритма будет действительно необходима. Сражение с обфускатором неизбежно. Раз так, нужно заранее подготовить себя к нему.

[Написать трассер] все равно придется, хотя бы чтобы понять, как работает отладчик. Лучше, если это будет «термоядерный» трассер, работающий на нулевом кольце и обходящий антиотладочные приемы, которые так любят использовать обфускаторы.

Назад на стр. 066-008-4  Содержание  Вперед на стр. 066-008-6