Автоматизация переноса Си/Си++-приложений на новые платформы тема диссертации и автореферата по ВАК РФ 05.13.11, кандидат наук Курмангалеев, Шамиль Фаимович
- Специальность ВАК РФ05.13.11
- Количество страниц 102
Оглавление диссертации кандидат наук Курмангалеев, Шамиль Фаимович
Оглавление
Введение
1 Обзор работ
1.1 Методы распространения ПО
1.1.1 Виртуальная машина HotSpot
1.1.2 DalvikVM
1.1.3 Dot net framework и платформа mono
1.1.4 Универсальные исполняемые файлы
1.1.5 Portable Native Client
1.2 Методы запутывания программ
1.2.1 Изменение имен идентификаторов
1.2.2 Контролируемые исключения
1.2.3 «Краденые» байты
1.2.4 Сторожевые страницы
1.2.5 Сокрытие импортируемых функций
1.2.6 Виртуальные машины
1.2.7 Особенности работы средств анализа кода
1.2.8 Требования, предъявляемые к запутывающим преобразованиям
2 Двухфазная компиляция
2.1 Схема функционирования
2.1.1 Сервер приложений
2.2 Описание модификаций в стандартных инструментах
2.2.1 Изменения в компиляторе Clang
2.2.2 Изменения в компоновщике
2.2.3 Динамический выбор уровня оптимизаций
2.2.4 Оптимизация работы ключевых частей инфраструктуры
3 Оптимизации
3.1 Машинно-независимые оптимизации
3.1.1 Сбор и обработка профиля выполнения программы
3.1.2 Открытая вставка функций
3.1.3 Клонирование блоков
3.1.4 Вынос "холодных" участков кода в отдельные функции
3.1.5 Спекулятивная девиртуализация
3.1.6 Формирование суперблоков
3.2 Машинно-зависимые оптимизации
3.2.1 Использование команд предвыборки при обработке массивов в цикле
3.2.2 Модификация алгоритма распределения регистров
4 Переносимость биткода LLVM
4.1 Проблемы, препятствующие переносимости
4.1.1 Несовместимость ABI
4.1.2 Оператор «sizeof»
4.1.3 Встраиваемый ассемблер
4.2 Методы обеспечения переносимости
4.2.1 Несовместимость ABI
4.2.2 Переносимая версия оператора «sizeof»
5 Методы запутывания кода
5.1 Критерии эффективности методов обфускации
5.2 Предлагаемые методы
5.2.1 Перенос локальных переменных в глобальную область видимости
5.2.2 Шифрование строк
5.2.3 Вставка фиктивных циклов
5.2.4 Преобразование диспетчер
5.2.5 Переплетение функций
5.2.6 Сокрытие вызов функций
5.2.7 Генерация несводимых участков в графе потока управления
5.2.8 Разбиение констант
5.2.9 Клонирование функций
5.2.10 Формирование непрозрачных предикатов
5.2.11 Зависимость от ключа пользователя
5.3 Оценка понижения быстродействия и потребляемой памяти
Заключение
Литература
Рекомендованный список диссертаций по специальности «Математическое и программное обеспечение вычислительных машин, комплексов и компьютерных сетей», 05.13.11 шифр ВАК
Разработка стратифицированных методик создания и вложения устойчивого к атакам декомпиляцией и обфускацией цифрового водяного знака в байт-код class-файлов java-приложений и информационных систем2024 год, кандидат наук Шариков Павел Иванович
Методы декомпиляции объектного кода Delphi2017 год, кандидат наук Михайлов, Андрей Анатольевич
Программные методы повышения производительности архитектуры picoJava-II2002 год, кандидат технических наук Лунев, Сергей Александрович
Метод и средства защиты исполняемого программного кода от динамического и статического анализа2014 год, кандидат наук Аранов, Владислав Юрьевич
Разработка методик защиты программ от анализа и модификации на основе запутывания кода и данных2009 год, кандидат технических наук Щелкунов, Дмитрий Анатольевич
Введение диссертации (часть автореферата) на тему «Автоматизация переноса Си/Си++-приложений на новые платформы»
Введение
На сегодняшний день всё более популярной становится схема распространения программного обеспечения (ПО) через Интернет-магазины приложений. Самыми известными такими магазинами являются Apple Арр Store [5] (более 900 ООО приложений), Google Play [6] (более 800 ООО приложений), Microsoft Store [7] (более 115 ООО приложений).
Процесс распространения ПО состоит в следующем: разработчик передаёт программный продукт владельцу магазина приложений, приложение размещается в интернет-магазине и становится доступным пользователю. Чтобы программный продукт оставался конкурентоспособным в течение длительного времени, разработчику необходимо обеспечивать функционирование приложения на большинстве программно-аппаратных платформ, поддерживаемых данным магазином приложений, добавляя поддержку новых платформ, в том числе оптимизировать программный продукт под новые версии ОС, модификации аппаратуры и др. Эта проблема особенно актуальна в связи со стремительным развитием мобильных платформ (обновление каждые несколько месяцев).
Как правило, эта проблема решается следующим образом: приложение или компилируется и оптимизируется разработчиком повторно для каждой новой платформы, с последующим добавлением в магазин новой версии бинарного кода, или реализуется с использованием динамических языков. Так для разработки приложений, не требующих контроля над доступными ресурсами, достаточно применения HTML 5 [8] в совокупности с JavaScript [9]. В данном случае разработчику не нужно реализовывать поддержку самих платформ, однако требуется обеспечивать совместимость с наиболее популярными браузерами, используемыми на этих платформах.
При применении JavaVM [10] приложение распространяется в промежуточном представлении. Переносимость достигается ценой потери производительности из-за использования дополнительного слоя абстракции, скрывающего реальное оборудование от исполняемой программы. В этом случае для обеспечения приемлемого уровня производительности дополнительно
применяются динамические оптимизации на целевой архитектуре во время исполнения приложения, в том числе оптимизации, учитывающие профиль исполнения программы. Примером использования такого подхода для мобильных платформ может служить Java со специальной версией виртуальной машины Dalvik VM [11] для Android [12], или С# в сочетании с виртуальной машиной, разрабатываемой в рамках проекта Mono для мобильной игровой платформы PS Vita [13].
Однако, использование динамически компилируемых языков не всегда обеспечивает приемлемые характеристики приложений, особенно в контексте минимизации энергопотребления. Разработка на традиционных языках (например, Си/Си++) позволяет учитывать особенности платформ, используя машинно-зависимые оптимизации (распределения регистров, планирования и конвейеризации кода, векторизации), выигрыш от применения которых может достигать нескольких десятков процентов. По этой причине производитель предоставляет Native SDK, позволяющий использовать такие языки. Вместе с тем, разработка приложений на традиционных языках и их распространение через магазины приложений требуют существенных дополнительных накладных расходов разработчиков на перенос приложений, в связи с необходимостью поддержки большого количества различных платформ. Это серьезно ограничивает количество приложений, разрабатываемых на традиционных языках.
В настоящее время активно ведутся работы по автоматизации переноса приложений на языках Си/Си++ на различные платформы. Эти работы базируются на идее компилирования Си/Си-н--приложений в промежуточное представление и их распространение по аналогии с приложениями на динамических языках. Наиболее интересные результаты получены компанией Google, которая разрабатывает проект Portable Native Client [14], имеющий целью обеспечить запуск единой версии программы на архитектурах ARM и х86. Эта разработка рассчитана на небольшие приложения, работающие в браузере Chrome, и имеет ряд ограничений, в том числе ухудшение показателей производительности.
Кроме того, такой подход ставит особенно остро проблему защиты приложений от обратной инженерии, которая актуальна ввиду конкуренции разработчиков приложений и высокого уровня пиратства.
На сегодняшний день не существует инфраструктуры разработки и распространения приложений на языках Си/Си-н-, удовлетворяющей следующим требованиям:
1. Автоматизация переноса Си/Си++-приложений на новые платформы с
сохранением показателей производительности;
2. Сохранение процесса разработки ПО, принятого у пользователя;
3. Защита ключевых участков кода от обратной инженерии.
Таким образом, тема развития методов автоматизации переноса Си/Си++ приложений на новые платформы, которой посвящена диссертация, является актуальной.
Целью диссертационной работы является исследование и разработка методов статического и динамического анализа программ и соответствующей компиляторной инфраструктуры, обеспечивающих возможность разрабатывать и распространять Си/Си++-приложения, удовлетворяя сформулированным требованиям 1-3.
Научная новизна.
Научной новизной обладают следующие результаты:
1. Метод двухфазной компиляции Си/Си++-приложений, позволяющий разделить фазу генерации машинно-независимого внутреннего представления и фазу генерации кода для целевой платформы, на которой обеспечивается автоматический учет особенностей конкретной аппаратуры и окружения.
2. Методы машинно-независимой оптимизации, учитывающие данные профиля программы: открытая вставка функций, клонирование базовых блоков, вынос редко исполняемого кода в функции, спекулятивная девиртуализация функций языка Си++, формирование суперблоков. Методы машинно-зависимой оптимизации, учитывающие специфику конкретной платформы: автоматическая
генерация команд предвыборки, модификация алгоритма распределения регистров.
3. Методы запутывания программного кода: перенос локальных переменных в глобальную область видимости, шифрование строк, вставка фиктивных циклов, преобразование «диспетчер», переплетение функций, сокрытие вызовов функций, генерация несводимых участков в графе потока управления, клонирование функций, разбиение констант.
Практическая значимость. Разработанная компиляторная инфраструктура позволяет создать «облачное хранилище» приложений нового поколения, обеспечивающее, с одной стороны, переносимость программ в рамках семейства ARM, а с другой стороны, высокую степень защищенности приложений за счет использования методов запутывания. Разработанные программные средства и методы используются в научно-исследовательских и коммерческих организациях. Предложенное изменение в алгоритме распределения регистров одобрено сообществом разработчиков LLVM для включения в основную ветвь разработки в апреле 2012. Разработанный метод распространения приложений реализован и внедрен в рамках мобильной промышленной платформы Tizen.
Апробация работы и публикации. По теме диссертации опубликованы 4 работы [1-4] в изданиях из перечня ВАК. Основные результаты также представлены в докладах на следующих конференциях:
• 5 5-ая научная конференция МФТИ. 19-25 ноября 2012
г.Долгопрудный.
• «РусКрипто'2013», 27 — 30 марта 2013 года, Московская область,
Солнечногорский р-н, ГК «Солнечный Park Hotel & SPA»
Краткое содержание работы
Диссертация состоит из введения, 5 глав, заключения. Работа изложена на 102 страницах. Список источников насчитывает 73 наименования. Диссертация содержит 8 таблиц и 28 рисунков.
Глава 1 посвящена обзору работ, имеющих непосредственное отношение к теме диссертации. Рассматриваются существующие подходы к решению задачи распространения ПО на различных платформах. А также приводится обзор методов запутывания программ, формулируются правила, которым необходимо следовать при запутывании программ. В главе 2 рассматривается предлагаемый метод двухфазной компиляции, описывается схема функционирования предлагаемого решения, обеспечивающего распространение программ, написанных на языках высокого уровня Си/Си++, в промежуточном представлении компиляторной инфраструктуры LLVM [15]. Кроме того описываются изменения, внесенные в компилятор переднего плана и компоновщик. В главе 3 рассматриваются предложенные методы оптимизации. Приводится описание машинно-независимых оптимизации, учитывающих данные профиля программы: открытая вставка функций, клонирование базовых блоков, вынос редко исполняемого кода в функции, спекулятивная девиртуализация функций языка Си++, формирование суперблоков. Затем описываются методы машинно-зависимой оптимизации, учитывающие специфику конкретной платформы: автоматическая генерация команд предвыборки, модификация алгоритма распределения регистров. В главе 4 рассматриваются проблемы связанные переносимостью биткода LLVM. Описываются выявленные проблемы, переносимости биткода LLVM между архитектурами х86 и ARM, рассматриваются методы решения проблем, связанных с переносимостью биткода LLVM. В главе 5 описываются методы, обеспечивающие запутывание ключевых участков кода. Рассматриваются критерии эффективности методов обфускации, описываются предлагаемые методы запутывания кода. Кроме того, производится оценка понижения быстродействия и увеличения потребляемой памяти, приводятся результаты применения средств статического и динамического анализа к программе, запутанной с помощью предлагаемых методов. Заключение содержит выводы и направления дальнейших исследований по проблемам, рассмотренным в работе.
1 Обзор работ
Один из вариантов решения проблемы - это использование дополнительного слоя абстракции (Java, С#): программа компилируется в код виртуальной машины. При этом разработчик обеспечивает функционирование виртуальной машины на различном программно-аппаратном обеспечении. Виртуальная машина может как интерпретировать код клиентского ПО, так и обеспечивать его динамическую компиляцию. Ниже приведен обзор существующих подходов к решению задачи распространения ПО на различных платформах.
1.1 Методы распространения по
1.1.1 Виртуальная машина HotSpot
Виртуальная машина Hotspot [16] - это стековая машина, исполняющая Java-байт-код. Так как в Java поддерживаются потоки, в виртуальной машине есть локальная память для конкретного потока, и общая, разделяемая всеми потоками. Объекты программы размещаются на общей куче, причем выделенные объекты не могут быть удалены пользователем. Перед тем, как метод класса будет выполнен, класс должен быть загружен в память виртуальной машины. Байт-код класса загружается в общую область памяти, называемую method area, также в общем доступе находятся константы. В локальной памяти потока находится счетчик команд, указывающий на текущую команду в области методов, и собственный стек, содержащий фреймы методов, вызываемых в потоке. Фрейм же хранит информацию об окружении, в том числе ссылку на фрейм вызвавшего его метода, а также область локальных переменных, часть которых является ссылкой на объекты, хранимых в куче, и, наконец, стек операндов - рабочее пространство метода. У каждого потока есть область памяти для быстрого размещения объектов.
Виртуальная машина Hotspot начинает свою работу с загрузки внутренних структур и инициализации переданных ей пользователем параметров, создается поток виртуальной машины, создается основной поток, загружается класс, определенный пользователем как main, вызывается main-метод этого класса.
Hotspot поддерживает технологию динамической компиляции или компиляции на лету (JIT - just-in-time), почти без задержки выполняя загруженную программу. В рассматриваемой виртуальной машине это достигается за счет совместного использования интерпретатора и компилятора: байт-код исполняется интерпретатором сразу после загрузки, а компиляция производится только для так называемых "горячих" методов, которые особенно долго или особенно часто исполняются виртуальной машиной. Вообще говоря, определение горячего метода является непростой задачей и в разных виртуальных машинах реализовано по-разному.
Особенностью виртуальной машины HotSpot является наличие двух совершенно разных компиляторов - клиентского (Client compiler) и серверного (Server compiler). Выбор того или другого лежит на пользователе, запускающем виртуальную машину, и зависит от типа приложения. Для тяжеловесных серверных приложений больше подходит серверный компилятор — он обеспечивает наибольшую оптимизацию кода, но время запуска метода будет довольно большим. Для небольших приложений на стороне клиента, где требуется быстрый запуск, клиентский компилятор будет более уместен.
1.1.1.1 Поддержка JIT в HotSpot
Поддержка технологии JIT в виртуальной машине Hotspot производится за
счет комбинирования интерпретатора и компилятора, что дает малое время запуска и оптимальное выполнение особенно трудоемких мест программы. После загрузки всякий метод сначала интерпретируется, поэтому виртуальная машина может собрать информацию об этом методе. Интерпретация инструкций байт-кода происходит на основе шаблонов.
Компиляция и интерпретация производятся в двух раздельных потоках, стартующих при запуске виртуальной машины. Для определения того, какой метод нужно откомпилировать, виртуальная машина использует счетчики вызовов.
При динамической компиляции используются следующие оптимизации: удаление сравнений с null, алгебраическое упрощение, удаление общих
подвыражений, распространение констант, удаление мертвого кода, развертывание циклов, векторизация циклов, открытая вставка функций (inlining) и другие.
1.1.2 DalvikVM
Виртуальная машина Dalvik — регистровая машина, разработанная с целью обеспечить эффективную работу на мобильных платформах. Байт-код Java приложений преобразуется в набор инструкций используемых Dalvik. Программы распространяются в ".dex" формате, файлы могут содержать несколько классов. Константы и строки, используемые в нескольких классах, будут включены в файл только один раз. DEX файлы отображаются между процессами в режиме «только для чтения». Порядок байт и выравнивание машинных слов корректируются в соответствии с локальной системой. Проверка байт-кода обязательна для всех классов. Оптимизации, требующие переписывания байт-кода, должны быть выполнены заранее.
Виртуальная выполняет основные оптимизации перед первым исполнением кода. Оптимизатор выполняет следующие операции:
• Для виртуальных вызовов, заменяет индекс метода на индекс в таблице виртуальных функций
• Для операций get/put индекс поля, заменяется смещением в байтах. Кроме этого, типы Boolean/byte/char/short объединяются в единую 32 битную форму.
• Встраивание функций, таких как String.length()
• Удаление пустых методов. Простейший пример это Objecct.<init>, который ничего не делает и вызывается каждый раз, когда объект размещается в памяти.
• Подготовка предрасчитанных данных. Например, виртуальная машина требует наличия хэш таблицы для поиска по имени класса. Вместо расчета таблицы при каждой загрузке программы, мы вычисляем его
один раз, экономя память и процессорное время, для каждой машины в которую загружен данный DEX файл.
Текущая реализация Dalvik включает три различных интерпретатора "fast", "portable", "debug", "fast" версия оптимизированы под текущую платформу и может содержать ассемблерные вставки, оптимизированные вручную. Версия "portable" написана на Си и должна работать на нескольких платформах, "debug" версия - это вариант "portable", с поддержкой профилирования и пошагового исполнения. Помимо интерпретатора с версии Android 2.2 имеется поддержка динамической компиляции. Во время динамической компиляции применяются оптимизации: удаление излишних загрузок и избыточных сравнений с null, эвристическое планирование инструкций, вынос инвариантного кода из циклов и другие.
1.1.3 Dot net framework и платформа mono
Целью разработки .Net framework являлось создание безопасной среды исполнения программ, облегчающей развертывание программ, и обеспечивающей возможность эффективного выполнения кода. .Net framework состоит из двух основных компонентов: из виртуальной машины (CLR - common language runtime) и библиотеки классов.
Языки программирования, такие как С#, VB.NET компилируются в промежуточное представление называемое CIL (Common Intermediate Language), которое выполняется на виртуальной машине CLR. Существует открытая спецификация Common Language Infrastructure (CLI) описывающая исполняемый код и среду времени выполнения. Мультиплатформенной реализацией стандарта CLI является проект Mono, обеспечивающий поддержку ОС Windows, Linux, семейства BSD и большое количество аппаратных платформ (х86, LA-64, ARM, PowerPC и др.).
Mono [17] поддерживает интерпретацию, динамическую компиляцию и предварительную компиляцию. Интерпретатор используется на ранних стадиях
разработки и не используется после реализации динамической компиляции для нужной архитектуры.
Во время динамической компиляции выполняется распространение констант и копий, удаление мертвого кода, оптимизация переходов, удаление избыточного кода. Кроме того, реализована экспериментальная поддержка LLVM в качестве динамического компилятора.
Предварительная компиляция работает в два этапа. На первом этапе происходит компиляция программы. На втором этапе система времени выполнения Mono загружает прекомпилированный код. Такой подход позволяет уменьшить задержку при запуске программы, сократить накладные расходы на компиляцию библиотек, разделяемых между экземплярами Mono в системе, а также позволяет выполнить дополнительные оптимизации.
1.1.4 Универсальные исполняемые файлы
Концепция универсальных исполняемых файлов предполагает распространение программы в виде одного файла, содержащего несколько вариантов бинарного кода для разных архитектур. Системный загрузчик передает управление на нужную версию кода. Плюсом подобного подхода является сохранение производительности приложений, минусами - жестко фиксированный набор архитектур. При смене аппаратного обеспечения, используемого в разных поколениях платформы, использование универсальных исполняемых файлов для обеспечения переносимости позволяет отказаться от использования эмуляции, что позволяет избежать потери производительности.
Наиболее распространенными реализациями данной концепции являются Fat binary, Universal binary от Apple, FatELF для Linux, combined binaries for CP/M-80 and DOS.
1.1.5 Portable Native Client
Portable Native Client (pNaCl) [18] является развитием технологии Native Client (NaCl), цель которой - обеспечить выполнение бинарного кода в браузере и обеспечить переносимость между различными ОС. Программы,
скомпилированные для NaCl, не могут вызывать сервисы операционной системы, только специальные сервисы, предоставляемые защищенным окружением.
Приложения Native Client обычно состоят из комбинации JavaScript, HTML, CSS и модуля Native Client. На текущий момент имеется поддержка языков Си/Си++.
Технология имеет следующие ограничения:
• не поддерживаются аппаратные исключения;
• не поддерживается создание процессов;
• нет доступа к "сырым" (raw) TCP/UDP сокетам;
• невозможно запросить информацию о количестве доступной памяти;
• ассемблерные вставки, должны удовлетворять правилам верификатора;
Контроль за выполнением приложений происходит в два этапа, на первом
этапе скомпилированный модуль дизассемблируется и проходит проверку на соответствие требованиям NaCl. Поскольку анализ бинарных модулей может быть затруднен с помощью техник самомодификации кода или перекрывающихся инструкций, к коду приложений предъявляется ряд требований, обеспечивающих корректное дизассемблирование всех достижимых инструкций программы. На втором этапе код запускается внутри защищенного окружения. Использование сегментной модели памяти на х86 позволяет значительно упростить проверки, необходимые для ограничения доступа к памяти, что позволяет снизить накладные расходы. Служебные библиотеки времени выполнения помещаются в тот же процесс, что запускаемый модуль NaCl, с использованием специального механизма, обеспечивающего безопасную передачу управления между доверенным и недоверенным кодом.
Portable Native Client разрабатывается с целью:
• Предоставить платформонезависимое представление, обеспечивающее переносимость скомпилированных модулей между архитектурами, без перекомпиляции из исходных кодов.
• Облегчить создание, тестирование и развертывание переносимых модулей, для NaCl разработчиков.
• Поддержка ARM, 1А-32,х86_64 на начальном этапе, а также других популярных CPU общего назначения в будующем
• Сохранение свойств безопасности и производительности NativeClient
Технология pNaCl подразумевает распространение приложений в виде одного
модуля, содержащего промежуточное представление LLVM, называемое биткод (bitcode). Компиляция в машинный код происходит непосредственно на машине клиента, где оно транслируется в формат NaCl, проверяется на соответствие ограничениям и запускается.
Предлагаемые подходы могут использоваться для распространения программ, но обладают существенными ограничениями:
1. Использование дополнительного уровня абстракции понижает быстродействие, увеличивает потребление ресурсов системы. В силу ограничений, налагаемых на код пользовательских программ в целях сохранения переносимости и обеспечения безопасности, затрудняется или становится невозможной прямая работа с системными библиотеками, что также ведет к понижению быстродействия.
2. Рассмотренные методы не предполагают сохранения существующего процесса разработки ПО, кроме того, объединение в одном файле бинарного кода для разных платформ на практике не позволяет учесть особенности конкретной программно-аппаратной платформы, поскольку версии кода генерируются в рамках всей архитектуры, и обязаны функционировать на всем семействе процессоров.
Важным требованием для распространения ПО является предоставление средств защиты от обратной инженерии.
1.2 Методы запутывания программ
Запутывание программ позволяет решать следующие задачи:
• Защита от обратной инженерии. Если ключевые фрагменты программы будут запутаны, то для восстановления алгоритмов работы понадобится приложить гораздо больше усилий.
• Повышение устойчивости программ к атакам, связанным с эксплуатацией уязвимостей. Если для одного исходного кода, будет существовать несколько вариантов двоичного образа, то, даже в случае нахождения и эксплуатации уязвимости для одной из копий программы код, эксплуатирующий найденную уязвимость, может утратить свою работоспособность на других бинарных образах, поскольку изменятся адреса и расположение функций в программе.
• Автоматическая простановка водяных знаков, является следствием различий бинарных образов, для разных клиентов. Это может быть полезно для идентификации пользователя, по вине которого произошла утечка программы.
В настоящий момент для компилируемых языков существует два основных метода запутывания программ: запутывание на уровне исходного кода и запутывание бинарного кода приложения. Большой популярностью пользуется второй метод, существует большое количество коммерческих разработок (StarForce, Themida и т.д.). Но такой подход требует декомпиляции приложения, что связано с определенными трудностями и накладывает дополнительные ограничения на проводимые преобразования.
Особенно остро стоит проблема запутывания для программ, написанных на Java, С#. Поскольку такие программы распространяются в промежуточном представлении, то обычно восстановление алгоритма работы не представляет существенных трудностей. Поэтому разработчики прибегают к запутыванию программ, более того для платформы .NET в состав среды разработки включен инструмент Dotfuscator, который производит запутывание программ с целью затруднения их декомпиляции.
В работах [19],[20], [21] приведен обзор существующих техник запутывания кода и описан подход к измерению их сложности. В [19] приведено формальное определение понятия обфускации, или запутывающего преобразования:
Преобразование Р —> Р'является запутывающим; если исходная программа Р и запутанная Р' имеют одинаковое наблюдаемое поведение, при этом должны соблюдаться условия:
•Если программа Р не завершается или завершается с ошибкой, программа Р' может завершаться или не завершаться
•В противном случае, Р' должна завершаться и генерировать выходные данные аналогичные генерируемым программой Р.
Колберг [19] разделяет запутывающие преобразования на 4 группы: •Преобразования форматирования (текста программы), которые изменяют только внешний вид программы. К этой группе относятся преобразования, удаляющие комментарии, изменяющие форматирование текста программы или переименовывающие идентификаторы.
•Преобразования структур данных, изменяющие структуры данных, с которыми работает программа.
•Преобразования потока управления программы, которые изменяют структуру её графа потока управления, такие как развёртка циклов, выделение фрагментов кода в процедуры и другие.
•Превентивные преобразования, нацеленные против определённых методов декомпиляции программ или использующие ошибки в определённых инструментальных средствах декомпиляции.
По времени применения преобразований можно выделить два класса обфускации:
• Статическая обфускация - Преобразования выполняются до запуска программы
Похожие диссертационные работы по специальности «Математическое и программное обеспечение вычислительных машин, комплексов и компьютерных сетей», 05.13.11 шифр ВАК
Применение диверсифицирующих преобразований для защиты от эксплуатации уязвимостей2021 год, кандидат наук Нурмухаметов Алексей Раисович
Методы и средства эквивалентного преобразования программ на основе переносимой среды выполнения2020 год, кандидат наук Логинов Иван Павлович
Стеганографическое встраивание информации в память исполняемого кода и код веб-страницы2024 год, кандидат наук Мунько Сергей Николаевич
Математические модели и алгоритмы распознавания упакованных вредоносных программ2013 год, кандидат наук Сорокин, Иван Витальевич
Метод динамической компиляции SQL-запросов для реляционных СУБД2022 год, кандидат наук Бучацкий Рубен Артурович
Список литературы диссертационного исследования кандидат наук Курмангалеев, Шамиль Фаимович, 2013 год
Литература
1. А. И. Аветисян, К. Ю. Долгорукова, Ш. Ф. Курмангалеев. Динамическое профилирование программы для системы LLVM. // Труды Института системного программирования РАН, том 21,2011, с. 71-82.
2. Ш. Ф. Курмангалеев, В. П. Корчагин, Р. А. Матевосян. Описание подхода к разработке обфусцирующего компилятора. // Труды Института системного программирования РАН, том 23, 2012, с. 67-76.
3. Ш. Ф. Курмангалеев, В. П. Корчагин, В. В. Савченко, С. С. Саргсян. Построение обфусцирующего компилятора на основе инфраструктуры LLVM. // Труды Института системного программирования РАН, том 23, 2012, с. 77-92.
4. Курмангалеев Ш. Ф. Методы оптимизации C/C++- приложений распространяемых в биткоде LLVM с учетом специфики оборудования. // Труды Института системного программирования РАН, том 24,2013, с. 127-144.
5. Apple Арр Store. URL: http://store.apple.com/us
6. Google Play. URL: https://play.google.com/store
7. Microsoft Store. URL: http://www.windowsstore.com/
8. HTML 5. A vocabulary and associated APIs for HTML and XHTML. W3C Candidate Recommendation 6 August 2013. URL: http://www.w3.org/TR/htm!5/
9. Standard ECMA-262. ECMAScript® Language Specification. URL: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
10. The Java® Virtual Machine Specification. URL: http://docs.oracle.com/iavase/specs/ivms/se7/html/
11. Dalvik. URL: https://code.google.eom/p/dalvik/
12. Android. URL: http://www.android.com/
13. PlayStation® Mobile SDK. URL: http://developer.sonymobile.com/knowledge-base/sdks/playstation-mobile-sdk/
14. Portable Native Client Introduction. URL: http://www.chromium.org/nativeclient/pnacl/building-and-testing-portable-native-client
15. Chris Lattner. LLVM: An Infrastructure for Multi-Stage Optimization.// Master's thesis, Computer Science Dept., University of Illinois at Urbana-Champaign, Urbana, IL, 61 pages.
16. HotSpot runtime overview, http://openjdk.java.net/
17. Mono. URL: http://www.mono-project.com/What is Mono
18. Portable Native Client Introduction. http://www.chromium.org/nativeclient/pnacl/building-and-testing-portable-native-client
19. С. Collberg, С. Thomborson, D. Low. A Taxonomy of Obfuscating Transformations. Departament of Computer Science, The University of Aukland, 1997. URL:
http://www.cs.arizona.edu/~collberg/Research/Publications/CollbergThomborsonLow97 a
20. Christian Collberg. Jasvir Nagra Surreptitious Software: Obfuscation, Watermarking, and Tamperproofing for Software Protection. Addison-Wesley Professional. Pub. Date: July 24,2009. Print ISBN-10: 0-321-54925-2.
21. A.B. Чернов. Анализ запутывающих преобразований программ. Труды ИСП РАН, том 3,2002, стр. 7-38.
22. SoftwarePassport. URL:http://www.siliconrealms.com/
23. Peter Ferrie, Anti-Unpacker Tricks CARO Workshop, May 2008, URL: Amsterdam http://pferrie.tripod.com/papers/unpackers.pdf
24. VMProtect. URL: http://vmpsoft.com/
25. Themida. URL: http://www.oreans.com/themida.php
26. Simon Moll. Decompilation of LLVM IR. B.Sc. Thesis, Saarland University, 2011.
27. Щелкунов Дмитрий Анатольевич. Разработка методик защиты программ от анализа и модификации на основе запутывания кода и данных : диссертация ... кандидата технических наук : 05.13.19 / Щелкунов Дмитрий Анатольевич; [Место защиты: Моск. гос. техн. ун-т им. Н.Э. Баумана].- Москва, 2009.- 143 е.: ил. РГБ ОД, 61 09-5/1155
28. Ian Lance Taylor (2008). "ANew ELF Linker". GCC Developers' Summit 2008. pp. 129-136. Retrieved 2013-03-06.
29. GNU Binutils. URL: http://www.gnu.org/software/binutils
30. OpenSSL. URL: http://www.openssl.org/
31. Tizen. URL. http://www.tizen,org
32. Арутюн Аветисян, Андрей Белеванцев, Алексей Бородин, Владимир Несов. Использование статического анализа для поиска уязвимостей и критических ошибок в исходном коде программ. // Труды ИСП РАН том 21, 2011, стр. 23-38
33. Protocol Buffers. URL: https://developers.google.com/protocol-buffers/
34. Р. Жуйков, Д. Плотников, М. Варданян. Автоматическая настройка оптимизационных преобразований компилятора GCC для платформы ARM. // Труды Института системного программирования РАН, том 22,2012 г. Стр. 49-66.
35. К. Pettis, R. С. Hansen. Profile guided code positioning . SIGPLAN Not. 1990 June.Vol. 25, no. 6, pp. 16-27. http://dx.doi.org/10.1145/93548.93550.
36. P. P. Chang, S. A. Mahlke, W.-m. W. Hwu. Using profile information to assist classic code optimizations. Center for Reliable and High-Performance Computing. Urbana-Champaign: University of Illinois, 1991.
37. Da Silva, A. F. Our Experiences with Optimizations in Sun's Java Just-In-Time Compilers / Anderson F. Da Silva, Vitor S. Costa // Journal of Universal Computer Science. — 2006. — Vol. 12.
38. M. Arnold, Stephen J. Fink, D. Grove, M. Hind, Peter F. Sweeney. A Survey of Adaptive Optimization in Virtual Machines. IBM T. J. Watson Research Center, Hawthorne, USA,. 2004.
39. Stephen Fink, David Grove, Michael Hind. Dynamic Compilation and Adaptive Optimization in Virtual Machines. IBM, June 2004.
40. Holzle, U. Adaptive Optimization for SELF: Reconciling High Performance with Exploratory Programming: Ph. D. thesis / Stanford University. —1994. — http://research.sun.com/self/papers/hoelzle-thesis.ps.gz.
41. Introduction to the Autotools. URL: http://www.dwheeler.com/autotools/
42. Checklnstall. URL: http://asic-linux.com.mx/~izto/checkinstall
43. Doug Lea, A memory allocator. URL: http://g.oswego.edu/dl/html/malloc.html
44. Vinodha Ramasamy, Robert Hundt, Dehao Chen, Wenguang Chen. Feedback-Directed Optimizations in GCC with Estimated Edge Profiles from Hardware Event Proceedings of GCC Summit 2008. http://research.google.com/pubs/pub36576.html.
45. R. Levin, I. Newman, G. Haber. Complementing missing and inaccurate profiling using a minimum cost circulation algorithm. Proceedings of the 3rd international conference on High performance embedded architectures and compilers, HiPEAC'08, Berlin, Heidelberg: Springer-Verlag, 2008, pp. 291-304.
46. U. Zwick. The smallest networks on which the Ford-Fulkerson maximum flow procedure may fail to terminate. Theoretical Computer Science, 1995, Vol. 148.
47. R. Levin. Complementing Incomplete Edge Profile by applying Minimum Cost Circulation Algorithms. Master's thesis, University of Haifa, 2007. URL: http://www.cs.technion.ac.il/~royl/MscThesis_Final_Version_Submission.pdf.
48. Graphviz Documentation.URL: http://www.graphviz.org/Documentation.php
49. Мандель И. Д. Кластерный анализ. — М.: Финансы и статистика, 1988.
50. Peng Zhao "Code and Data Outlining", 2005.
51. Jun-Pyo Lee, Jae-Jin Kim, Soo-Mook Moon, Suhyun Kim "Aggressive Function Splitting for Partial Inlining", Seoul, South Korea, 2011.
52. David F. Bacon and Peter F. Sweeny, Fast Static Analysis of С++ Virtual Functuion Call, OOPSLA '96 Proceedings of the 11th ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications, ACM New York, NY, USA ©1996,Pages 324-341
53. Альфред В. Ахо, Моника С. Лам, Рави Сети, Джеффри Д. Ульман. Компиляторы: принципы, технологии и инструментарий. Второе издание. Москва, Вильяме, 2008.
54. К. Pettis, R. С. Hansen. Profile guided code positioning . SIGPLAN Not. 1990 June.Vol. 25, no. 6, pp. 16-27.URL: http://dx.d0i.0rg/l0.1145/93548.93550.
55. W.-m. W. Hwu, S. A. Mahlke, W. Y. Chen et al. The superblock: An effective technique for vliw and superscalar compilation. Journal of Supercomputing. 1993. URL: http://www.crhc.illinois.edu/IMPACT/ftp/iournal/isc.superblock.93.pdf
56. GCC. URL: http://gcc.gnu.org/
57. Youfeng Wu, James R. Larus. Static Branch Frequency and Program Profile Analysis. 27th International Symposium on Microarchitecture, 1994
58. Аветисян А.И. Двухэтапная компиляция для оптимизации и развертывания программ на языках общего назначения // Труды ИСП РАН - 2012. - Т. 22. -С.11-18.
59. Libffi A Portable Foreign Function Interface Library. http://sources.redhat.com/libffi/.
60. Чернов Александр Владимирович. Исследование и разработка методологии маскировки программ : Дис.... канд. физ.-мат. наук : 05.13.11 : Москва, 2003 133 с. РГБ ОД, 61:04-1/10-9
61. Е. I. Oviedo. Control flow, data flow, and program complexity. In Proceedings of IEEE COMPSAC, 1980, pp. 146-152.
62. Chenxi Wang, Jonathan Hill, John Knight, and Jack Davidson. 2000. Software Tamper Resistance: Obstructing Static Analysis of Programs. Technical Report. University of Virginia, Charlottesville, VA, USA., 18 pages
63. А. В. Чернов. Об одном методе маскировки программ. Труды ИСП РАН, том 4,2003,стр.85-119.
64. Thomas Ball and James R. Larus. Optimally profiling and tracing programs. In POPL '92: Proceedings of the 19th ACM SIGPLAN-SIGACT symposium on Principles
of programming languages, pages 59-70, New York, NY, USA, 1992. ACM. ISBN 089791-453-8
65. Omri Traub, Stuart Schechter, Michael D. Smith. Ephemeral Instrumentation for Lightweight Program Profiling.— 2000. www.eecs.harvard.edu/hube/publications/muck.pdf. Date retrieved: October 7, 2011.
66. Andrew Ayers, Richard Schooler, and Robert Gottlieb. Aggressive inlining. SIGPLANNot., 32(5): 134-145, 1997. ISSN0362-1340.
67. P. P. Chang and W.-W. Hwu. Inline function expansion for compiling С programs. In PLDI '89: Proceedings of the ACM SIGPLAN 1989 Conference on Programming language design and implementation, pages 246-257, New York, NY, USA, 1989. ACM. ISBN 0-89791-306-X.
68. Chris Lattner and Vikram Adve. LLVM: A compilation framework for lifelong program analysis and transformation. In Proceedings of the 2004 International Symposium on Code Generation and Optimization (CG004), March 2004
69. Dehao Chen, Neil Vachharajani, Robert Hundt, Xinliang Li, Stephane Eranian, Wenguang Chen, and Weimin Zheng. Taming Hardware Event Samples for Precise and Versatile Feedback Directed Optimizations. IEEE Transactions On Ccomputers, vol. 62, NO. 2, february 2013
70. Susan Horwitz, Thomas Reps, and David Binkley. 1990. Interprocedural slicing using dependence graphs. ACM Trans. Program. Lang. Syst. 12, 1 (January 1990), 2660.
71. Frank Tip. "A survey of program slicing techniques". Journal of Programming Languages, Volume 3, Issue 3, pages 121-189, September 1995.
72. David Binkley. 1993. Precise executable interprocedural slices. ACM Lett. Program. Lang. Syst. 2,1-4 (March 1993), 31-45.
73. М.Г. Бакулин, C.C. Гайсарян, Ш.Ф. Курмангалеев, И.Н. Дедовских, В.А. Падарян, С.М. Щевьева. Динамический анализ обфусцированных приложений с диспетчеризацией или виртуализацией кода. //Труды Института системного программирования РАН, том 23,2012 г.
Обратите внимание, представленные выше научные тексты размещены для ознакомления и получены посредством распознавания оригинальных текстов диссертаций (OCR). В связи с чем, в них могут содержаться ошибки, связанные с несовершенством алгоритмов распознавания. В PDF файлах диссертаций и авторефератов, которые мы доставляем, подобных ошибок нет.