В докладе представляется интегрированная среда (ИС) для изучения методов "обфускации"1) программ, разрабатываемая в Институте системного программирования РАН (Москва).
Под обфускацией программ понимается преобразование программы с целью максимально затруднить её анализ и модификацию.
К настоящему времени разработано около двух десятков различных обфускаторов (в основном Java-программ), среди которых есть и коммерческие. Развитые обфускаторы программ на языке Java, а так же обфускаторы программ на других языках программирования выполняют преобразования графа потока управления программы и её структур данных. Методы, используемые в таких обфускаторах, как правило, имеют эмпирический характер и слабо обоснованы теоретически. В работе [1] приведена классификация таких методов обфускации.
В последнее время интерес к задаче обфускации значительно вырос. Появились попытки формализации и теоретического обоснования задачи [2].
Поскольку теория обфускации сейчас находится в стадии активного формирования, кроме того, разрабатываются всё новые и новые эмпирические методы обфускации, возникла потребность в среде как наборе инструментов, которая выступает в роли "испытательного стенда" для проверки как теоретических положений, так и новых методов обфускации.
Цель разработки - получить удобную и мощную ИС для исследования методов и алгоритмов преобразования программ. С её помощью можно быстро получить прототип нового обфускирующего преобразования программ, проверить его устойчивость против разнообразных известных методов анализа, либо проверять устойчивость уже существующих алгоритмов обфускации.
ИС для изучения обфускации программ содержит полный набор инструментов, с помощью которых можно анализировать методы обфускации программ и сами обфускированные программы, в особенности инструменты для динамического и статистического анализа программ.
ИС строится вокруг единого внутреннего представления программ MIF. Трансляторы с входных языков (в настоящее время это Си, планируется транслятор с языка Java) преобразуют входную программу во внутреннее представление. Анализаторы (построение SSA, построение графа зависимостей по данным, построение "слайсов" программы и пр.) позволяют анализировать программы. Преобразователи позволяют строить новый метод обфускации из уже имеющихся в системе компонент, добавлять новые компоненты обфускации в систему. Генераторы позволяют получить программу на выходном языке (в настоящее время это Си) по внутреннему представлению. Программа может быть подвергнута инструментализации для последующего сбора трасс. Инструментированную программу можно выполнить на наборе тестов, причём каждый тест может быть подан программе произвольное количество раз, собранная информация может быть проанализирована с помощью анализатора трасс, результатом анализа является "очищенный" граф потока управления программы, по которому можно перестроить анализируемую программу.
В настоящее время получили широкое распространение системы программирования, такие как Java, которые транслируют программы не в машинный код, а в язык виртуальной машины, причём оттранслированная программа сохраняет много информации об исходной программе вплоть до имён локальных объектов и отступов. Получить исходное представление программы на языке Java в этом случае не представляет никакого труда. На настоящий момент существует несколько различных декомпиляторов для языка Java. Всё это делает программы на Java практически беззащитными перед возможной модификацией.
Для других языков программирования, таких как Си/Си++ и др. разработаны достаточно мощные методы обратной инженерии, которые позволяют по тексту программы автоматически восстановить её проектную документацию.
Такое положение дел не может устраивать разработчиков программного обеспечения, и в качестве одного из способов борьбы с этим рассматривается обфускация программ. Под обфускацией понимается преобразование программы с целью максимально затруднить её анализ и модификацию.
К настоящему времени разработано около двух десятков различных обфускаторов Java-программ, среди которых есть и коммерческие. Простые обфускаторы удаляют таблицы символов и отладочную информацию из скомпилированных классов и заменяют исходные имена методов бессмысленными короткие именами. В результате размер файлов уменьшается на 50%, а скорость выполнения значительно возрастает, поэтому такая обфускация может рассматриваться как один из способов оптимизации программ.
Более развитые обфускаторы программ на языке Java, а так же обфускаторы программ на других языках программирования выполняют преобразования графа потока управления программы и её структур данных. Методы, используемые в таких обфускаторах, как правило, имеют эмпирический характер и слабо обоснованы теоретически. В работе [1] приведена классификация всех таких методов обфускации.
В последнее время интерес к задаче обфускации значительно вырос. Появились попытки формализации и теоретического обоснования задачи. Так, в работе [2] авторы дают несколько возможных формальных определений обфускации, но при данных ими формулировках доказывают, что полная обфускация программы невозможна.
Появились работы, которые предлагают новые методы обфускации и дают их теоретическое (с точки зрения теории сложности) обоснование. В них показывается, что обратное преобразование, проводимое с помощью методов статического анализа программ, является вычислительно сложным. Однако остается открытым вопрос об устойчивости методов обфускации против методов динамического анализа.
В работе [3] рассматривается метод обфускации программ на Си, основанный на преобразовании графа потока управления в "плоский" граф, где для передачи управления от одного базового блока к другому используется "диспетчер", который вычисляет номер следующего базового блока по номеру текущего, логическим условиям и, возможно, некоторой дополнительной информацией. Для повышения стойкости метода к статическому анализу предлагается использовать алиасы (например, указатели и арифметику указателей). Известно, что точный статический анализ алиасов является NP-трудной задачей, из чего делается вывод что метод устойчив против статического анализа программ..
Похожий метод применён в алгоритме фирмы Cloakware Corp. (Канада), теоретическое исследование которого проводилось в Институте системного программирования [4]. Показывается, что восстановление исходной программы требует решения вычислительно-сложной задачи.
Ваши комментарии |
[Головная страница] [Конференции] [СО РАН] |
© 2001, Сибирское отделение Российской академии наук, Новосибирск
© 2001, Объединенный институт информатики СО РАН, Новосибирск
© 2001, Институт вычислительных технологий СО РАН, Новосибирск
© 2001, Институт систем информатики СО РАН, Новосибирск
© 2001, Институт математики СО РАН, Новосибирск
© 2001, Институт цитологии и генетики СО РАН, Новосибирск
© 2001, Институт вычислительной математики и математической геофизики СО РАН, Новосибирск
© 2001, Новосибирский государственный университет
Дата последней модификации Sunday, 23-Sep-2001 21:03:28 NOVST