Планшеты и одноплатные микрокомпьютеры используются хакерами для самых разных целей — от создания собственного интернет-телефона или радиостанции до установки скрытого видеонаблюдения и управления электронными замками. Тестировать нужные программы и мобильные приложения можно, не выходя из Windows и даже не имея тестового железа. Делать это помогают две вещи: эмуляция архитектур ARM и MIPS на процессоре x86-64 и запуск Android (Arch Linux, Raspbian...) в качестве гостевой операционки.

Эмуляторы и средства виртуализации существовали давно. Долгое время они были специфическими инструментами со сложной конфигурацией и работали очень медленно. Их современный период начался в 2006 году, когда французский программист Фабрис Беллар представил свой эмулятор QEMU (Quick EMUlator). В определенных условиях он работал очень быстро из-за использования динамической трансляции кода.

INFO


Ускорить работу гостевой ОС можно за счет процессора с поддержкой расширений виртуализации (Intel VT-x, AMD-V, SLAT) и установки дополнительных модулей ОЗУ.
 

Ставим эмулятор

Устанавливается он простой распаковкой ZIP-архива, а со страницы проекта можно скачать исходные коды или готовые бинарники для Linux, Windows, FreeBSD и OS X. QEMU умеет эмулировать процессоры Intel и AMD с архитектурами x86 и x86-64, а также PPC 440, PPC 970, S/390, ARM (Cortex A15, Arch64) и MIPS32. Полный список насчитывает 56 процессорных архитектур, включая исключительно редкие.

Поддержка 56 процессорных архитектур в QEMU
Поддержка 56 процессорных архитектур в QEMU

Из-за всеядности и легковесности этот эмулятор часто используют при отладке программ, предназначенных для разных микрокомпьютеров и гаджетов. К примеру, можно писать в Windows программы для Raspberry Pi и сразу же проверять их без копирования в память микрокомпьютера. В качестве конкретного примера возьмем эмуляцию ОС Raspbian. Мучений предстоит много, но все они будут однократными.

Нам понадобится ядро Linux, скомпилированное для архитектуры ARM, и последняя версия Raspbian. Поместим ядро Linux ARM в каталог QEMU и распакуем туда же Raspbian.zip. Приступим к конфигурации виртуального диска, чтобы на нем появилось место для нашего кода.

Добавляем пару гигабайтов свободного места к образу диска:

qemu-img.exe resize 2015-05-05-raspbian-wheezy.img +2G

Создадим для удобства в каталоге QEMU батник и запишем в него команды запуска эмулятора с определенными параметрами: имитировать процессор архитектуры ARM, выделить 256 Мбайт в ОЗУ и создать виртуальный дисковый раздел с файловой системой ext4. Это все одна строка, но длинная:

qemu-system-arm.exe -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw init=/bin/bash" -hda 2015-05-05-raspbian-wheezy.img

Если задать больше 256 Мбайт, то эмулятор вылетит с ошибкой, но в реальном Raspberry Pi Model A памяти как раз столько.

Загрузив Raspbian в режиме командной строки, откроем с помощью текстового редактора nano список динамических библиотек, которые будут загружены перед программой.

nano /etc/ld.so.preload

Нам требуется всего лишь задать # в начале строки /usr/lib/... и сохранить изменения. Выходим по нажатию и жмем Y.

 

Настраиваем эмулятор

Затем продолжим делать более глубокие настройки. Создадим новый файл с правилами для менеджера устройств:

nano /etc/udev/rules.d/90-qemu.rules

Запишем в него символьные ссылки:

KERNEL=="sda", SYMLINK+="mmcblk0"
KERNEL=="sda?", SYMLINK+="mmcblk0p%n"
KERNEL=="sda2", SYMLINK+="root"

Сохраним изменения, выйдем из режима эмуляции и продолжим настройку в среде Windows. В созданном ранее батнике убираем ненужные больше опции загрузки init=/bin/bash вместе с предшествующим пробелом. Пересохраняем батник и запускаем его снова.

При загрузке может появиться несколько сообщений об ошибке, но все они некритичные и могут быть проигнорированы. Снова создадим правила для менеджера устройств, поскольку конфиг изменился:

nano /etc/udev/rules.d/90-qemu.rules

И опять запишем в него символьные ссылки:

KERNEL=="sda", SYMLINK+="mmcblk0"
KERNEL=="sda?", SYMLINK+="mmcblk0p%n"
KERNEL=="sda2", SYMLINK+="root"

