Платформа для анализа программ на основе эмулятора QEMU
Платформа для анализа программ на основе эмулятора QEMU Среди эмуляторов с открытым исходным кодом QEMU занимает особое место, поскольку в практике промышленного программирования именно ему отдают предпочтение, когда требуется вести кросс-разработку (различные процессорные архитектуры целевого устройства и компьютера, на котором ведется разработка). На основе Qemu крупные IT-компании, такие как Google и Samsung, разрабатывают специализированные эмуляторы для мобильных устройств.
Qemu в режиме полносистемной эмуляции поддерживает более 10 семейств процессоров, в число которых входят x86, PowerPC, Sparc, MIPS, ARM.
Открытость исходного кода позволяет свободно расширять возможности Qemu и использовать его для:
- создания новых виртуальных платформ,
- отладки загрузчиков и ядерного кода ОС, в том числе драйверов эмулирумого оборудования,
- анализа вредоносного ПО,
- записи работы виртуальной машины для последующего воспроизведения.
Запись и воспроизведение сценариев работы
Детерминированное воспроизведение работы виртуальной машины облегчает изучение ошибок, проявление которых нерегулярно.
Разработанная технология фактически не ограничивает продолжительность записи и гарантирует воспроизведение работы всей виртуальной платформы с точностью до машинной команды. Однажды записанный сценарий можно воспроизводить и анализировать многократно без изменения поведения программы. Средства анализа, например, отладчик, и изменившееся внешнее окружение не могут повлиять на работу кода, воспроизводящегося в гостевой системе. Механизм записи/воспроизведения уже включен в QEMU 2.8 и работает для гостевых систем на платформах x86, ARM и MIPS.
Удалённая отладка
QEMU поддерживает интерфейс удаленной отладки виртуальной машины.
Архитектура современного отладчика разделяет пользовательский интерфейс и сам механизм отладки программы. В отладчике GDB есть возможность установить связь между интерфейсом и сервером на основе сетевых сокетов. Реализация gdb-сервера в эмуляторе Qemu позволяет отлаживать программы и код ядра в виртуальной машине с помощью GDB, IDA, Eclipse.
Обратная отладка
С помощью обратной отладки можно возвращаться назад к прежним состояниям программы. Разработчик во время отладки достигает точки срабатывания ошибки, после чего пытается определить, как в прошлом происходила работа с переменными, повлиявшими на сбой. Классическая отладка для поиска таких моментов «в прошлом» требует перезапуска программы, часто – многократного.
Идея обратной отладки заключается в возврате к предыдущему состоянию программы в рамках одного запуска. Интерфейс GDB включает в себя команды reverse step и reverse continue, рассчитанные на серверную часть отладчика с такой возможностью. Мы реализовали поддержку их команд в QEMU и она будет подана для включения в публичную версию эмулятора.
Анализ гостевой системы
Отладка всей виртуальной машины требует знаний о размещении программ и модулей в памяти. Мы реализовали механизмы интроспекции, которые позволяют извлекать эту информацию из виртуальных машин на Windows и Linux. Интроспекция может извлекать из гостевой системы:
- последовательность выполняемых инструкций,
- последовательность обращений к памяти,
- выполняемые системные вызовы,
- создаваемые процессы,
- загружаемые модули,
- обращения к файлам.
Эмуляция новых платформ и периферии
Естественный ход разработки новых устройств и платформ в эмуляторе Qemu предполагает наличие полного комплекта документации, описывающей архитектуру набора команд процессора, карту памяти и периферийные устройства. В свою очередь каждое новое периферийное устройство должно быть снабжено документацией.
Разработка новой платформы в эмуляторе Qemu «с нуля» требует реализации:
- нового виртуального процессора и транслятора его команд в промежуточное представление TCG;
- виртуального устройства управления памятью (MMU);
- виртуальных периферийных устройств;
- интеграции всего перечисленного в новой виртуальной платформе;
- при необходимости – расширение внутренних интерфейсов Qemu.
В Qemu могут быть реализованы нужный процессор, транслятор TCG, MMU, часть периферийных устройств. Но даже в этом случае необходима интеграция компонент платформы и последующая отладка ее конфигурации.
К сожалению, документация не всегда доступна, не всегда полна, а иногда содержит ошибки. Исполняемый код ПО для разрабатываемой виртуальной платформы становится единственным источником информации: ошибки и неточности в эмулируемой аппаратуре выявляются через сбои в работе ПО.
Разработку приходится организовывать в виде чередующихся этапов разработки (отладки) виртуальной аппаратуры и исследования кода, работающего на этой аппаратуре.
Облегчить деятельность разработчика призван комплекс программных инструментов, автоматизирующий рутинные действия во время создания новых виртуальных устройств и при последующей интеграции компонент виртуальной платформы.
Один из инструментов – генератор платформ, предоставляющий декларативное API на языке Python для описания конфигурации платформы. Для упрощения проектирования платформ и устройств разработан графический пользовательский интерфейс.
Исполнитель
Перейти к списку всех проектов