УДК 004(06) Компьютерные системы и технологии Е.В. КИСЛЯК Московский инженерно-физический институт (государственный университет) АВТОМАТИЗАЦИЯ ИНЖЕНЕРНОГО АНАЛИЗА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ В работе рассматриваются основы инженерного анализа ПО, а также проблема автоматизации задач, которые возникают в процессе дизассемблирования. Предлагается решение этой проблемы с помощью интеграции скриптов ого языка программирования в дизассемблер IDA Pro. Согласно определению в [1] инженерный анализ ПО - это процесс анализа системы (ПО) с целью получения представления системы на более высоком уровне абстракции. Фактически это означает переход от машинного кода к алгоритмам и данным, используемым программой. Существуют следующие методы инженерного анализа ПО: наблюдение за работой программы. Иногда этот метод называют отладкой, что не является верным, так как помимо собственно отладчика возможно использование различных мониторов, перехватчиков шины (для драйверов) и т.д.; дизассемблирование - преобразование машинного кода в ассемблерный листинг и анализ этого листинга; декомпиляция - попытка получить исходный текст программы путем анализа машинного кода. Наиболее предпочтительным методом исследования является дизассемблирование с постепенным внесением изменений в ассемблерный листинг. Эти изменения являются как результатом анализа листинга, так и результатом использования отладчика или монитора. Это позволяет постепенно накапливать информацию о программе до тех пор, пока не будет достигнута поставленная цель. В настоящее время наиболее популярным дизассемблером является IDA Pro от Datarescue. Это связано с тем, что в этом продукте впервые было реализовано интерактивное взаимодействие с пользователем. Интерактивность позволяет решать такие проблемы как корректное распознавания кода и данных, восстановление (ввод пользователем) данных, которые необратимо теряются в ходе компиляции (имена меток, имена функций, операнды), а также позволяет осуществлять навигацию по дизассемблированному листингу. ISBN 5-7262-0710-6. НАУЧНАЯ СЕССИЯ МИФИ-2007. Том 12 170 УДК 004(06) Компьютерные системы и технологии В процессе дизассемблирования часто возникают задачи, которые проще решить алгоритмически, а не управляя дизассемблером вручную. Для этого 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://www.ruby-lang.org/ ISBN 5-7262-0710-6. НАУЧНАЯ СЕССИЯ МИФИ-2007. Том 12 171