Раскладка клавиатуры теперь другая, поэтому кавычки вводятся по нажатию . Сохраняем файл и пишем команду exit. На этот раз ее выполнение приведет не к выходу в Windows, а к появлению встроенного меню с настройками Raspbian. Пока ничего не меняем, а просто выходим в командную строку. Для этого нужно нажать Tab, выбрать Finish и выполнить перезагрузку:

sudo reboot

Эмуляция завершится, и после перезапуска нашего батника начнется нормальная загрузка Raspbian, во время которой надо будет ввести логин и пароль. По умолчанию логин — pi, пароль — raspberry.

Чтобы использовать ранее добавленные два гигабайта, нам требуется попасть в меню конфигурации:

sudo ln -snf mmcblk0p2 /dev/root
sudo raspi-config
Настройка Raspbian в QEMU
Настройка Raspbian в QEMU

Когда выберем первый пункт открывшегося меню (Expand Filesystem), оно исчезнет на несколько секунд, а виртуальный раздел /root partition увеличится на два гигабайта (размер можно задать произвольный). Нажимаем Finish, соглашаемся на перезагрузку и снова запускаем Raspbian через батник. Можно сразу обновить дистрибутив классической связкой команд update и upgrade в одну строку с автоподтверждением действий:

sudo apt-get update && sudo apt-get dist-upgrade –y

Если нужен графический интерфейс, то приступаем к опциональному этапу конфигурации. В нем понадобится выбрать третий пункт меню настроек (Enable boot to Desktop), где мы указываем загрузку «иксов» для пользователя pi:

sudo raspi-config

Там же можно выбрать другую раскладку и дополнительные опции. После перезагрузки система автоматически запустит десктоп с чернобыльской малинкой на весь экран.

Запуск Raspbian в графическом режиме
Запуск Raspbian в графическом режиме

QEMU в качестве конвертера

При необходимости можно конвертировать образы виртуальных машин друг в друга с помощью QEMU:

qemu-img convert –f исходный_формат –O конечный_формат имя_файла

Поддерживаются форматы RAW, QED, Qcow2, VDI, VMDK и VPC.

 

Эмулируем Android

QEMU — проект опенсорсный, так что он быстро развивался и обрастал дополнениями. Фактически он стал основой для Oracle VirtualBox и многих других эмуляторов. Одновременно росло и число задач, решаемых с помощью виртуальных машин. Например, прежде чем ставить сомнительное приложение на смартфон или планшет, его удобно проверить в изолированной среде.

Раньше для этого приходилось использовать эмуляцию ядра ARM и мириться с неизбежными тормозами. Сейчас все стало гораздо проще, поскольку в рамках проекта Android-x86 волонтеры портируют исходный код гугловской операционки на платформу x86. Текущая версия Android 4.4 в два счета поднимается с дефолтными настройками как «другая 32-битная ОС Linux». В ней можно экспериментировать с новыми программами и выполнять их детальный анализ (например, с помощью модулей AVL Pro v.2.x). Можно даже получать на халяву платный софт на общую сумму до 10 тысяч долларов (с одного аккаунта с виртуальной пропиской в США), став участником программы лояльности Amazon Undeground. Загруженные APK без проблем переносятся на реальное устройство.

Анализ мобильных приложений в виртуальной среде Android-x86
Анализ мобильных приложений в виртуальной среде Android-x86

Если же под видом интересного приложения в Android-x86 установится троян-шифровальщик, биткойн-майнер или скрытая звонилка на платные номера, то их можно будет безнаказанно препарировать в той же виртуалке, перехватывая управление и откатываясь на предыдущее состояние.

Защита от запуска в виртуальных машинах

Иногда исследование программ и особенно разных зловредов в виртуальной машине оказывается сильно затруднено. Дело в том, что у виртуалок есть специфические и общеизвестные идентификаторы устройств (например, BIOS, CPUID или MAC). Все они либо имитируют древние платформы, которые работают на совершенно немыслимых частотах (вроде Pentium II, запущенного на трех гигагерцах), либо прямо указывают виртуальный характер устройства.

Установить такой рекорд разгона можно только в виртуалке
Установить такой рекорд разгона можно только в виртуалке

Если в виртуалке запускается любая версия Windows, то ее реестр наполняется прямыми указаниями на поставщика драйверов и эмуляцию физических устройств. Строки с текстом VMware, VirtualBox, Parallels Tools Device будут часто встречаться в секции оборудования \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ и
других ветках реестра, где у запущенной на реальном железе системы их быть не должно.

Маркеры виртуальных устройств
Маркеры виртуальных устройств

В программу может быть встроена функция определения виртуальной среды и защиты от исследования в ней. Осознав себя в Матрице, хитрый вирус просто впадет в спячку до запуска на реальном железе.

Оставить мнение