Обфускация и ее преодоление

         

и средств, направленных на затруднение


Обфускацией
(от английского obfuscation – буквально "запутывание") называется совокупность методик и средств, направленных на затруднение анализа программного кода. Существуют различные типы обфускаторов: одни занимаются интерпретируемыми языками типа Perl или PHP и "корежат" исходные тексты (удаляют комментарии, дают переменным бессмысленные имена, шифруют строковые константы etc), другие "перемалывают" байт-код виртуальных машин Java и .NET, что технически сделать намного труднее (РЕДАКТОРУ: уместно дать ссылку на статью по NET'у). Самые совершенные обфускаторы вламываются непосредственно в машинный код, "разбавляя" его мусорными инструкциями и выполняя целый ряд структурных (реже — математических) преобразований, изменяющих программу до неузнаваемости.
Вот об этом типе "запутывателей" мы и будем говорить. Фактически, это те же самые полиморфные генераторы, известные еще со времен Царя Гороха, только переоблаченные в новый термин, но сути дела это не меняет. Проблема в том, что полиморфный генератор может за считанные секунды сгенерировать хоть миллиард бессмысленных команд, перемешав их с несколькими килобайтами полезного кода — современные процессоры и жесткие диски это позволяют, пускай и с потерей эффективности, но на эффективность всем уже давно наплевать.
Удалять "мусор" в автоматическом режиме дизассемблеры еще не научились, а проанализировать мегабайты кода вручную методом "долота" — нереально. Нужны передовые методики реконструкции потока управления, расплавляющие "замусоренный" код и разделяющие его на "полезные" и "бесполезные" фракции, а их нет даже на уровне "теоретического понимания". И хотя кое-какие идеи на этот счет все же имеются (например, наложение маршрута трассировки на графы зависимостей по данным), до практической реализации еще далеко.


Содержание раздела