Е. В. КИСЛЯК

Московский инженерно-физический институт (государственный университет)

АВТОМАТИЗАЦИЯ ИНЖЕНЕРНОГО АНАЛИЗА

ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

В работе рассматриваются основы инженерного анализа ПО, а также проблема автоматизации задач, которые возникают в процессе дизассемблирования. Предлагается решение этой проблемы с помощью интеграции скриптового языка программирования в дизассемблер IDA Pro.

Согласно определению в [1] инженерный анализ ПО - это процесс анализа системы (ПО) с целью получения представления системы на более высоком уровне абстракции. Фактически это означает переход от машинного кода к алгоритмам и данным, используемым программой.

Существуют следующие методы инженерного анализа ПО:

    наблюдение за работой программы. Иногда этот метод называют отладкой, что не является верным, так как помимо собственно отладчика возможно использование различных мониторов, перехватчиков шины (для драйверов) и т. д.; дизассемблирование - преобразование машинного кода в ассемблерный листинг и анализ этого листинга
    ; декомпиляция - попытка получить исходный текст программы путем анализа машинного кода.

Наиболее предпочтительным методом исследования является дизассемблирование с постепенным внесением изменений в ассемблер-ный листинг. Эти изменения являются как результатом анализа листинга, так и результатом использования отладчика или монитора. Это позволяет постепенно накапливать информацию о программе до тех пор, пока не будет достигнута поставленная цель.

В настоящее время наиболее популярным дизассемблером является IDA Pro от Datarescue. Это связано с тем, что в этом продукте впервые было реализовано интерактивное взаимодействие с пользователем. Интерактивность позволяет решать такие проблемы как корректное распознавания кода и данных, восстановление (ввод пользователем) данных, которые необратимо теряются в ходе компиляции (имена меток, имена функций, операнды), а также позволяет осуществлять навигацию по дизассемблированному листингу.

НЕ нашли? Не то? Что вы ищете?

В процессе дизассемблирования часто возникают задачи, которые проще решить алгоритмически, а не управляя дизассемблером вручную. Для этого IDA Pro предоставляет скриптовый язык IDС и набор функций для манипулирования представлением загруженной программы. Однако, язык IDC не позволяет получить все преимущества от использования скриптов из-за своей примитивности и практически полного отсутствия стандартных библиотек. Более предпочтительным подходом является встраивание полноценного скриптового языка, в качестве которого был выбран Ruby [2]. Эта идея реализована в рамках данной работы.

Для встраивания Ruby в дизассемблер IDA Pro был реализован модуль расширения дизассемблера, который управляет интерпретатором Ruby и осуществляет связь скриптов с ядром дизассемблера. Интерфейс функций IDC был полностью сохранен, что позволяет легко перейти к использованию IDARuby вместо IDC.

В качестве примера демонстрируется восстановление импорта при анализе дампа PE файла и обработка ссылок на строки при анализе ELF файла, который был скомпилирован компилятором GCC в режиме PIC.

Эти примеры показывают насколько полезными являются такие особенности языка Ruby как встроенные хеш-таблицы, массивы, регулярные выражения, блоки и итераторы. Это позволяет использовать как императивный, так и функциональный подход к разработке алгоритмов.

Список литературы

1.  Elliot J. Chikofsky and James H. Cross II. Reverse engineering and design recovery: A taxonomy. // IEEE Softw., 7(1):13-17, 1990.

2.  Ruby Programming Language, http://*****by-lang. org/