Е. В. КИСЛЯК
Московский инженерно-физический институт (государственный университет)
АВТОМАТИЗАЦИЯ ИНЖЕНЕРНОГО АНАЛИЗА
ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
В работе рассматриваются основы инженерного анализа ПО, а также проблема автоматизации задач, которые возникают в процессе дизассемблирования. Предлагается решение этой проблемы с помощью интеграции скриптового языка программирования в дизассемблер 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/


