Библиотека
|
ваш профиль |
Кибернетика и программирование
Правильная ссылка на статью:
Коробейников А.Г., Кутузов И.М., Колесников П.Ю.
Анализ методов обфускации
// Кибернетика и программирование.
2012. № 1.
С. 31-37.
DOI: 10.7256/2306-4196.2012.1.13858 URL: https://nbpublish.com/library_read_article.php?id=13858
Анализ методов обфускации
Дата направления статьи в редакцию: 20-11-2014Дата публикации: 04-12-2014Аннотация: Современные компьютерные технологии делают актуальными различные задачи в сфере информационной безопасности. Например, для защиты авторских прав на изображения применяют методы стеганографии. Для решения задачи доказательства авторства (или наоборот скрытия такового) программного кода используют методы обфуска́ции. Обфуска́ция (от лат. Obfuscare – затенять, затемнять; и англ. Obfuscate – делать неочевидным, запутанным, сбивать с толку) или запутывание кода – это процесс приведения исходного текста или исполняемого кода программы к виду, сохраняющему ее функциональность, но затрудняющему анализ, понимание алгоритмов работы и модификацию при декомпиляции. В настоящее время имеются специальные программы, производящие обфускацию, называемые обфускаторами, которые решают поставленную задачу по-разному. В данной статье рассматриваются основные методы обфускации от самых простых полиморфных генераторов до изощренных обфускаторов, выполняющих математические преобразования программного кода, а так же взаимосвязь обфускации и повышения эффективности исполнения программного кода и уменьшению размера программы. Описано дальнейшее развитие методов обфускации. Ключевые слова: обфускация, стеганография, авторские права, защита информации, сокрытие информации, методы обфускации, распознавание, обфускатор, оптимизация, декомпиляцияУДК: 003.26.09Abstract: Modern computer technology makes it a variety of tasks relevant to the field of information security. For example, for the protection of copyright in the images methods of steganography are used. To solve the problem of proving authorship (or vice versa) code obfuscation techniques are used. Obfuscation (from Lat. Obfuscare - obscure, obfuscate, and English. Obfuscate - make non-obvious, confusing, confusing) or obfuscated code - is the process of bringing the source code or executable program code to the form, that keeps its functionality, but complicates the analysis, understanding algorithms and modification during decompilation. Currently, there are special programs called obfuscators that performes obfuscation to solve the task in different ways. The article discusses the techniques of obfuscation from the most basic to sophisticated polymorphic generators obfuscators performing the mathematical transformation of the code, as well as the relationship of obfuscation and efficiency of program code execution and reduce the size of the program. The authors describe further development of obfuscation techniques. Keywords: obfuscation, steganography, copyright, information protection, concealment of information, methods of obfuscation, recognition, obfuscator, optimization, decompilationВведение В настоящее время имеются специальные программы, производящие обфускацию[1], называемые обфускаторами, которые решают поставленную задачу по-разному. Например, одни занимаются интерпретируемыми языками типа PHP и изменяют исходные тексты (удаляют комментарии, дают переменным бессмысленные имена, шифруют строковые константы и т.д.), другие изменяют байт-код виртуальных машин Java и .NET, что технически сделать намного труднее. Более развитые обфускаторы изменяют машинный код, вставляя бессмысленные инструкциями. Кроме того они могут делать структурные или математические преобразования, изменяющие программу до неузнаваемости. Обфускация не является алгоритмом шифрования и не является алгоритмом передачи данных. Поэтому она в международном праве не запрещена и не стандартизирована. Кроме того, нельзя ограничить обфускацию по длине ключа, ввиду отсутствия такового. Таким образом, обфускацию можно применять, например, если требуется защитить какой-то продукт, но использование шифрования запрещено или недостаточно для сокрытия информации. В случаях конфликта по поводу авторских прав, при запутывании последовательности символов, достаточно легко доказать своё авторство. Это обусловлено тем, что злоумышленник не сможет получить исходный текст при анализе запутанного. Даже при использовании надёжных обфусцирующих алгоритмов в тексте всё равно останутся обфусцированные места. Кроме того, обфускация может производиться практически на любых уровнях. От исходных текстов до машинных команд, включая промежуточный код. В этом случае злоумышленнику будет крайне трудно изъять из кода программы все заложенные не декларированные особенности. Рассмотрим основные методы обфускации. Методы обфускации Первые, и самые простые, обфускаторы являются давно известными полиморфными генераторы. Они за небольшое время генерируют бесполезные команды вида nop, xchg reg,reg, никогда не выполняющимися переходами типа xor reg,reg/jnz junk, где xor — значимая команда, а junk — «мертвый код», и вставляя их в значимый код. Конечно, при этом происходит некоторая потеря эффективности, но это не критично. Современные дизассемблеры не могут эффективно удалять «мусор» в автоматическом режиме, а проанализировать мегабайты кода вручную нереально. Но идеи как это делать имеются, например наложение маршрута трассировки на графы зависимостей по данным. Более сложные обфускаторы «перемешивают» код, закручивая поток управления в запутанную спираль условных/безусловных переходов, использующих технику «перекрытия» команд. Некоторые байты могут принадлежать трем машинным инструкциям, что «ослепляет» дизассемблеры, заставляя их генерировать неполный и неправильный листинг. Для противодействия такой технологии можно применить трассировщик, генерирующий листинг реально выполняемых машинных команд. При этом заодно избавимся от части мусора и «мертвого» кода. Изощренные обфускаторы отслеживать зависимость по данным, внедряя осмысленные инструкции с «нулевым эффектом». Сложные обфускаторы могут временно сохранять регистр на стеке, а затем, многократно изменив его состояние, восстановить прежнее значение. Понятно, что такие действия вносят побочные эффекты (как минимум, воздействуют на флаги), и обфускатору необходимо совершить множество проверок, чтобы убедиться в работоспособности защищаемой программы. Разработка качественного и надежного запутывателя – сложная инженерная задача, но потраченное время стоит того[2]. Бесполезность «инструкций с нулевым эффектом» уже не распознается визуально, и обычный трассер тут ничем не поможет. Необходимо трассировать не только поток управления, но и поток данных, то есть отслеживать реальные изменения значений регистров/ячеек памяти, для чего обычно используются графы. Как только граф замыкается сам на себя, все «лишние» операции над данными удаляются и остается только суть. Более совершенные обфускаторы выполняют математические преобразования программного кода. Например, команда «a++» может быть заменена на эквивалентную ей конструкцию a += abs(exp(I*x)), где abs(exp(I*x)) – модуль экспоненциального представления комплексной величины, вычисляемый при помощи разложения в ряд Тейлора. Распознать в такой записи исходную формулу очень трудно. Классические трассировщики данных уже не справляются с такой задачей: в этом случае граф не замыкается сам на себя и избыточность, внесенная обфускатором, не удаляется. Повышение эффективности При выполнении обфускации зачастую ускоряется время работы и размер программы. Так, например, минимизация JavaScript приводит как к уменьшению размера программы, так и к ускорению её интерпретации. В качестве примера используем язык Java. Сначала создадим пример исходного текста программы.
В обфусцированном варианте данный код выглядит следующим образом: public static void a1(ArrayList a2){ for(int a3=0;a3<a2.size(); a3++) a2.set(a3, a2.get(a3)*0.1); } Как видно из примера, с ходу, не зная назначения кода крайне трудно понять работу данной функции. На этом примере также можно увидеть как обфускация уменьшает использование памяти. В необфусцированном коде выделяется память под счётчик, под множитель и при каждой итерации выделяется память под результат. В обфусцированном варианте данная память не требуется, так как результат помещается в исходные ячейки памяти. Заключение Дальнейшее развитие методов обфускации ставит перед хакерам трудные задачи по взлому программного обеспечения. С ходу можно назвать трансляторы С-кода в байт-код Машин Тьюринга, Стрелок Пирса, Сетей Петри и многих других примитивных машин. Производительности современных процессоров уже достаточно. В практическом плане это означает бесперспективность анализа кода стандартным методам. Если теоретически возможно (но практически очень и очень сложно) вычистить мусор и удалить избыточность, внесенную «запутывателями», то «распутать» байт-код Сетей Петри уже невозможно. Далее, обфускация создает новую ситуацию в антивирусной индустрии. Чтобы взломать программу, анализировать ее алгоритм в общем-то необязательно. Зато обнаружить зловредный код (он же malware) без этого уже не удастся! И последнее, комбинирование стеганографии и обфускации в программных продуктах по времени расшифровывания может сравниваться с криптоанализом шифротекста. Поэтому исследование и разработка алгоритмов для задач в сфере информационной безопасности является перспективным направлением исследований. Библиография
1. Коробейников А.Г., Кувшинов С.С. Cистема скрытой передачи сообщений в графических изображениях формата JPEG//Научно-технический вест¬ник СПб ГУ ИТМО– СПб: СПбГУ ИТМО, 2008.– вып. 51.– с.152-159.
2. Анализ запутывающих преобразований программ//CIT Forum URL: http://citforum.ru/security/articles/analysis/(дата обращения: 21.03.2012). References
1. Korobeinikov A.G., Kuvshinov S.S. Cistema skrytoi peredachi soobshchenii v graficheskikh izobrazheniyakh formata JPEG//Nauchno-tekhnicheskii vest¬nik SPb GU ITMO– SPb: SPbGU ITMO, 2008.– vyp. 51.– s.152-159.
2. Analiz zaputyvayushchikh preobrazovanii programm//CIT Forum URL: http://citforum.ru/security/articles/analysis/(data obrashcheniya: 21.03.2012). |