Защита приложений от модификации: учебное пособие
Book information
Description
Целью данного учебного пособия является ознакомление студентов с основами защиты приложений от модификации. В пособии приведены начальные сведения о дизассемблировании, а также показаны различные подходы к изучению и отладке приложений, реконструкции алгоритмов, практические приемы работы с популярным инструментом дизассемблирования – IDA. Материал пособия разбит на три раздела. Каждый раздел содержит краткий теоретический материал и вопросы. Министерство образования и науки Российской Федерации ВВЕДЕНИЕ РАЗДЕЛ 1. ВВЕДЕНИЕ В ДИЗАССЕМБЛИРОВАНИЕ 1. ВВЕДЕНИЕ В ДИЗАССЕМБЛИРОВАНИЕ 1.1. Базовые понятия дизассемблирования Что такое дизассемблирование. Дизассемблирование – преобразование программы на машинном языке к ее ассемблерному представлению. Декомпиляция – получение кода языка высокого уровня из программы на машинном языке или ассемблере. Зачем нужно дизассемблирование. Цель инструментов дизассемблирования заключается в содействии исследованию функционирования программ, когда их исходные коды не доступны. Наиболее распространенные цели дизассемблирования: Анализ совместимости. Когда программы доступны только в виде исполняемых файлов, сторонним разработчикам крайне сложно обеспечить совместимость с ними своих программ, а также расширить их функциональность. Например, если производитель не предоставил д... Валидация компилятора. Дизассемблирование может быть средством для проверки соответствия работы компилятора его спецификации. Также исследователя может заинтересовать наличие дополнительных возможностей, оптимизирующих результат компиляции. С точки зр... Отладка. К сожалению, дизассемблеры, встроенные в отладчики, зачастую малоэффективны (OllyDbg ─ исключение). Они неспособны к серийному дизассемблированию и иногда отказываются дизассемблировать, не будучи в состоянии определить границы функции. Поэто... Как дизассемблировать. Типичные задачи, с которыми сталкивается дизассемблер: взять 100 КБ из исходного файла, отделить код от данных, преобразовать код к языку ассемблера, и главное ничего не потерять. В этот список можно добавить дополнительные поже... 1.2. Базовый алгоритм дизассемблирования 1.3. Алгоритм линейной развертки 1.4. Алгоритм рекурсивного спуска Команды, не влияющие на счетчик команд. После выполнения такой команды управление переходит непосредственно к следующей команде. Примерами такой команды может послужить арифметические, такие как add; Для подобных команд процесс дизассемблирования тако... Команды условного перехода. Команды условного перехода, такие как x86 jnz, образуют две возможных ветви исполнения. Поскольку в статическом контексте обычно невозможно определить исход проверки условия, алгоритм рекурсивного спуска дизассемблирует об... Команды безусловного перехода. Безусловные переходы приводят к нарушению последовательного порядка исполнения команд. Команда, получающая управление после выполнения безусловного перехода, может располагаться от него на значительном расстоянии. Кроме ... Команды вызова функции. Команды вызова функции работают сходным образом с командами безусловных переходов (включая невозможность определить адрес назначения команды, такой как call eax), за исключением того, что после выполнения функции, управление об... Команды возврата. В некоторых случаях, алгоритм рекурсивного спуска терпит неудачу. Команда возврата из функции (например, ret x86) не предоставляет информации о том, какая команда будет выполнена далее. Если бы программа была на самом деле запущена, ... 2. ИНСТРУМЕНТЫ ДИЗАССЕМБЛИРОВАНИЯ И РЕВЕРС ИНЖИНИРИНГА 2.1. Инструменты классификации file - стандартная утилита, имеющаяся в большинстве UNIX-подобных операционных систем, а также в среде Cygwin для Windows. file пытается определить тип файла по характерным для него особенностям. 2.2. Инструменты анализа nm. Целью утилиты nm является "извлечение таблицы имен из объектных файлов". Если использовать nm для анализа объектного файла (.о файл в отличие от исполняемого), то результатом работы программы станут имена всех функций и глобальных переменных, объя... ldd. При создании исполняемого файла, все ссылки программы на библиотечные функций должны быть разрешены. У линкера есть два способа разрешения вызовов функций: статическое и динамическое связывание. Objdump. Назначение objdump - "отображать информацию из объектных файлов." Для решения этой задачи objdump предоставляет огромное количество (30+) опций командной строки. Программа objdump может быть использована для отображения следующих типов данных... c++filt. В объектном файле не может содержаться двух функций с одинаковым именем. Для осуществления перегрузки функций компилятор генерирует для них новые имена, используя информацию о типе их аргументов. Процесс создания уникальных имен для перегружа... 2.3. Инструменты глубокого исследования Дизассемблеры. Однажды вы столкнетесь с бинарными файлами, которые не соответствуют широко распространенным стандартам. В таком случае вам понадобятся инструменты способные начать процесс дизассемблирования со смешения указанного пользователем. РАЗДЕЛ 2. ОСНОВЫ ИСПОЛЬЗОВАНИЯ IDA 3. НАЧАЛО РАБОТЫ С IDA 3.1. Запуск IDA Загрузка файла в IDA. Если вы решите открыть файл, используя команду File ► Open. IDA генерирует список потенциальных типов файлов и отображает этот список вверху диалога. Список показывает, какие загрузчики IDA лучше всего подходят для работы с выбра... Файлы баз данных IDA. Когда вы будете довольны опциями загрузки, то нажмите ОК, чтобы закрыть диалог (или Finish). После этого IDA загрузит выбранный исполняемый файл в память и проанализирует необходимые части этого файла. В результате будет создан ф... Создание базы данных IDA. После того, как вы укажете файл для анализа и выставите нужные опции, IDA начнет создание базы данных. Загрузчик IDA определяет структуру виртуальной памяти на основе информации, содержащейся в заголовке файла, и соответствую... Закрытие баз данных IDA. Если это первое сохранение новой базы данных, имя базы будет соответствовать имени входного файла, а расширение будет заменено на .idb (например, example.exe получит базу данных example.idb). Если у входного файла нет расширен... Повторное открытие баз данных. Нужно выбрать базу данных одним из методов открытия файлов IDA. Базы данных открываются гораздо быстрее во второй раз потому что никакого анализа выполнять не надо. 3.2. Рабочая область IDA Поведение рабочей области при начальном анализе. Во время начального автоанализа нового файла в главном окне Вы можете увидеть такие процессы, как: Советы и хитрости рабочего окружения IDA. IDA предлагает огромный объем информации, и окно может стать сильно загромождено. Вот некоторые советы, которые помогут вам наиболее эффективно использовать рабочее окружение: 3.3. Отчет об ошибке 4. ОКНА ДАННЫХ IDA 4.1. Основные окна IDA 4.1.1. Окно дизассемблирования 4.1.1.1. Просмотр графа 4.1.1.2. Режим текста 4.1.2. Окно имён 4.1.3. Окно сообщений 4.1.4. Окно строк 4.2. Дополнительные окна IDA Окно шестнадцатеричного просмотра. Окно шестнадцатеричного просмотра отображает стандартный шестнадцатеричный дамп содержимого программы и списков, по 16 байт на строку. ASCII-эквиваленты отображаются сбоку. Одновременно может быть открыто несколько о... Окно экспортов. Окно экспортов перечисляет входные точки файла. Они включают в себя входную точку исполнения программы, как указано в заголовочном разделе, а также все функции и переменные, которые файл экспортирует для использования другими файлами. ... Окно импортов. Окно импортов перечисляет все функции, импортируемые анализируемым двоичным файлом. Окно импортов нужно, только в случае если двоичный файл использует общие библиотеки. Каждая запись в окне импортов включает в себя имя импортируемой фун... Окно функций. Окно функций перечисляет все функции, распознанные IDA в базе данных. Запись окна функций может выглядеть так: Окно структур. Окно структур используется для отображения распознанных IDA сложных структур данных, таких, как structs и unions в Си. На этапе анализа IDA сопоставляет используемую в программе память с библиотекой подписей. Окно перечислений. Если IDA обнаруживает использование стандартного перечисляемого типа данных, этот тип данных будет указан в окне перечислений. Окно перечислений позволяет определять собственные перечисляемые типы, которые вы сможете использовать с ... 4.3. Вспомогательные экраны IDA Окно сегментов. Окно сегментов отображает общий список сегментов, присутствующих в двоичном файле. Обратите внимание, что в терминах IDA сегментами обычно называют секции, на которое разбит двоичный файл. Информация, отображаемая в данном окне, включа... Содержимое окна сегмента Окно сигнатур. Сигнатуры используются для идентификации распространенных последовательностей запуска, сгенерированных компилятором, чтобы определить, каким компилятором был собран данный двоичный файл. Кроме того, сигнатуры используются для категориза... Окно библиотеки типов. Окно библиотек типов похоже на окно сигнатур. Библиотеки типов отражают знания IDA о стандартных типах данных и прототипах функций, используемых наиболее популярными компиляторами. Обрабатывая заголовочные файлы, IDA понимает, к... Окно вызовов функций. Граф, отображающий отношения между вызывающими и вызываемыми функциями, называют граф вызова функций или дерево вызова функций . Иногда нам будет нужно увидеть не весь граф целой программы, а только ближайших соседей конкретной ф... Окно проблем. С помощью окна проблем IDA информирует вас обо всех трудностях, которые возникли у него в процессе дизассемблирования двоичного файла и о том, какие решения были приняты для их преодоления. Ниже приведен пример набора проблем: 5. НАВИГАЦИЯ В ДИЗАССЕМБЛЕРЕ 5.1. Стековые кадры Стековые кадры. При работе с IDA Pro от пользователя ожидается знание особенностей низкоуровневых языков программирования, касающихся тонкостей генерирования машинного кода и использования памяти высокоуровневой программой. Соглашения вызова. Дальнейшие примеры относятся к архитектуре х86 и поведению типичных х86-компиляторов. Вызывающая функция должна хранить параметры именно в том виде, в котором их ожидает принять вызываемая,. Для установки формата, в котором функции ... Размещение локальных переменных. В отличие от соглашений вызова, определяющих способ передачи параметров в функцию, никаких соглашений, определяющих расположение локальных переменных функции, не существует. Имея лишь исходный код обычно невозможно опр... Окна стека IDA. Во время начального анализа IDA внимательно следит за указателем стека, помечая каждую команду push и pop, а также многие другие арифметические операции, которые могут изменить указатель стека, например, сложение и вычитание констант.... 5.2. Поиск в базе данных Текстовый поиск. Текстовый поиск IDA позволяет искать подстроку в листинге дизассемблирования. Текстовый поиск можно вызвать с помощью меню Search ► Text (горячая клавиша: ALT-T). Некоторое количество говорящих сами за себя функций позволяют тонкую на... Двоичный поиск. Если вы хотите найти определенную двоичную информацию, например, последовательность байтов, текстовый поиск не подходит. Вместо этого используйте двоичный поиск IDA. Текстовый поиск ищет в окне дизассемблирования, бинарный поиск может ... РАЗДЕЛ 3. МАНИПУЛИРОВАНИЕ РЕЗУЛЬТАТОМ ДИЗАССЕМБЛИРОВАНИЯ И МЕТОДЫ ЗАЩИТЫ ПРИЛОЖЕНИЙ 6. МАНИПУЛИРОВАНИЕ РЕЗУЛЬТАТОМ ДИЗАССЕМБЛИРОВАНИЯ 6.1 Имена и присваивание имён Параметры и локальные переменные. Имена, связанные с переменными стека, являются самой простой формой именования в листинге ассемблерного кода, прежде всего потому, что они не связаны с определенным виртуальным адресом, а значит, они не могут появитьс... Именованные области. Переименование именованной области или обозначение имени области, которая его ещё не имела, проходит немного по-другому, нежели переименование переменной стека. Процесс доступа к диалоговому окну идентичен (по горячей клавише N). Имена регистров. IDA позволяет переименовывать регистры в пределах границ функции. Переименование регистра работает почти такие же, как и переименование в любой другой области. Используйте горячую клавишу N, или щелкните правой кнопкой по имени регист... 6.2 Комментарии в IDA Стандартные комментарии. Самый простой комментарий - стандартный. Стандартные комментарии помещены в конце ассемблерных строк. Щелкните правой кнопкой в правом поле дизассемблирования или используйте двоеточие (горячая клавиша : ), чтобы активировать ... Повторяющиеся комментарии. Этот тип комментариев примечателен тем, что, будучи поставлен однажды, он может автоматически появляться во многих местах в ассемблерном коде. Свойство повторяющихся комментариев связано с понятием перекрестных ссылок. Когда... «Следующие» и «предыдущие» строки. Данный тип комментариев выглядит как целая строка, которая появляется до (anterior) и после (posterior) ассемблерной строки. Такие комментарии цветом никак не отмечены и встречаются только в IDA. Функциональные комментарии. Функциональные комментарии позволяют группировать и отображать комментарии вверху листинга ассемблерного кода функции. Комментарий вставляется при первом появлении имени функции в самом её начале, а затем добавляется либо о... 6.3 Первичное преобразование кода Параметры отображения кода. Каждая строка дизассемблированного кода состоит из частей, которые IDA называет «частями дизассемблированных строк». В такой строке всегда присутствуют метки, мнемоника и операнд. Вы можете выбрать дополнительные параметры ... Форматирование операндов команд. Во время процесса дизассемблирования IDA принимает много решений относительно того, как отформатировать операнды, связанные с каждой инструкцией. Самые большие проблемы обычно связаны с тем, как отформатировать различ... 6.3.1 Управление функциями Создание новых функций. Новые функции могут быть созданы существующими командами, которые уже не принадлежат функции, или из байтов необработанных данных, которые не были определены IDA (такими как двойные слова или строки). Для создания функции, поме... Удаление Функций. Удалить существующую функцию вы можете, нажав на Edit ► Functions ► Delete Function, если думаете, что IDA допустила ошибку в анализе. Функциональные Блоки. Функциональные блоки обычно находятся в коде, сгенерированном компилятором Microsoft Visual C++. Блоки - результат перемещения компилятором участков кода, которые реже всего выполняются, чтобы уплотнить часто выполняемые блоки в ... Функциональные параметры. В IDA у функций есть много параметров: Корректировка Указателя вершины стека. Если IDA не удается определить, изменяется ли указатель на команду вершины стека, вам придется вручную подкорректировать указатель на вершину стека. 6.3.2. Преобразование данных для кодирования 7. ТИПЫ ДАННЫХ И СТРУКТУРЫ ДАННЫХ 7.1 Использование распознавания структуры данных 7.1.1. Доступ к элементам массива Глобальные Массивы. Когда массив определен в пределах глобальной области данных программы (в пределах .data или раздела .bss, например), начальный адрес массива компилятор определяет во время компиляции. Фиксированный начальный адрес позволяет компиля... Стековые Массивы. На практике компиляторы обрабатывают стековые массивы почти как и глобальные. Однако во время компиляции не известен адрес, в котором будет выделен массив, таким образом, компилятор не может вычислить адрес этого массива, в отличие о... «Кучевые» (heap-allocated) Массивы. Кучевые массивы образуются, используя функцию динамического выделения памяти, такую как malloc (C) или new (C++). С точки зрения компилятора разница в том, что он должен генерировать все ссылки в массив, основанный ... 7.1.2. Доступ к элементам структуры Глобальные Структуры. Как и с глобальными массивами, адрес глобальных структур известен во время компиляции. Это позволяет компилятору вычислять адрес каждого элемента структуры во время компиляции и избавляет от необходимости делать любые вычисления ... Стековые Структуры. Как и стековые массивы, стековые структуры трудно распознать, основываясь только на расположении стека. «Кучевые» Структуры. Кучевые структуры, оказывается, намного более прозрачны относительно размера структуры и расположения ее полей. Когда кучевая структура выделена в программе, у компилятора нет никакого выбора, кроме как генерировать код, чтобы выч... Массивы Структур. Предыдущие знания из глав о массивах и структурах применяются точно также при контакте с вложенными типами. 7.2. Создание Структур IDA 7.2.1. Ручное Определение Структуры Создание Новой Структуры (или Объединение). Когда программа использует структуру, о которой у IDA нет никакой информации, IDA предлагает определить состав структуры и включить в дизассемблирование новую. Создание структуры в IDA происходит в окне Stru... Редактирование Элементов структуры. Чтобы добавить поля к Вашей новой структуре, Вы должны использовать команды D, A, и звездочку (*). Первоначально, только команда D полезна, и, к сожалению, ее действие очень зависит от расположения курсора. Стековые фреймы как специализированные структуры. Вы наверняка заметили, что определение структуры выглядит подобно подробному виду стекового фрейма. Это не случайно, поскольку IDA обрабатывает обоих одинаково. 7.3. Использование шаблонов структур 7.4. Импортирование новых структур Парсинг структур Си. Версия 5.2 IDA ввела подвид Local Types, доступный через View ► OpenSubviews ► Local Types, в окне Local Types представляется как список всех типов, которые были проанализированы в текущей базе данных. Для новых баз данных окно Lo... Parsing C Header Files. Чтобы проанализировать эти файлы, используйте File ► Load File ► Parse C Header File, чтобы выбрать заголовок, который Вы хотите проанализировать. Любые сообщения об ошибках будут выведены на экран в окне сообщений IDA. В друго... 8. ПЕРЕКРЕСТНЫЕ ССЫЛКИ И ПОСТРОЕНИЕ ГРАФА 8.1. Перекрестные ссылки Перекрестные ссылки на код. Перекрестная ссылка кода используется, чтобы указать, что инструкция передает или может передать управление другой инструкции и описывается как переход в IDA. IDA различает три основных типа перехода: обычный, прыжок, и выз... Перекрестные ссылки на данные. Перекрестные ссылки данных используются, чтобы отследить способ получения доступа к данным в пределах двоичного файла. Перекрестные ссылки данных могут быть связаны с любым байтом в базе данных IDA, который связан с вирт... Списки перекрестных ссылок. Число комментариев перекрестной ссылки, которые могут быть выведены на экран в данном расположении, ограничено параметром конфигурации, которое принимает значение, по умолчанию равное 2. Вызовы функций. Специализированный список перекрестных ссылок, имеющий дело исключительно с вызовами функции, доступен, если выбрать View ► Open Subviews ► Function Calls. 8.2. Графы 8.2.1. Построение графа IDA путем наследования Блок-схемы наследования. Когда курсор в пределах функции, нажатие View ► Graphs ► Flow Chart (горячая клавиша F12) генерирует и выводит на экран блок-схему стиля наследования. Эти графы лучше назвать графами потока управления, поскольку они группируют... Графы наследования вызовов. Граф вызова функции полезен для быстрого понимания иерархии вызовов функции, сделанных в пределах программы. Графы вызовов генерируются путем создания узлов графа для каждой функции и затем присоединения функциональных узло... Графы наследования перекрестной ссылки. Два типа графов перекрестной ссылки могут быть сгенерированы для глобальных символов (функции или глобальные переменные): перекрестные ссылки на символ (View ► Graphs ► Xrefs To) и перекрестные ссылки от символа... Пользовательские Графы перекрестных ссылок. Пользовательские графы перекрестной ссылки, названные User xref charts в IDA, обеспечивают максимальную гибкость в генерировании графов перекрестной ссылки, чтобы удовлетворить Вашим потребностям. В дополнен... заключение СПИСОК ЛИТЕРАТУРЫ
Similar books
Защита приложений от модификации. Дополнительные материалы
2014 · PDF
Защита приложений от модификации. Дополнительные материалы. Учебное пособие
2014 · PDF
Защита приложений от модификации. Учебное пособие
Защита приложений от модификации
Защита приложений от модификации. Дополнительные материалы
Защита приложений от модификации. Дополнительные материалы
2014 · PDF
Защита приложений от модификации: учебное пособие
2013 · PDF
Методология научных исследований и прикладной аналитики: Учебник. Изд. 5-е, дополн. и перераб. В 2 т. Т.2: Научные исследования: Мастерство и искусство научного мышления и научной работы / Methodology of Scientific Research and Practical Analytics: A Textbook: Fifth Edition. In two volumes. Vol.2: Scientific research: Art of scientific thinking and scientific work / Méthodologie de la recherche scientifique et de l’analytique appliquée: Manuel: Cinquième édition. En 2 tomes. T.2: Recherches scientifiques: Art de la pensée scientifique et du travail scientifique
2025 · PDF