Статический метод

advertisement
ЗАЩИТА ПРОГРАММ И ДАННЫХ
ЛЕКЦИЯ 2. АНАЛИЗ ПРОГРАММ, СТАТИЧЕСКИЙ МЕТОД.
ВОССТАНОВЛЕНИЕ АЛГОРИТМОВ
ВАЖНЕЙШИЙ ЭТАП АНАЛИЗА ПРОГРАММЫ – ЭТО ВОССТАНОВЛЕНИЕ АЛГОРИТМОВ,
РЕАЛИЗУЕМЫХ ПРОГРАММОЙ. ЭТО НЕОБХОДИМО, Т.К. В БОЛЬШИНСТВЕ СЛУЧАЕВ
ИСХОДНЫЙ КОД ПРОГРАММЫ НЕДОСТУПЕН.
ВАРИАНТЫ ВОССТАНОВЛЕНИЯ:
• МЕТОД ЧЁРНОГО ЯЩИКА;
• СТАТИЧЕСКИЙ МЕТОД;
• ДИНАМИЧЕСКИЙ МЕТОД.
СТАТИЧЕСКИЙ МЕТОД
СТАТИЧЕСКИЙ МЕТОД ЗАКЛЮЧАЕТСЯ В ВОССТАНОВЛЕНИИ АЛГОРИТМА ЗАЩИТЫ
ПОСРЕДСТВОМ АНАЛИЗА ИМЕЮЩЕГОСЯ В РАСПОРЯЖЕНИИ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ.
В ФАЙЛАХ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ЗАКЛЮЧЕНЫ ВСЕ ДАННЫЕ, НУЖНЫЕ ДЛЯ
ВОССТАНОВЛЕНИЯ АЛГОРИТМА.
ЗАДАЧА СОСТОИТ ЛИШЬ В ТОМ, ЧТОБЫ НАЙТИ СООТВЕТСТВУЮЩИЕ УЧАСТКИ ПРОГРАММЫ
И ПЕРЕВЕСТИ ИХ НА ЯЗЫК, ПОНЯТНЫЙ АНАЛИТИКУ.
ДАННОЕ НАПРАВЛЕНИЕ ОТНОСИТСЯ К РЕВЕРСИВНОМУ ИНЖИНИРИНГУ.
РЕВЕРСИВНЫЙ ИНЖИНИРИНГ
РЕВЕРСИВНЫЙ ИНЖИНИРИНГ — ИССЛЕДОВАНИЕ НЕКОТОРОГО
ГОТОВОГО УСТРОЙСТВА ИЛИ ПРОГРАММЫ, А ТАКЖЕ ДОКУМЕНТАЦИИ НА НЕГО С ЦЕЛЬЮ
ПОНЯТЬ ПРИНЦИП ЕГО РАБОТЫ, СДЕЛАТЬ ИЗМЕНЕНИЕ, ИЛИ ВОСПРОИЗВЕСТИ УСТРОЙСТВО,
ПРОГРАММУ ИЛИ ИНОЙ ОБЪЕКТ С АНАЛОГИЧНЫМИ ФУНКЦИЯМИ, НО БЕЗ
КОПИРОВАНИЯ КАК ТАКОВОГО.
ПРИМЕНЯЕТСЯ ОБЫЧНО В ТОМ СЛУЧАЕ, ЕСЛИ СОЗДАТЕЛЬ ОРИГИНАЛЬНОГО ОБЪЕКТА НЕ
ПРЕДОСТАВИЛ ИНФОРМАЦИИ О СТРУКТУРЕ И СПОСОБЕ СОЗДАНИЯ (ПРОИЗВОДСТВА)
ОБЪЕКТА.
РЕВЕРСИВНЫЙ ИНЖИНИРИНГ
ИСТОРИЧЕСКИЙ ПРИМЕР.
НЕКОТОРОЕ КОЛИЧЕСТВО АМЕРИКАНСКИХ БОМБАРДИРОВЩИКОВ B-29 ПРИ СОВЕРШЕНИИ
ВЫЛЕТОВ В ЯПОНИЮ БЫЛИ ВЫНУЖДЕНЫ САДИТЬСЯ В СССР.
СОВЕТСКИЕ ВОЕННЫЕ, КОТОРЫЕ НЕ ИМЕЛИ ПОДОБНЫХ СТРАТЕГИЧЕСКИХ
БОМБАРДИРОВЩИКОВ, РЕШИЛИ СКОПИРОВАТЬ B-29.
ЧЕРЕЗ НЕСКОЛЬКО ЛЕТ ОНИ РАЗРАБОТАЛИ ТУ-4, ПРАКТИЧЕСКИ ПОЛНУЮ КОПИЮ B-29.
В ТО ЖЕ ВРЕМЯ, ДВИГАТЕЛИ, ВООРУЖЕНИЕ И РАДИОЭЛЕКТРОННОЕ ОБОРУДОВАНИЕ ТУ-4 НЕ
БЫЛО КОПИЯМИ СООТВЕТСТВУЮЩИХ СИСТЕМ В-29.
РЕВЕРСИВНЫЙ ИНЖИНИРИНГ
ПРИМЕР ИЗ КРИПТОГРАФИИ.
ГЕНЕРАТОР КЛЮЧЕВОГО ПОТОКА A5/1 БЫЛ РАЗРАБОТАН В 1987 ГОДУ И В ДАЛЬНЕЙШЕМ
БЫЛ ВСТРОЕН В СТАНДАРТ GSM ДЛЯ ШИФРОВАНИЯ ТРАФФИКА.
АЛГОРИТМ ЭТОГО ГЕНЕРАТОРА ДО СИХ ПОР ОФИЦИАЛЬНО НЕ БЫЛ ОПУБЛИКОВАН.
НО В 1994 ГОДУ АЛГОРИТМ БЫЛ ПОЛУЧЕН С ПОМОЩЬЮ РЕВЕРСИВНОГО ИНЖИНИРИНГА.
В ДАЛЬНЕЙШЕМ ВСЕ АТАКИ НА A5/1 БЫЛИ СДЕЛАНЫ ИМЕННО ДЛЯ ЭТОГО АЛГОРИТМА.
РЕВЕРСИВНЫЙ ИНЖИНИРИНГ
РЕВЕРСИВНЫЙ ИНЖИНИРИНГ В ОБЛАСТИ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ – ПОЛУЧЕНИЕ
ИСХОДНОГО КОДА ПРОГРАММЫ ПО ИСПОЛНЯЕМОМУ ФАЙЛУ ЭТОЙ ПРОГРАММЫ. ЦЕЛЬ –
ОПРЕДЕЛЕНИЕ ИСПОЛЬЗУЕМЫХ АЛГОРИТМОВ.
МЕТОДЫ РЕВЕРСИВНОГО ИНЖИНИРИНГА:
• АНАЛИЗ ОБМЕНА ДАННЫМИ С ПОМОЩЬЮ ПРОСЛУШИВАНИЯ ШИНЫ
КОМПЬЮТЕРА И КОМПЬЮТЕРНОЙ СЕТИ.
• ДИЗАССЕМБЛИРОВАНИЕ МАШИННОГО КОДА ПРОГРАММЫ ДЛЯ ПОЛУЧЕНИЯ ЕЁ ЛИСТИНГА
НА ЯЗЫКЕ АССЕМБЛЕРА.
• ДЕКОМПИЛЯЦИЯ МАШИННОГО КОДА ПРОГРАММЫ ДЛЯ СОЗДАНИЯ ИСХОДНОГО КОДА НА
НЕКОТОРОМ ЯЗЫКЕ ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ.
ДИЗАССЕМБЛИРОВАНИЕ
ДИЗАССЕМБЛЕР — ТРАНСЛЯТОР, ПРЕОБРАЗУЮЩИЙ МАШИННЫЙ КОД В ТЕКСТ
ПРОГРАММЫ НА ЯЗЫКЕ АССЕМБЛЕРА.
МАШИННЫЙ КОД
МАШИННЫЙ КОД (МАШИННЫЙ ЯЗЫК) — СИСТЕМА КОМАНД (НАБОР КОДОВ ОПЕРАЦИЙ)
КОНКРЕТНОЙ ВЫЧИСЛИТЕЛЬНОЙ МАШИНЫ, КОТОРАЯ ИНТЕРПРЕТИРУЕТСЯ
НЕПОСРЕДСТВЕННО ПРОЦЕССОРОМ ЭТОЙ ВЫЧИСЛИТЕЛЬНОЙ МАШИНЫ.
КОД ОПЕРАЦИИ, ОПЕРАЦИОННЫЙ КОД, ОПКОД — ЧАСТЬ МАШИННОГО ЯЗЫКА,
НАЗЫВАЕМАЯ ИНСТРУКЦИЕЙ И ОПРЕДЕЛЯЮЩАЯ ОПЕРАЦИЮ, КОТОРАЯ ДОЛЖНА БЫТЬ
ВЫПОЛНЕНА.
КОМПЬЮТЕРНАЯ ПРОГРАММА, ЗАПИСАННАЯ НА МАШИННОМ ЯЗЫКЕ, СОСТОИТ
ИЗ МАШИННЫХ ИНСТРУКЦИЙ, КАЖДАЯ ИЗ КОТОРЫХ ПРЕДСТАВЛЕНА В ВИДЕ ОПКОДА.
МАШИННЫЙ КОД
КАЖДАЯ МОДЕЛЬ ПРОЦЕССОРА ИМЕЕТ СВОЙ СОБСТВЕННЫЙ НАБОР КОМАНД, ХОТЯ ВО
МНОГИХ МОДЕЛЯХ ЭТИ НАБОРЫ КОМАНД СИЛЬНО ПЕРЕКРЫВАЮТСЯ.
ГОВОРЯТ, ЧТО ПРОЦЕССОР A СОВМЕСТИМ С ПРОЦЕССОРОМ B, ЕСЛИ
ПРОЦЕССОР A ПОЛНОСТЬЮ «ПОНИМАЕТ» МАШИННЫЙ КОД ПРОЦЕССОРА B.
ЕСЛИ ПРОЦЕССОРЫ A И B ИМЕЮТ НЕКОТОРОЕ ПОДМНОЖЕСТВО ИНСТРУКЦИЙ, ПО
КОТОРЫМ ОНИ ВЗАИМНО СОВМЕСТИМЫ, ТО ГОВОРЯТ, ЧТО ОНИ ОДНОЙ «АРХИТЕКТУРЫ»
(ИМЕЮТ ОДИНАКОВУЮ АРХИТЕКТУРУ НАБОРА КОМАНД).
МАШИННЫЙ КОД
КАЖДАЯ МАШИННАЯ ИНСТРУКЦИЯ ВЫПОЛНЯЕТ ОПРЕДЕЛЁННОЕ ДЕЙСТВИЕ.
ПРИМЕРЫ:
• ОПЕРАЦИЯ С ДАННЫМИ (СЛОЖЕНИЕ ИЛИ КОПИРОВАНИЕ МАШИННОГО
СЛОВА В РЕГИСТРЕ ИЛИ В ПАМЯТИ);
• ПЕРЕХОД К ДРУГОМУ УЧАСТКУ КОДА (ИЗМЕНЕНИЕ ПОРЯДКА ИСПОЛНЕНИЯ), ПРИ ЭТОМ
ПЕРЕХОД МОЖЕТ БЫТЬ БЕЗУСЛОВНЫМ ИЛИ УСЛОВНЫМ, ЗАВИСЯЩИМ ОТ РЕЗУЛЬТАТОВ
ПРЕДЫДУЩИХ ИНСТРУКЦИЙ).
ЛЮБАЯ ИСПОЛНИМАЯ ПРОГРАММА СОСТОИТ ИЗ ПОСЛЕДОВАТЕЛЬНОСТИ ТАКИХ
АТОМАРНЫХ МАШИННЫХ ОПЕРАЦИЙ.
МАШИННЫЙ КОД
БОЛЬШИНСТВО СОВРЕМЕННЫХ ПРОЦЕССОРОВ СОСТОИТ ИЗ ОТДЕЛЬНЫХ
«ИСПОЛНИТЕЛЬНЫХ УСТРОЙСТВ» — ВЫЧИСЛИТЕЛЬНЫХ БЛОКОВ, КОТОРЫЕ УМЕЮТ
ИСПОЛНЯТЬ ЛИШЬ ОГРАНИЧЕННЫЙ НАБОР ПРОСТЕЙШИХ ОПЕРАЦИЙ.
ПРИ ИСПОЛНЕНИИ ОЧЕРЕДНОЙ ИНСТРУКЦИИ СПЕЦИАЛЬНЫЙ БЛОК ПРОЦЕССОРА —
ДЕКОДЕР — ТРАНСЛИРУЕТ (ДЕКОДИРУЕТ) ЕЁ В ПОСЛЕДОВАТЕЛЬНОСТЬ ЭЛЕМЕНТАРНЫХ
ОПЕРАЦИЙ, ПОНИМАЕМЫХ КОНКРЕТНЫМИ ИСПОЛНИТЕЛЬНЫМИ УСТРОЙСТВАМИ.
АРХИТЕКТУРА НАБОРА КОМАНД ПРОЦЕССОРА ОПРЕДЕЛЯЕТ, КАКИЕ ОПЕРАЦИИ ОН
СПОСОБЕН ВЫПОЛНЯТЬ.
ЯЗЫК АССЕМБЛЕРА
ДЛЯ УДОБСТВА ПРОГРАММИРОВАНИЯ ВМЕСТО ЧИСЛОВЫХ ОПКОДОВ, КОТОРЫЕ ТОЛЬКО И
ПОНИМАЕТ ПРОЦЕССОР, ОБЫЧНО ИСПОЛЬЗУЮТ ИХ УСЛОВНЫЕ БУКВЕННЫЕ МНЕМОНИКИ.
НАБОР ТАКИХ МНЕМОНИК, ВМЕСТЕ С НЕКОТОРЫМИ ДОПОЛНИТЕЛЬНЫМИ
ВОЗМОЖНОСТЯМИ, НАЗЫВАЕТСЯ ЯЗЫКОМ АССЕМБЛЕРА.
ЯЗЫК АССЕМБЛЕРА— МАШИННО-ОРИЕНТИРОВАННЫЙ ЯЗЫК НИЗКОГО УРОВНЯ С
КОМАНДАМИ, ОБЫЧНО СООТВЕТСТВУЮЩИМИ КОМАНДАМ МАШИНЫ.
АССЕМБЛЕР
АССЕМБЛЕР — ТРАНСЛЯТОР ИСХОДНОГО ТЕКСТА ПРОГРАММЫ, НАПИСАННОЙ НА ЯЗЫКЕ
АССЕМБЛЕРА, В ПРОГРАММУ НА МАШИННОМ ЯЗЫКЕ.
КАК И САМ ЯЗЫК, АССЕМБЛЕРЫ СПЕЦИФИЧНЫ ДЛЯ
КОНКРЕТНОЙ АРХИТЕКТУРЫ, ОПЕРАЦИОННОЙ СИСТЕМЫ И ВАРИАНТА СИНТАКСИСА ЯЗЫКА.
«ПИСАТЬ КОД НА АССЕМБЛЕРЕ» - НЕПРАВИЛЬНОЕ ВЫРАЖЕНИЕ. АССЕМБЛЕР – ТРАНСЛЯТОР.
ПИСАТЬ КОД МОЖНО НА ЯЗЫКЕ АССЕМБЛЕРА.
УРОВНИ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ
НИЗКОУРОВНЕВЫЙ ЯЗЫК ПРОГРАММИРОВАНИЯ (ЯЗЫК ПРОГРАММИРОВАНИЯ НИЗКОГО
УРОВНЯ) — ЯЗЫК ПРОГРАММИРОВАНИЯ, БЛИЗКИЙ К ПРОГРАММИРОВАНИЮ
НЕПОСРЕДСТВЕННО В МАШИННЫХ КОДАХ ИСПОЛЬЗУЕМОГО ПРОЦЕССОРА.
ДЛЯ ОБОЗНАЧЕНИЯ МАШИННЫХ КОМАНД ОБЫЧНО ПРИМЕНЯЕТСЯ МНЕМОНИЧЕСКОЕ
ОБОЗНАЧЕНИЕ. ЭТО ПОЗВОЛЯЕТ ЗАПОМИНАТЬ КОМАНДЫ НЕ В ВИДЕ
ПОСЛЕДОВАТЕЛЬНОСТИ ДВОИЧНЫХ НУЛЕЙ И ЕДИНИЦ, А В ВИДЕ ОСМЫСЛЕННЫХ
СОКРАЩЕНИЙ СЛОВ ЧЕЛОВЕЧЕСКОГО ЯЗЫКА (ОБЫЧНО АНГЛИЙСКИХ).
УРОВНИ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ
ВЫСОКОУРОВНЕВЫЙ ЯЗЫК ПРОГРАММИРОВАНИЯ — ЯЗЫК ПРОГРАММИРОВАНИЯ,
РАЗРАБОТАННЫЙ ДЛЯ БЫСТРОТЫ И УДОБСТВА ИСПОЛЬЗОВАНИЯ ПРОГРАММИСТОМ.
ОСНОВНАЯ ЧЕРТА ВЫСОКОУРОВНЕВЫХ ЯЗЫКОВ — ЭТО АБСТРАКЦИЯ, ТО ЕСТЬ ВВЕДЕНИЕ
СМЫСЛОВЫХ КОНСТРУКЦИЙ, КРАТКО ОПИСЫВАЮЩИХ ТАКИЕ СТРУКТУРЫ
ДАННЫХ И ОПЕРАЦИИ НАД НИМИ, ОПИСАНИЯ КОТОРЫХ НА МАШИННОМ КОДЕ (ИЛИ
ДРУГОМ НИЗКОУРОВНЕВОМ ЯЗЫКЕ ПРОГРАММИРОВАНИЯ) ОЧЕНЬ ДЛИННЫ И СЛОЖНЫ
ДЛЯ ПОНИМАНИЯ.
ПРИМЕРЫ СМЫСЛОВОЙ КОНСТРУКЦИИ - КЛАСС.
ПРИМЕРЫ ЯЗЫКОВ ВЕРХНЕГО УРОВНЯ: C++. FORTRAN. JAVA.
УРОВНИ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ
СВЕРХВЫСОКОУРОВНЕВЫЙ ЯЗЫК ПРОГРАММИРОВАНИЯ — ЯЗЫК ПРОГРАММИРОВАНИЯ С
ОЧЕНЬ ВЫСОКИМ УРОВНЕМ АБСТРАКЦИИ.
ТЕРМИН ВПЕРВЫЕ ПОЯВИЛСЯ В СЕРЕДИНЕ 1990-Х ГОДОВ ДЛЯ ОБОЗНАЧЕНИЯ ГРУППЫ ЯЗЫКОВ,
ИСПОЛЬЗУЕМЫХ ДЛЯ БЫСТРОГО ПРОТОТИПИРОВАНИЯ, НАПИСАНИЯ
ОДНОРАЗОВЫХ СКРИПТОВ И ПОДОБНЫХ ЗАДАЧ.
К ЯЗЫКАМ СВЕРХВЫСОКОГО УРОВНЯ ОТНОСЯТ ТАКИЕ ЯЗЫКИ КАК RUBY, HASKELL, PERL И AWK.
БОЛЬШОЙ КЛАСС ЯЗЫКОВ СВЕРХВЫСОКОГО УРОВНЯ — ЭТО ЯЗЫКИ,
ИСПОЛЬЗУЮЩИЕ СИНТАКСИС, КОТОРЫЙ НИКОГДА НЕ ИСПОЛЬЗУЕТСЯ В ДРУГИХ ЯЗЫКАХ
ПРОГРАММИРОВАНИЯ. НАПРИМЕР, НЕПОСРЕДСТВЕННО СИНТАКСИС АНГЛИЙСКОГО ЯЗЫКА.
ПРИМЕРОМ ТАКОГО ЯЗЫКА, РАСПОЗНАЮЩЕГО СИНТАКСИС АНГЛИЙСКОГО ЯЗЫКА, МОЖЕТ
СЛУЖИТЬ ЯЗЫК КОМПИЛЯТОРА ТЕКСТОВЫХ КВЕСТОВ INFORM ВЕРСИИ 7.
УРОВНИ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ
ПЕРВОЕ ПОКОЛЕНИЕ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ - МАШИННЫЕ КОДЫ
ЯЗЫК АССЕМБЛЕРА - ВТОРОЕ ПОКОЛЕНИЕ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ.
НЕДОСТАТКИ ЯЗЫКА АССЕМБЛЕРА, СЛОЖНОСТЬ РАЗРАБОТКИ НА НЁМ БОЛЬШИХ ПРОГРАММНЫХ
КОМПЛЕКСОВ ПРИВЕЛИ К ПОЯВЛЕНИЮ ЯЗЫКОВ ТРЕТЬЕГО ПОКОЛЕНИЯ —ЯЗЫКОВ
ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ (ТАКИХ КАК ФОРТРАН, ЛИСП, КОБОЛ, ПАСКАЛЬ, СИ И
ДР.)
ИМЕННО ЯЗЫКИ ПРОГРАММИРОВАНИЯ ВЫСОКОГО И СВЕРХВЫСОКОГО УРОВНЯ В ОСНОВНОМ
ИСПОЛЬЗУЮТСЯ В НАСТОЯЩЕЕ ВРЕМЯ В ИНДУСТРИИ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ.
ОДНАКО, ЯЗЫКИ АССЕМБЛЕРА СОХРАНЯЮТ СВОЮ НИШУ, ОБУСЛОВЛЕННУЮ ИХ УНИКАЛЬНЫМИ
ПРЕИМУЩЕСТВАМИ В ЧАСТИ ЭФФЕКТИВНОСТИ И ВОЗМОЖНОСТИ ПОЛНОГО ИСПОЛЬЗОВАНИЯ
СПЕЦИФИЧЕСКИХ СРЕДСТВ КОНКРЕТНОЙ ПЛАТФОРМЫ.
ЯЗЫК АССЕМБЛЕРА
ЯЗЫК АССЕМБЛЕРА — СИСТЕМА ОБОЗНАЧЕНИЙ, ИСПОЛЬЗУЕМАЯ ДЛЯ ПРЕДСТАВЛЕНИЯ В
УДОБОЧИТАЕМОЙ ФОРМЕ ПРОГРАММ, ЗАПИСАННЫХ В МАШИННОМ КОДЕ.
ЯЗЫК АССЕМБЛЕРА ПОЗВОЛЯЕТ ПРОГРАММИСТУ ПОЛЬЗОВАТЬСЯ АЛФАВИТНЫМИ
МНЕМОНИЧЕСКИМИ КОДАМИ ОПЕРАЦИЙ, ПО СВОЕМУ УСМОТРЕНИЮ ПРИСВАИВАТЬ
СИМВОЛИЧЕСКИЕ ИМЕНА РЕГИСТРАМ ЭВМ И ПАМЯТИ, А ТАКЖЕ ЗАДАВАТЬ УДОБНЫЕ ДЛЯ
СЕБЯ СХЕМЫ АДРЕСАЦИИ (НАПРИМЕР, ИНДЕКСНУЮ ИЛИ КОСВЕННУЮ).
ПЕРЕВОД ПРОГРАММЫ НА ЯЗЫКЕ АССЕМБЛЕРА В ИСПОЛНИМЫЙ МАШИННЫЙ КОД
(ВЫЧИСЛЕНИЕ ВЫРАЖЕНИЙ, ЗАМЕНА МНЕМОНИК СОБСТВЕННО МАШИННЫМИ КОДАМИ И
СИМВОЛЬНЫХ АДРЕСОВ НА АБСОЛЮТНЫЕ ИЛИ ОТНОСИТЕЛЬНЫЕ АДРЕСА)
ПРОИЗВОДИТСЯ АССЕМБЛЕРОМ — ПРОГРАММОЙ-ТРАНСЛЯТОРОМ, КОТОРАЯ И ДАЛА
ЯЗЫКУ АССЕМБЛЕРА ЕГО НАЗВАНИЕ.
ЯЗЫК АССЕМБЛЕРА
КОМАНДЫ ЯЗЫКА АССЕМБЛЕРА СООТВЕТСТВУЮТ КОМАНДАМ ПРОЦЕССОРА.
ФАКТИЧЕСКИ, ОНИ И ПРЕДСТАВЛЯЮТ СОБОЙ БОЛЕЕ УДОБНУЮ ДЛЯ ЧЕЛОВЕКА
СИМВОЛЬНУЮ ФОРМУ ЗАПИСИ — МНЕМОКОДЫ — КОМАНД И ИХ АРГУМЕНТОВ. ПРИ
ЭТОМ ОДНОЙ КОМАНДЕ ЯЗЫКА АССЕМБЛЕРА МОЖЕТ СООТВЕТСТВОВАТЬ НЕСКОЛЬКО
ВАРИАНТОВ КОМАНД ПРОЦЕССОРА
КАЖДАЯ МОДЕЛЬ (ИЛИ СЕМЕЙСТВО) ПРОЦЕССОРОВ ИМЕЕТ СВОЙ НАБОР КОМАНД И
СООТВЕТСТВУЮЩИЙ ЕМУ ЯЗЫК АССЕМБЛЕРА. НАИБОЛЕЕ ПОПУЛЯРНЫЕ СИНТАКСИСЫ
ЯЗЫКОВ АССЕМБЛЕРА — INTEL-СИНТАКСИС И AT&T-СИНТАКСИС.
Т.Е. ПРАВИЛЬНЕЕ ГОВОРИТЬ НЕ ОБ ОДНОМ ЯЗЫКЕ АССЕМБЛЕРА, А О ГРУППЕ ЯЗЫКОВ
АССЕМБЛЕРА.
НАБОР КОМАНД ЯЗЫКА АССЕМБЛЕРА
•
•
•
•
•
•
•
Команды пересылки данных (mov и др.)
Арифметические команды (add, sub, imul и др.)
Логические и побитовые операции (or, and, xor, shr и др.)
Команды управления ходом выполнения программы (jmp, loop, ret и др.)
Команды вызова прерываний (иногда относят к командам управления): int
Команды ввода-вывода в порты (in, out)
Для микроконтроллеров и микрокомпьютеров характерны также команды,
выполняющие проверку и переход по условию, например:
cjne — перейти, если не равно
djnz — декрементировать, и если результат ненулевой, то перейти
cfsneq — сравнить, и если не равно, пропустить следующую команду
ЯЗЫК АССЕМБЛЕРА
ДОСТОИНСТВА
• ЯЗЫК АССЕМБЛЕРА ПОЗВОЛЯЕТ ПИСАТЬ САМЫЙ БЫСТРЫЙ И КОМПАКТНЫЙ КОД, КАКОЙ
ВООБЩЕ ВОЗМОЖЕН ДЛЯ ДАННОГО ПРОЦЕССОРА.
• ЕСЛИ ДАННЫЕ, КОТОРЫМИ ОПЕРИРУЕТ ПРОГРАММА, НЕ ПОМЕЩАЮТСЯ ЦЕЛИКОМ
В РЕГИСТРАХ ПРОЦЕССОРА, ТО ЕСТЬ ЧАСТИЧНО ИЛИ ПОЛНОСТЬЮ НАХОДЯТСЯ В ОПЕРАТИВНОЙ
ПАМЯТИ, ТО ИСКУСНЫЙ ПРОГРАММИСТ, СПОСОБЕН ЗНАЧИТЕЛЬНО ОПТИМИЗИРОВАТЬ
ПРОГРАММУ ПО СРАВНЕНИЮ С ТРАНСЛЯТОРОМ С ЯЗЫКА ВЫСОКОГО УРОВНЯ.
• ПРИ ПРОГРАММИРОВАНИИ НА ЯЗЫКЕ АССЕМБЛЕРА ВОЗМОЖЕН НЕПОСРЕДСТВЕННЫЙ ДОСТУП
К АППАРАТУРЕ, И, В ЧАСТНОСТИ, ПОРТАМ ВВОДА-ВЫВОДА, РЕГИСТРАМ ПРОЦЕССОРА И ДР.
ЯЗЫК АССЕМБЛЕРА
НЕДОСТАТКИ
• В СИЛУ МАШИННОЙ ОРИЕНТАЦИИ («НИЗКОГО» УРОВНЯ) ЯЗЫКА АССЕМБЛЕРА ЧЕЛОВЕКУ
СЛОЖНЕЕ ЧИТАТЬ И ПОНИМАТЬ ПРОГРАММУ НА НЁМ ПО СРАВНЕНИЮ С ЯЗЫКАМИ
ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ; ПРОГРАММА СОСТОИТ ИЗ СЛИШКОМ «МЕЛКИХ»
ЭЛЕМЕНТОВ — МАШИННЫХ КОМАНД, СООТВЕТСТВЕННО, УСЛОЖНЯЮТСЯ
ПРОГРАММИРОВАНИЕ И ОТЛАДКА, РАСТУТ ТРУДОЁМКОСТЬ И ВЕРОЯТНОСТЬ ВНЕСЕНИЯ
ОШИБОК.
• ТРЕБУЕТСЯ ПОВЫШЕННАЯ КВАЛИФИКАЦИЯ ПРОГРАММИСТА ДЛЯ ПОЛУЧЕНИЯ КАЧЕСТВЕННОГО
КОДА: КОД, НАПИСАННЫЙ СРЕДНИМ ПРОГРАММИСТОМ НА ЯЗЫКЕ АССЕМБЛЕРА, ОБЫЧНО
ОКАЗЫВАЕТСЯ НЕ ЛУЧШЕ ИЛИ ДАЖЕ ХУЖЕ КОДА, ПОРОЖДАЕМОГО ОПТИМИЗИРУЮЩИМ
КОМПИЛЯТОРОМ ДЛЯ СРАВНИМЫХ ПРОГРАММ, НАПИСАННЫХ НА ЯЗЫКЕ ВЫСОКОГО УРОВНЯ.
ЯЗЫК АССЕМБЛЕРА
НЕДОСТАТКИ
• ПРОГРАММА НА ЯЗЫКЕ ВЫСОКОГО УРОВНЯ МОЖЕТ БЫТЬ ПЕРЕКОМПИЛИРОВАНА С
АВТОМАТИЧЕСКОЙ ОПТИМИЗАЦИЕЙ ПОД ОСОБЕННОСТИ НОВОЙ ЦЕЛЕВОЙ ПЛАТФОРМЫ,
ПРОГРАММА ЖЕ НА ЯЗЫКЕ АССЕМБЛЕРА НА НОВОЙ ПЛАТФОРМЕ МОЖЕТ ПОТЕРЯТЬ СВОЁ
ПРЕИМУЩЕСТВО В СКОРОСТИ БЕЗ РУЧНОГО ПЕРЕПИСЫВАНИЯ КОДА.
• МЕНЬШЕЕ КОЛИЧЕСТВО ДОСТУПНЫХ БИБЛИОТЕК ПО СРАВНЕНИЮ С СОВРЕМЕННЫМИ
ИНДУСТРИАЛЬНЫМИ ЯЗЫКАМИ ПРОГРАММИРОВАНИЯ.
ПРИМЕНЕНИЕ ЯЗЫКА АССЕМБЛЕРА
СОЗДАНИЕ ОПЕРАЦИОННЫХ СИСТЕМ (ОС)
В НАСТОЯЩЕЕ ВРЕМЯ ПОДАВЛЯЮЩЕЕ БОЛЬШИНСТВО ОС ПИШУТ НА БОЛЕЕ
ВЫСОКОУРОВНЕВЫХ ЯЗЫКАХ (В ОСНОВНОМ НА СИ — ЯЗЫКЕ ВЫСОКОГО УРОВНЯ, КОТОРЫЙ
СПЕЦИАЛЬНО БЫЛ СОЗДАН ДЛЯ НАПИСАНИЯ ОДНОЙ ИЗ ПЕРВЫХ ВЕРСИЙ ОС UNIX).
НО АППАРАТНО ЗАВИСИМЫЕ УЧАСТКИ КОДА, ТАКИЕ КАК ЗАГРУЗЧИК ОС И ЯДРО, ЧАСТО
ПИШУТСЯ НА ЯЗЫКЕ АССЕМБЛЕРА.
ФАКТИЧЕСКИ, АССЕМБЛЕРНОГО КОДА В ЯДРАХ ОС СЕМЕЙСТВА WINDOWS ИЛИ
LINUX СОВСЕМ НЕМНОГО, ПОСКОЛЬКУ АВТОРЫ СТРЕМЯТСЯ
ОБЕСПЕЧИТЬ ПЕРЕНОСИМОСТЬ И НАДЁЖНОСТЬ. НО ОН ЕСТЬ.
ПРИМЕНЕНИЕ ЯЗЫКА АССЕМБЛЕРА
ПРОГРАММИРОВАНИЕ МИКРОКОНТРОЛЛЕРОВ (МК) И ДРУГИХ ВСТРАИВАЕМЫХ
ПРОЦЕССОРОВ
РАЗВИТИЕ МК ПОВТОРЯЕТ ИСТОРИЧЕСКОЕ РАЗВИТИЕ КОМПЬЮТЕРОВ НОВЕЙШЕГО
ВРЕМЕНИ.
СЕЙЧАС ДЛЯ ПРОГРАММИРОВАНИЯ МК НАЧИНАЮТ ИСПОЛЬЗОВАТЬ ЯЗЫК СИ, НО ЧАЩЕ
ВСЕГО ПРИМЕНЯЮТ ЯЗЫК АССЕМБЛЕРА, Т.К., НАПРИМЕР, В МК ПРИХОДИТСЯ ПЕРЕМЕЩАТЬ
ОТДЕЛЬНЫЕ БАЙТЫ И БИТЫ МЕЖДУ РАЗЛИЧНЫМИ ЯЧЕЙКАМИ ПАМЯТИ.
ПРОГРАММИРОВАНИЕ МК ВЕСЬМА ВАЖНО, ТАК КАК, В АВТОМОБИЛЕ И КВАРТИРЕ
СОВРЕМЕННОГО ЦИВИЛИЗОВАННОГО ЧЕЛОВЕКА В СРЕДНЕМ СОДЕРЖИТСЯ 50
МИКРОКОНТРОЛЛЕРОВ
ПРИМЕНЕНИЕ ЯЗЫКА АССЕМБЛЕРА
СОЗДАНИЕ ДРАЙВЕРОВ
В НАСТОЯЩЕЕ ВРЕМЯ МНОГИЕ СТРЕМЯТСЯ ПИСАТЬ ДРАЙВЕРЫ НА ЯЗЫКАХ ВЫСОКОГО
УРОВНЯ, В СВЯЗИ С ДОСТАТОЧНЫМ СОВЕРШЕНСТВОМ КОМПИЛЯТОРОВ С ЯЗЫКОВ
ВЫСОКОГО УРОВНЯ.
НО ПОДАВЛЯЮЩАЯ ЧАСТЬ СОВРЕМЕННЫХ ДРАЙВЕРОВ ПИШЕТСЯ НА ЯЗЫКЕ АССЕМБЛЕРА.
НАДЁЖНОСТЬ ДЛЯ ДРАЙВЕРОВ ИГРАЕТ ОСОБУЮ РОЛЬ, ПОСКОЛЬКУ В WINDOWS
NT И UNIX (В ТОМ ЧИСЛЕ В LINUX) ДРАЙВЕРЫ РАБОТАЮТ В РЕЖИМЕ ЯДРА СИСТЕМЫ.
ОДНА ОШИБКА В ДРАЙВЕРЕ МОЖЕТ ПРИВЕСТИ К КРАХУ ВСЕЙ СИСТЕМЫ.
ПРИМЕНЕНИЕ ЯЗЫКА АССЕМБЛЕРА
ОПТИМИЗАЦИЯ КРИТИЧНЫХ К СКОРОСТИ УЧАСТКОВ ПРОГРАММ В ПРОГРАММАХ НА
ЯЗЫКАХ ВЫСОКОГО УРОВНЯ
ДЛЯ ЭТОГО ПРИМЕНЯЮТСЯ АССЕМБЛЕРНЫЕ ВСТАВКИ.
ЯЗЫК АССЕМБЛЕРА
АССЕМБЛЕРНОЙ ВСТАВКОЙ НАЗЫВАЮТ ВОЗМОЖНОСТЬ КОМПИЛЯТОРА ВСТРАИВАТЬ
НИЗКОУРОВНЕВЫЙ КОД, НАПИСАННЫЙ НА ЯЗЫКЕ АССЕМБЛЕРА, В ПРОГРАММУ,
НАПИСАННУЮ НА ЯЗЫКЕ ВЫСОКОГО УРОВНЯ, НАПРИМЕР, C++.
ИСПОЛЬЗОВАНИЕ АССЕМБЛЕРНЫХ ВСТАВОК МОЖЕТ ПРЕСЛЕДОВАТЬ СЛЕДУЮЩИЕ ЦЕЛИ:
• ДЛЯ ОПТИМИЗАЦИИ ВРУЧНУЮ ПИШЕТСЯ АССЕМБЛЕРНЫЙ КОД, РЕАЛИЗУЮЩИЙ
НАИБОЛЕЕ КРИТИЧНЫЕ В ОТНОШЕНИИ ПРОИЗВОДИТЕЛЬНОСТИ ЧАСТИ АЛГОРИТМА. ЭТО
ПОЗВОЛЯЕТ ПРОГРАММИСТУ ИСПОЛЬЗОВАТЬ В ПОЛНОЙ МЕРЕ СВОЮ
ИЗОБРЕТАТЕЛЬНОСТЬ, НЕ ОГРАНИЧИВАТЬСЯ КОНСТРУКЦИЯМИ КОМПИЛЯТОРА.
• ПРЯМОЙ ДОСТУП К СПЕЦИФИЧНЫМ ИНСТРУКЦИЯМ ПРОЦЕССОРА.
ЯЗЫК АССЕМБЛЕРА
Этот пример ассемблерной вставки на языке
программирования D, реализующий вычисление
тангенса x, использует
инструкции FPU архитектуры x86.
Этот код исполняется быстрее, чем код, который
мог бы быть сгенерирован компилятором. Также,
здесь использована инструкция fldpi, которая
загружает наиболее близкую аппроксимацию
числа 𝜋 для архитектуры x86.
ПРИМЕНЕНИЕ ЯЗЫКА АССЕМБЛЕРА
С ПОМОЩЬЮ ПРОГРАММЫ ДИЗАССЕМБЛЕРА МОЖНО ПОНЯТЬ АЛГОРИТМЫ РАБОТЫ
ИССЛЕДУЕМОЙ ПРОГРАММЫ ПРИ ОТСУТСТВИИ ЛИСТИНГА НА ВЫСОКОУРОВНЕВОМ ЯЗЫКЕ,
ИЗУЧАЯ ТОЛЬКО МАШИННЫЕ КОДЫ.
СТАТИЧЕСКИЙ МЕТОД
ДИЗАССЕМБЛЕР — ТРАНСЛЯТОР, ПРЕОБРАЗУЮЩИЙ МАШИННЫЙ КОД В ТЕКСТ
ПРОГРАММЫ НА ЯЗЫКЕ АССЕМБЛЕРА.
ДАЛЬНЕЙШАЯ РАБОТА ПОСЛЕ ДИЗАССЕМБЛИРОВАНИЯ СВОДИТСЯ К АНАЛИЗУ ПОЛУЧЕННЫХ
ЛИСТИНГОВ, ПОИСКУ УЧАСТКОВ, ОТВЕЧАЮЩИХ ЗА ЗАЩИТУ ИНФОРМАЦИИ, И ПЕРЕВОДУ
ОПИСАНИЯ ПРОЦЕДУР ФУНКЦИОНИРОВАНИЯ АЛГОРИТМОВ ЗАЩИТЫ НА ПОНЯТНЫЙ
АНАЛИТИКУ ЯЗЫК.
СТАТИЧЕСКИЙ МЕТОД
СТАТИЧЕСКИЙ МЕТОД АНАЛИЗА ПРОГРАММ ПРИ ОТСУТСТВИИ В ПРОГРАММЕ СПЕЦИАЛЬНЫХ
СРЕДСТВ ЗАЩИТЫ ОТ ДИЗАССЕМБЛИРОВАНИЯ ПОЗВОЛЯЕТ ПОЛНОСТЬЮ ВОССТАНОВИТЬ
АЛГОРИТМЫ ЗАЩИТЫ.
ОН ТАКЖЕ ДАЕТ ВОЗМОЖНОСТЬ ПОНЯТЬ СТРУКТУРУ ПРОГРАММЫ, СПОСОБЫ ВЫЗОВА И
ВЗАИМОДЕЙСТВИЯ ОТДЕЛЬНЫХ МОДУЛЕЙ.
ДЛЯ ПРИМЕНЕНИЯ СТАТИЧЕСКОГО МЕТОДА ДОСТАТОЧНО ИМЕТЬ В СВОЕМ РАСПОРЯЖЕНИИ
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ.
НЕ ТРЕБУЕТСЯ, ЧТОБЫ АНАЛИЗИРУЕМАЯ ПРОГРАММА, ИМЕЮЩАЯСЯ У АНАЛИТИКА, БЫЛА
РАБОТОСПОСОБНА.
ЭТО ОЧЕНЬ УДОБНО В СЛУЧАЯХ, КОГДА ПРЕДМЕТОМ ИССЛЕДОВАНИЙ ЯВЛЯЕТСЯ ПРОГРАММНЫЙ
КОМПЛЕКС, ТРЕБУЮЩИЙ ДОРОГОСТОЯЩИХ ПРОГРАММНЫХ ИЛИ ТЕХНИЧЕСКИХ СРЕДСТВ,
КОТОРЫЕ ОТСУТСТВУЮТ У АНАЛИТИКА.
СТАТИЧЕСКИЙ МЕТОД
СТАТИЧЕСКИЙ МЕТОД ПОЗВОЛЯЕТ ИСПОЛЬЗОВАТЬ И ДОПОЛНИТЕЛЬНУЮ ИНФОРМАЦИЮ,
СОДЕРЖАЩУЮСЯ В ПРОГРАММНОМ ОБЕСПЕЧЕНИИ (НАПРИМЕР, ИМЕНА ВЫЗЫВАЕМЫХ
БИБЛИОТЕК), ЧТО НЕДОСТУПНО ДЛЯ МЕТОДА ЭКСПЕРИМЕНТОВ С «ЧЕРНЫМ ЯЩИКОМ».
ПО ЭТИМ ИМЕНАМ МОЖНО ОПРЕДЕЛИТЬ НЕКОТОРЫЕ ФРАГМЕНТЫ АЛГОРИТМА.
СТАТИЧЕСКИЙ МЕТОД В БОЛЬШЕЙ МЕРЕ, ЧЕМ ДРУГИЕ ПОДХОДЫ, ДОПУСКАЕТ
АВТОМАТИЗАЦИЮ ОТДЕЛЬНЫХ ЭТАПОВ АНАЛИЗА.
СТАТИЧЕСКИЙ МЕТОД
С ДРУГОЙ СТОРОНЫ, ПРИ ПРИМЕНЕНИИ СТАТИЧЕСКОГО МЕТОДА АНАЛИТИК МОЖЕТ
ВСТРЕТИТЬСЯ И СО ЗНАЧИТЕЛЬНЫМИ ТРУДНОСТЯМИ.
ДАЛЕКО НЕ ВСЕГДА УДАЕТСЯ НАЙТИ ПОДХОДЯЩУЮ ПРОГРАММУ ДИЗАССЕМБЛИРОВАНИЯ.
ДЛЯ ТОГО ЧТОБЫ ПРОВЕСТИ ДИЗАССЕМБЛИРОВАНИЕ, НАДО ЗНАТЬ, КАК ОСУЩЕСТВЛЯЕТСЯ
ПРЕОБРАЗОВАНИЕ ИНФОРМАЦИИ В ВЫЧИСЛИТЕЛЬНОЙ СИСТЕМЕ.
А ДОКУМЕНТАЦИЯ ПО ЭТИМ ВОПРОСАМ ДЛЯ ЦЕЛОГО РЯДА МОЩНЫХ ВЫЧИСЛИТЕЛЬНЫХ
СИСТЕМ, КАК ПРАВИЛО, МАЛОДОСТУПНА.
СТАТИЧЕСКИЙ МЕТОД
К ЛЮБОЙ ВЫЧИСЛИТЕЛЬНОЙ СИСТЕМЕ ДОЛЖНЫ ПРИЛАГАТЬСЯ ПРОГРАММНЫЕ СРЕДСТВА,
ПОЗВОЛЯЮЩИЕ ПОЛЬЗОВАТЕЛЮ РАЗРАБАТЫВАТЬ СОБСТВЕННЫЕ ПРОГРАММЫ НА ПРИВЫЧНЫХ
ЯЗЫКАХ ПРОГРАММИРОВАНИЯ ИЛИ НА МОДИФИКАЦИЯХ ЭТИХ ЯЗЫКОВ.
ДОЛЖНЫ ПРИЛАГАТЬСЯ И СООТВЕТСТВУЮЩИЕ КОМПИЛЯТОРЫ, ПЕРЕВОДЯЩИЕ
ЛИСТИНГИ ПРОГРАММ В МАШИННЫЕ КОДЫ СООТВЕТСТВУЮЩЕЙ ЭВМ.
АНАЛИТИК НА ОСНОВЕ ЭТИХ ПРОГРАММ ИМЕЕТ ВОЗМОЖНОСТЬ ВОССТАНОВИТЬ И СПОСОБЫ
ОБРАБОТКИ ИНФОРМАЦИИ В ВЫЧИСЛИТЕЛЬНОЙ СИСТЕМЕ (НАПРИМЕР, МЕТОДОМ
ЭКСПЕРИМЕНТОВ С «ЧЕРНЫМ ЯЩИКОМ»).
ПРИ ЭТОМ, ОДНАКО, АНАЛИТИКУ ПРИДЕТСЯ РЕШАТЬ СЛОЖНЫЕ И ТРУДОЕМКИЕ ЗАДАЧИ,
ДАЛЕКО ВЫХОДЯЩИЕ ЗА РАМКИ АНАЛИЗА КОНКРЕТНОЙ СИСТЕМЫ ЗАЩИТЫ ИНФОРМАЦИИ.
СТАТИЧЕСКИЙ МЕТОД
ПРИ ПРАКТИЧЕСКОЙ РЕАЛИЗАЦИИ АЛГОРИТМОВ ДИЗАССЕМБЛИРОВАНИЯ ВОЗНИКАЮТ
СЛЕДУЮЩИЕ ПРОБЛЕМЫ.
1.
ПРОБЛЕМА ВОССТАНОВЛЕНИЯ СИМВОЛИЧЕСКИХ ИМЕН.
В ПРОГРАММЕ, НАПИСАННОЙ НА ЯЗЫКЕ АССЕМБЛЕРА, ВСЕ ПЕРЕМЕННЫЕ, МЕТКИ,
ПРОЦЕДУРЫ И СЕГМЕНТЫ ИМЕЮТ СИМВОЛИЧЕСКИЕ ИМЕНА.
ПРИ КОМПИЛЯЦИИ ПРОГРАММЫ ЭТИ ИМЕНА ЗАМЕНЯЮТСЯ ФИЗИЧЕСКИМИ АДРЕСАМИ. В
СКОМПИЛИРОВАННОМ МАШИННОМ КОДЕ НЕ ОСТАЕТСЯ ИНФОРМАЦИИ О
СИМВОЛИЧЕСКИХ ИМЕНАХ,
ОБЫЧНО ЭТА ПРОБЛЕМА РЕШАЕТСЯ ПУТЕМ «ПРИДУМЫВАНИЯ» ДИЗАССЕМБЛЕРОМ
СИМВОЛИЧЕСКИХ ИМЕН ТИПА VAR1, LABEL2, РГОС3 И Т.Д.
СТАТИЧЕСКИЙ МЕТОД
2. ПРОБЛЕМА РАЗЛИЧЕНИЯ КОМАНД И ДАННЫХ.
В СКОМПИЛИРОВАННОЙ ПРОГРАММЕ МАШИННЫЙ КОД И ДАННЫЕ ОТЛИЧАЮТСЯ ДРУГ ОТ
ДРУГА ТОЛЬКО НО КОНТЕКСТУ ИСПОЛЬЗОВАНИЯ.
НАПРИМЕР, МАШИННАЯ КОМАНДА МОЖЕТ НЕПОСРЕДСТВЕННО СЛЕДОВАТЬ ЗА
ГЛОБАЛЬНОЙ ПЕРЕМЕННОЙ.
ЕСЛИ ДИЗАССЕМБЛЕР ПРИНИМАЕТ КОД ЗА ДАННЫЕ ИЛИ НАОБОРОТ, ТЕКСТ, ВЫДАВАЕМЫЙ
ДИЗАССЕМБЛЕРОМ, СТАНОВИТСЯ БЕССМЫСЛЕННЫМ.
СТАТИЧЕСКИЙ МЕТОД
3. ПРОБЛЕМА ОПРЕДЕЛЕНИЯ ГРАНИЦЫ МАШИННОЙ КОМАНДЫ.
КОМАНДЫ МАШИННОГО КОДА, ПРЕДНАЗНАЧЕННОГО ДЛЯ ВЫПОЛНЕНИЯ НА CISCПРОЦЕССОРАХ (ПРОЦЕССОРЫ СЕМЕЙСТВ Х86 И Х86-64 ОТНОСЯТСЯ К CISC-ПРОЦЕССОРАМ),
СЛЕДУЮТ ДРУГ ЗА ДРУГОМ ПОДРЯД НЕПОСРЕДСТВЕННО, БЕЗ КАКИХ-ЛИБО РАЗДЕЛИТЕЛЕЙ.
ПРИ ВЫПОЛНЕНИИ КОДА ПРОЦЕССОР НАЧИНАЕТ СЧИТЫВАТЬ ОЧЕРЕДНУЮ КОМАНДУ С
БАЙТА, НЕПОСРЕДСТВЕННО СЛЕДУЮЩЕГО ЗА ТОЛЬКО ЧТО ВЫПОЛНЕННОЙ КОМАНДОЙ.
НО БЫВАЮТ И РАЗДЕЛИТЕЛИ.
ЕСЛИ ДИЗАССЕМБЛЕР НЕПРАВИЛЬНО ОПРЕДЕЛЯЕТ ГРАНИЦУ КОМАНДЫ, ОН НЕПРАВИЛЬНО
ВОССТАНАВЛИВАЕТ ЭТУ КОМАНДУ И НЕСКОЛЬКО КОМАНД, СЛЕДУЮЩИХ ЗА НЕЙ.
СТАТИЧЕСКИЙ МЕТОД
3. ПРОБЛЕМА ОПРЕДЕЛЕНИЯ ГРАНИЦЫ МАШИННОЙ КОМАНДЫ.
• НАПРИМЕР, ПУСТЬ МЫ ИМЕЕМ СЛЕДУЮЩИЙ МАШИННЫЙ КОД
F7 D1 2B F9
ЭТОТ КОД ПРАВИЛЬНО ДИЗАССЕМБЛИРУЕТСЯ СЛЕДУЮЩИМ ОБРАЗОМ:
NOT ЕСХ
SUB EDI, ЕСХ
ЕСЛИ ЖЕ ДИЗАССЕМБЛЕР РЕШИЛ, ЧТО ГРАНИЦА КОМАНД ПРОЛЕГАЕТ
МЕЖДУ БАЙТАМИ F7 И D1, ТО ЭТОТ ЖЕ КОД БУДЕТ ДИЗАССЕМБЛИРОВАН ТАК:
SHR DWORD PTR [EBP + EDI],L
STC
СТАТИЧЕСКИЙ МЕТОД
ТАКИМ ОБРАЗОМ, ПРОГРАММЫ ДИЗАССЕМБЛИРОВАНИЯ В СВОЕЙ РАБОТЕ МОГУТ
ДОПУСКАТЬ СЕРЬЕЗНЫЕ ОШИБКИ.
ДИЗАССЕМБЛЕРЫ УСЛОВНО МОЖНО РАЗДЕЛИТЬ НА «ГЛУПЫЕ» (DUMB) И «УМНЫЕ» (SMART).
«ГЛУПЫЕ» ДИЗАССЕМБЛЕРЫ ДАЖЕ НЕ ПЫТАЮТСЯ РЕШИТЬ ВЫШЕОПИСАННЫЕ ПРОБЛЕМЫ,
В РЕЗУЛЬТАТЕ ЧЕГО РЕЗУЛЬТАТ РАБОТЫ ДИЗАССЕМБЛЕРА НАПОМИНАЕТ АССЕМБЛЕРОВСКИЙ
ТЕКСТ ВЕСЬМА ОТДАЛЕННО.
В ТО ЖЕ ВРЕМЯ «ГЛУПЫЕ» ДИЗАССЕМБЛЕРЫ ПРЕОБРАЗУЮТ МАШИННЫЙ КОД ОЧЕНЬ
БЫСТРО (ПОЧТИ МГНОВЕННО). К «ГЛУПЫМ» ДИЗАССЕМБЛЕРАМ ОТНОСЯТСЯ ВСТРОЕННЫЕ
ДИЗАССЕМБЛЕРЫ ОТЛАДЧИКОВ И АНТИВИРУСНЫХ УТИЛИТ, ПРЕДНАЗНАЧЕННЫЕ ДЛЯ
ИНТЕРАКТИВНОГО ПРОСМОТРА НЕБОЛЬШИХ УЧАСТКОВ МАШИННОГО КОДА.
СТАТИЧЕСКИЙ МЕТОД
«УМНЫЕ» ДИЗАССЕМБЛЕРЫ ПРЕОБРАЗУЮТ МАШИННЫЙ КОД В АССЕМБЛЕРОВСКИЙ
НАСТОЛЬКО ТОЧНО, ЧТО В ОТДЕЛЬНЫХ СЛУЧАЯХ ПОВТОРНОЕ АССЕМБЛИРОВАНИЕ
ПРИВОДИТ К ТОМУ ЖЕ САМОМУ МАШИННОМУ КОДУ.
«УМНЫЕ» ДИЗАССЕМБЛЕРЫ РАЗЛИЧАЮТ КОМАНДЫ И ДАННЫЕ, ПРАКТИЧЕСКИ ВСЕГДА
ПРАВИЛЬНО ОПРЕДЕЛЯЮТ ГРАНИЦЫ МАШИННЫХ КОМАНД, ВЫДЕЛЯЮТ В МАШИННОМ
КОДЕ ОТДЕЛЬНЫЕ ФУНКЦИИ, ОТСЛЕЖИВАЮТ ПЕРЕКРЕСТНЫЕ ССЫЛКИ.
ОДНАКО ЗА ТАКИЕ ВОЗМОЖНОСТИ ПРИХОДИТСЯ ПЛАТИТЬ. ВРЕМЯ ДИЗАССЕМБЛИРОВАНИЯ
ПРОГРАММЫ «УМНЫМ» ДИЗАССЕМБЛЕРОМ МОЖЕТ СОСТАВЛЯТЬ ДЕСЯТКИ МИНУТ.
СТАТИЧЕСКИЙ МЕТОД
ЛЮБОЙ ДИЗАССЕМБЛЕР НЕ В СОСТОЯНИИ ВОССТАНОВИТЬ МАШИННЫЙ КОД
САМОРАСКРЫВАЮЩЕЙСЯ ИЛИ САМОШИФРУЮЩЕЙСЯ ПРОГРАММЫ.
В ЭТОМ СЛУЧАЕ ДИЗАССЕМБЛЕР ЛИБО ВЫДАЕТ БЕССМЫСЛЕННУЮ ПОСЛЕДОВАТЕЛЬНОСТЬ
КОМАНД, ЛИБО ИНТЕРПРЕТИРУЕТ БОЛЬШУЮ ЧАСТЬ ПРОГРАММЫ КАК ДАННЫЕ.
СУЩЕСТВУЕТ РЯД ПРИЕМОВ ПРОГРАММИРОВАНИЯ, ПРИ ПРИМЕНЕНИИ КОТОРЫХ
ГЕНЕРИРУЕТСЯ МАШИННЫЙ КОД, НЕКОРРЕКТНО ВОСПРИНИМАЕМЫЙ ДИЗАССЕМБЛЕРОМ.
СТАТИЧЕСКИЙ МЕТОД
СЛЕДУЕТ ОТМЕТИТЬ, ЧТО СОВРЕМЕННЫЕ ПРОГРАММНЫЕ ПРОДУКТЫ ИМЕЮТ РАЗМЕР,
ИЗМЕРЯЕМЫЙ ДЕСЯТКАМИ И СОТНЯМИ МЕГАБАЙТ, ЛИСТИНГ ПРОГРАММЫ НА ЯЗЫКЕ
АССЕМБЛЕРА ОБЫЧНО В ДЕСЯТКИ РАЗ ПРЕВОСХОДИТ ПО РАЗМЕРАМ ИСПОЛНЯЕМЫЙ ФАЙЛ.
ЗНАЧИТЕЛЬНАЯ ЧАСТЬ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ СВЯЗАНА С ОРГАНИЗАЦИЕЙ
ИНТЕРФЕЙСА, АНАЛИЗОМ КОНФИГУРАЦИИ КОМПЬЮТЕРА И ОПЕРАЦИОННОЙ СИСТЕМЫ,
РАСПРЕДЕЛЕНИЕМ И ЗАГРУЗКОЙ ПАМЯТИ И Т.П.
СТАТИЧЕСКИЙ МЕТОД
ТАКИМ ОБРАЗОМ, БОЛЬШАЯ ЧАСТЬ ПРОГРАММЫ НИКАК НЕ СВЯЗАНА С ЗАЩИТОЙ, И
ОПИСАНИЯ АЛГОРИТМОВ ЗАЩИТЫ (ИЛИ ДРУГИХ АЛГОРИТМОВ, ИНТЕРЕСУЮЩИХ
АНАЛИТИКА) ЗАНИМАЮТ МИЗЕРНУЮ ЧАСТЬ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ.
НАЙТИ ИХ В ТЕКСТЕ ПРОГРАММЫ НЕ ПРОЩЕ, ЧЕМ ИГОЛКУ В СТОГЕ СЕНА. ОСОБУЮ
ТРУДНОСТЬ СОСТАВЛЯЕТ ТО ОБСТОЯТЕЛЬСТВО, ЧТО ОТДЕЛЬНЫЕ, СРАВНИТЕЛЬНО
НЕБОЛЬШИЕ И ОБОЗРИМЫЕ УЧАСТКИ ЛИСТИНГА МАЛО ИНФОРМАТИВНЫ С ТОЧКИ ЗРЕНИЯ
ПОНИМАНИЯ ФУНКЦИЙ, ИСПОЛНЯЕМЫХ ДАННЫМ УЧАСТКОМ ПРОГРАММЫ.
РАСПОЛОЖЕНЫ ОТДЕЛЬНЫЕ БЛОКИ ПРОГРАММЫ В ИСПОЛНЯЕМОМ ФАЙЛЕ ДОСТАТОЧНО
ХАОТИЧНО.
СТАТИЧЕСКИЙ МЕТОД
В НАСТОЯЩЕЕ ВРЕМЯ СТАТИЧЕСКИЙ МЕТОД ИСПОЛЬЗУЕТСЯ ЧАЩЕ ВСЕГО КАК
ВСПОМОГАТЕЛЬНЫЙ ИНСТРУМЕНТ ДЛЯ ПРОВЕРКИ ПРЕДПОЛОЖЕНИЙ О
ВОССТАНАВЛИВАЕМЫХ АЛГОРИТМАХ ЗАЩИТЫ.
БОЛЬШИНСТВО АНАЛИТИКОВ ОТДАЮТ ПРЕДПОЧТЕНИЕ ДИНАМИЧЕСКОМУ МЕТОДУ.
СУДЯ ПО ВСЕМУ, РОЛЬ СТАТИЧЕСКОГО МЕТОДА МОЖЕТ ВОЗРАСТИ ПО МЕРЕ РАЗВИТИЯ
СРЕДСТВ АВТОМАТИЗАЦИИ АНАЛИЗА И ДАЛЬНЕЙШЕГО УСЛОЖНЕНИЯ И УВЕЛИЧЕНИЯ ПО
ОБЪЕМУ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ АНАЛИЗИРУЕМЫХ ПРОДУКТОВ.
СТАТИЧЕСКИЙ МЕТОД
ПРИ ПРАКТИЧЕСКОМ ПРИМЕНЕНИИ СТАТИЧЕСКОГО МЕТОДА СЛЕДУЕТ УЧИТЫВАТЬ ТИПОВЫЕ ОСОБЕННОСТИ
КОМПИЛЯЦИИ ПРОГРАММ, ИЗНАЧАЛЬНО НАПИСАННЫХ НА ЯЗЫКАХ ВЫСОКОГО УРОВНЯ:
• КАК ПРАВИЛО, КАЖДОЙ ФУНКЦИИ ОТВЕЧАЕТ ОДИН НЕПРЕРЫВНЫЙ УЧАСТОК ЛИСТИНГА
• ПАРАМЕТРЫ ПЕРЕДАЮТСЯ ФУНКЦИИ, КАК ПРАВИЛО, ЧЕРЕЗ СТЕК. В БОЛЬШИНСТВЕ ПРОГРАММ,
НАПИСАННЫХ НА C/C++ ДЛЯ ОПЕРАЦИОННОЙ СИСТЕМЫ WINDOWS, ВЫЗОВ
FUNCTION (А, B, С) ;
КОМПИЛИРУЕТСЯ В МАШИННЫЕ КОМАНДЫ ВИДА
PUSH С
PUSH Ь
PUSH A
CALL FUNCTION
СТАТИЧЕСКИЙ МЕТОД. ДЕКОМПИЛЯЦИЯ
IDA PRO DISASSEMBLER (АНГЛ. INTERACTIVE DISASSEMBLER) —
ИНТЕРАКТИВНЫЙ ДИЗАССЕМБЛЕР, КОТОРЫЙ ШИРОКО ИСПОЛЬЗУЕТСЯ ДЛЯ РЕВЕРСBНОГО
ИНЖИНИРИНГА.
ОН ОТЛИЧАЕТСЯ ИСКЛЮЧИТЕЛЬНОЙ ГИБКОСТЬЮ, НАЛИЧИЕМ ВСТРОЕННОГО КОМАНДНОГО
ЯЗЫКА, ПОДДЕРЖИВАЕТ МНОЖЕСТВО ФОРМАТОВ ИСПОЛНЯЕМЫХ ФАЙЛОВ ДЛЯ БОЛЬШОГО
ЧИСЛА ПРОЦЕССОРОВ И ОПЕРАЦИОННЫХ СИСТЕМ.
IDA – ДЕ-ФАКТО СТАНДАРТ С 2005 ГОДА.
СТАТИЧЕСКИЙ МЕТОД
ДЛЯ ТОГО ЧТОБЫ ДИЗАССЕМБЛИРОВАТЬ ФАЙЛ С ПОМОЩЬЮ ДИЗАССЕМБЛЕРА IDA,
СЛЕДУЕТ ОТКРЫТЬ ФАЙЛ ЧЕРЕЗ ПУНКТ МЕНЮ FILE / OPEN, ВЫБРАТЬ ПАРАМЕТРЫ
ДИЗАССЕМБЛИРОВАНИЯ (ОБЫЧНО МОЖНО ОСТАВИТЬ ПАРАМЕТРЫ, ЗАДАННЫЕ ПО
УМОЛЧАНИЮ) И ПОДОЖДАТЬ НЕСКОЛЬКО МИНУТ, ПОКА НЕ ЗАВЕРШИТСЯ
ДИЗАССЕМБЛИРОВАНИЕ.
ПОЛУЧЕННЫЙ ЛИСТИНГ МОЖНО НАЧАТЬ АНАЛИЗИРОВАТЬ ДО ПОЛНОГО ЗАВЕРШЕНИЯ
ДИЗАССЕМБЛИРОВАНИЯ, НО ЭТОТ ЛИСТИНГ БУДЕТ МЕНЕЕ ИНФОРМАТИВЕН.
ЛИСТИНГ, ПОЛУЧЕННЫЙ В РЕЗУЛЬТАТЕ ДИЗАССЕМБЛИРОВАНИЯ, МОЖНО ПРОСМАТРИВАТЬ
КАК ОБЫЧНЫЙ ТЕКСТОВЫЙ ФАЙЛ.
СТАТИЧЕСКИЙ МЕТОД
В БОЛЬШИНСТВЕ СЛУЧАЕВ IDA ПРАВИЛЬНО ОТЛИЧАЕТ КОД ОТ ДАННЫХ.
В ТЕХ РЕДКИХ СЛУЧАЯХ, КОГДА ДИЗАССЕМБЛЕР ОШИБАЕТСЯ, ПРЕДСТАВЛЕНИЕ ИНФОРМАЦИИ
МОЖНО ИЗМЕНИТЬ ВРУЧНУЮ С ПОМОЩЬЮ КЛАВИШ [С] (ПРЕОБРАЗОВАТЬ В КОД) ИЛИ [D]
(ПРЕОБРАЗОВАТЬ В ДАННЫЕ).
В ХОДЕ ДИЗАССЕМБЛИРОВАНИЯ IDA ИЗВЛЕКАЕТ СИМВОЛЬНУЮ ИНФОРМАЦИЮ ИЗ ВСЕХ
ВОЗМОЖНЫХ ИСТОЧНИКОВ И ПЫТАЕТСЯ НАЗНАЧАТЬ ВСЕМ ФУНКЦИЯМ И ПЕРЕМЕННЫМ
МАКСИМАЛЬНО ОСМЫСЛЕННЫЕ ИМЕНА.
ПОЛЬЗОВАТЕЛЬ В ЛЮБОЙ МОМЕНТ МОЖЕТ ИЗМЕНИТЬ ИМЯ ФУНКЦИИ ИЛИ ПЕРЕМЕННОЙ,
НАЗНАЧЕННОЕ ДИЗАССЕМБЛЕРОМ, НАЖАВ КЛАВИШУ [N] В СООТВЕТСТВУЮЩЕМ МЕСТЕ ОКНА
ДИЗАССЕМБЛЕРА И ВВЕДЯ НОВОЕ ИМЯ. ЭТО ИЗМЕНЕНИЕ ОТРАЖАЕТСЯ СРАЗУ ВО ВСЕМ
ЛИСТИНГЕ
СТАТИЧЕСКИЙ МЕТОД. ДЕКОМПИЛЯЦИЯ
ДЕКОМПИЛЯТОР — ПРОГРАММА, ТРАНСЛИРУЮЩАЯ ИСПОЛНЯЕМЫЙ
МОДУЛЬ (ПОЛУЧЕННЫЙ НА ВЫХОДЕ КОМПИЛЯТОРА) В ОТНОСИТЕЛЬНО
ЭКВИВАЛЕНТНЫЙ ИСХОДНЫЙ КОД НА ЯЗЫКЕ ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ.
ДЕКОМПИЛЯЦИЯ — ПРОЦЕСС ВОССОЗДАНИЯ ИСХОДНОГО КОДА ДЕКОМПИЛЯТОРОМ.
СТАТИЧЕСКИЙ МЕТОД. ДЕКОМПИЛЯЦИЯ
ЕСЛИ ИЗВЕСТНО НА КАКОМ ЯЗЫКЕ БЫЛА НАПИСАНА ДЕКОМПИЛИРУЕМАЯ ПРОГРАММА, ТО В
ПЕРВУЮ ОЧЕРЕДЬ ДИЗАССЕМБЛИРУЮТСЯ И АНАЛИЗИРУЮТСЯ БИБЛИОТЕКИ ВРЕМЕНИ
ИСПОЛНЕНИЯ (RTL — RUNTIME LIBRARY) КОМПИЛЯТОРА С ЭТОГО ЯЗЫКА, ТАК КАК В ОСНОВНОМ
КОМПИЛЯЦИЯ ПРОГРАММЫ СВОДИТСЯ К ВЫЗОВАМ С РАЗЛИЧНЫМИ ПАРАМЕТРАМИ ПРОЦЕДУР
ИЗ ЭТИХ БИБЛИОТЕК.
КРОМЕ ТОГО, МНОГИЕ КОМПИЛЯТОРЫ ПОЗВОЛЯЮТ УВИДЕТЬ, В КАКОЙ АССЕМБЛЕРНЫЙ КОД
ПРЕВРАЩАЮТСЯ ОПЕРАТОРЫ ПРОГРАММЫ ПОСЛЕ КОМПИЛЯЦИИ. ЭТИ КОНСТРУКЦИИ
СТАНОВЯТСЯ ШАБЛОНАМИ ДЛЯ ДЕКОМПИЛЯТОРА, ПОЭТОМУ ПРОЦЕСС ДЕКОМПИЛЯЦИИ В
НЕКОТОРОМ СМЫСЛЕ ПОХОЖ НА РАСПОЗНАВАНИЕ В МАШИННОМ КОДЕ КОНЕЧНОГО НАБОРА
ПОДОБНЫХ ШАБЛОНОВ.
ЛЕГЧЕ ВСЕГО РАСПОЗНАЮТСЯ ВЫЗОВЫ ПРОЦЕДУР И ВОЗВРАТЫ ИЗ НИХ. ОНИ СЛУЖАТ
ГРАНИЦАМИ ДЛЯ ВОССТАНОВЛЕНИЯ ОПЕРАТОРОВ ПРОЦЕДУРЫ.
СТАТИЧЕСКИЙ МЕТОД. ДЕКОМПИЛЯЦИЯ
IDA PRO DISASSEMBLER (АНГЛ. INTERACTIVE DISASSEMBLER) —
ИНТЕРАКТИВНЫЙ ДИЗАССЕМБЛЕР, КОТОРЫЙ ШИРОКО ИСПОЛЬЗУЕТСЯ ДЛЯ РЕВЕРСBНОГО
ИНЖИНИРИНГА.
ОН ОТЛИЧАЕТСЯ ИСКЛЮЧИТЕЛЬНОЙ ГИБКОСТЬЮ, НАЛИЧИЕМ ВСТРОЕННОГО КОМАНДНОГО
ЯЗЫКА, ПОДДЕРЖИВАЕТ МНОЖЕСТВО ФОРМАТОВ ИСПОЛНЯЕМЫХ ФАЙЛОВ ДЛЯ БОЛЬШОГО
ЧИСЛА ПРОЦЕССОРОВ И ОПЕРАЦИОННЫХ СИСТЕМ.
IDA – САМЫЙ ПОПУЛЯРНЫЙ ДИЗАССЕМБЛЕР.
ПРИМЕР ДЕКОМПИЛЯТОРА - ПЛАГИН HEX-RAYS ДЛЯ ДИЗАССЕМБЛЕРА IDA, ПОЯВИВШЕЙСЯ В
НОЯБРЕ 2007 Г.
Download