emu

сравнительный анализ эмуляторов

крис касперски ака мыщъх, no-email

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

Всякая операционная система имеет свои особенности и поведение программы, запущенной под Windows 9x, может существенным образом отличаться от Windows NT. Зоопарк UNIX-подобных систем и генетически мутированных клонов лучше вообще не вспоминать. Хакеру, занимающемуся сетевой безопасностью, необходимо иметь по меньшей мере три системы: Windows NT, LINUX и Free BSD, ну и другие флагманы рынка не помешают. Многие уязвимости (и, в частности, ошибки переполнения) проявляются только на строго определенных версиях оси и отсутствуют на всех остальных. А раз так, написанием и отладкой эксплоита абы на чем не займешься… Но постоянно переставать свою рабочую ось – это не только чудовищная потеря времени (а время всегда работает простив нас), но еще и риск потери всех накопленных данных!

К тому же, crash-тесты на переполнение, заканчивающиеся сбросом дампа ядра, – это хороший способ превратить файловую систему в мешанину. И хотя потерянные данные можно полностью или частично восстановить – вы должны уметь это делать, оставляя за своими плечами гигантский опыт борьбы с разрушениями. Сухая теория (равно как и NortonDiskDestroyer) только мешает. Вот и приходится заблаговременно подключать отдельный винчестер и зверски над ним издеваться, то погружая файловую систему в небытие, то возвращая ее к жизни.

Эксперименты с вирусами и эксплоитами так же следует проводить на отдельной полностью изолированной от внешнего мира машине, поскольку система разграничения доступа, встроенная в Windows NT и UNIX-системы далеко не безупречна и малейшая небрежность, допущенная исследователем, зачастую оборачивается тотальным разрушением.

Традиционно эти задачи решались путем приобретения нескольких компьютеров или на худой конец множества жестких дисков, попеременно подключаемых к одной машине. Но первое дорого (и к тому же все эти компьютеры надо где-то размещать! площади средне статической квартиры для них скорее всего окажется недостаточно), а второе – не эстетично и не удобно, к тому же жесткие диски довольно скептически относятся к перспективе кочевой жизни, покрываясь «бэдами» при каждом ударе.

Теперь же этот кошмар мало-помалу отходит в прошлое. Мощь современных процессоров позволяет эмулировать весь персональный компьютер целиком, позволяя выполнять на нем программы в реальном времени и с приемлемой скоростью. Эмуляторы плодятся как ежики после дождя – VMWare, Virtual PC, Bochs, DOS-Box… и каждый день появляются все новые и новые. Какой из них выбрать? Большинство публикаций, посвященных эмуляторам, ориентируются главным образом на геймеров и системных администраторов. Первым важна скорость и качественный звук, вторым – наличие механизмов взаимодействия между виртуальными машинами. Хакерам же на все это наплевать. Главное – чтобы работал Айс, ну и встроенный (build-in, internal, integrated) отладчик не помешает. К тому же, основное преимущество эмуляции над «живым» процессором заключается отнюдь не в самой эмуляции как таковой. Но не будем забегать вперед…

Рисунок 1 эмулятор как полигон для отработки навыков по восстановлению файловой системы

Большинство эмуляторов предъявляют весьма утерянные требования к аппаратуре. Для комфортной работы с Windows 2000 и Free BSD 4.5 процессора Pentium-III 733 MHz будет вполне достаточно (в частности, VM Ware превращает его в Pentium III 336 MHz, а Virtual PC в Pentium III 187 MHz, короче говоря, QUAKE I хоть и на пределе, но все-таки тянет).

Рисунок 2 диагностика виртуальной машины, созданной эмулятором VM Ware

Требования к памяти намного более жестки. Как минимум необходимо иметь 128 Мбайт для основной операционной системы (обычно называемой «хозяйкой» – от английского host) и по 128 – 256 Мбайт для каждой из одновременно запущенных виртуальных машин (или, иначе говоря, «гостей» – от английского guest). Естественно, количество потребляемой памяти определяется типом эмулируемой операционной системы. Так, если это простушка MS-DOS то для нее и 4 Мбайт вполне хватит. На 256 Мбайтах уже можно сносно эмулировать Windows 2000/XP/2003, запущенной поверх w2k или аналогичной операционной системы.

Объем физического жесткого диска в общем-то некритичен. Виртуальные машины создаются отнюдь не для накопления данных и за редкими исключениями не содержат ничего кроме операционной системы в типичном варианте поставки и джентльменского набора сопутствующих ей приложений, что в совокупности отнимает не более гигабайта дискового пространства. Причем, ни один из известных мне эмуляторов не требует непосредственного доступа к физическому жесткому диску. Вместо этого, образ виртуального винчестера размещается в обыкновенном файле, полностью подчиняющегося хозяйственной операционной системе. Собственно говоря, виртуальные диски бывают по меньшей мере двух типов – фиксированные и динамические. При создании фиксированного диска, эмулятор сразу же «растягивает» файл-образ на весь требуемый объем, даже если тот не содержит никакой полезной информации. Динамические диски, напротив, хранят в образе лишь реально задействованные виртуальные сектора, постепенно увеличивая объем образа по мере его заполнения актуальными данными. Заманчивая, перспектива, не правда ли? Вместо того, чтобы поровну дробить свой физический жесткий диск между виртуальными машинами, мы можем выделить каждой из них практически все свободное физическое пространство, а там… пусть они сами разбираются кому из них оно нужнее. Однако, не все так просто! Производительность динамических дисков намного ниже чем фиксированных, да к тому же они подвержены внутренней фрагментации (не путать с фрагментацией файла-образа и фрагментацией эмулируемой файловой системы!). И хотя некоторые из эмуляторов (в частности VM Ware) содержат встроенные дефрагментаторы, они все равно не решают проблемы. К тому же формат динамических дисков не стандартизован и образы различных эмуляторов категорически не совместимы друг с другом.

Остальное оборудования может быть любым – на скорость эмуляции оно практически никак не влияет.

При выборе подходящего эмулятора, хакеры обычно руководствуются следующими критериями: защищенностью, расширяемостью, открытостью исходных текстов, качеством и скоростью эмуляции, наличием встроенного отладчика и гибкостью механизмов работы со snap-shot'ами. Рассмотрим все эти пункты поподробнее.

Защищенность. Запуская агрессивную программу на эмуляторе, очень сложно отделаться от мысли, что в любой момент она может вырваться из под его контроля, оставляя за собой длинный шлейф разрушений. Скажем прямо, эти опасения вполне обоснованы. Многие из эмуляторов (DOS-BOX, Virtual PC) содержат «дыры», позволяющие эмулируемому коду напрямую обращаться к памяти самого эмулятора (например, вызывать от его имени и с его привилегиями произвольные API-функции хозяйской операционной системы). Однако, «пробить» эмулятор может только специальным образом спроектированная программа, так что при всей теоретической обоснованности угрозы, вероятность ее практической реализации близка к нулю – эмуляторы не настолько популярны, чтобы агрессоры взялись на них всерьез.

Сетевое взаимодействие – другое дело. Эмуляция виртуальной локальной сети сохраняет все уязвимости хозяйской операционной системы и сетевой червь может ее легко атаковать! Поэтому, хозяйская операционная система из виртуальной локальной сети должна быть в обязательном порядке исключена. Естественно, такое решение существенно затрудняет общение виртуальных машин с внешним миром, и поэтому им часто пренебрегают. Кстати сказать, персональные брандмауэры в большинстве своем не контролируют виртуальные сети и не защищают от вторжения.

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

Расширяемость. Профессионально-ориентированный эмулятор должен поддерживать возможность подключения внешних модулей, имитирующих нестандартное оборудование (например, HASP). Особенно это актуально для исследования защит типа Star Force 3, напрямую взаимодействующих с аппаратурой и привязывающихся к тем особенностям ее поведения, о которых штатные эмуляторы порой даже и не подозревают.

Некоторые из эмуляторов расширяемы, некоторые нет. Но даже у самых расширяемых из них степень маневренности и глубина конфигурабельности довольно невелика и поверхностно документирована (если документирована вообще). Наверное это происходит от того, что фактор расширяемости реально требуется очень и очень немногим… Эмуляторы ведь пишут не для хакеров! А жаль!

Открытость исходных текстов. Наличие исходных текстов частично компенсирует свинское качество документации и хреновую расширяемость эмулятора. Если подопытная программа отказывается выполняться под эмулятором, исходные тексты помогут разобраться в ситуации и устранить дефект. К тому же мы можем оснастить эмулятор всем необходимым нам инструментарием. Например, дампером памяти, или back tracer'ом, позволяющим прокручивать выполнение программы в обратном порядке (между прочим, классная вещь для взлома, скажу я вам!). А возможность оперативного добавления недокументированных машинных команд или наборов инструкций новых процессоров?

К сожалению, коммерческие эмуляторы распространяются без исходных текстов, а Open Source эмуляторы все еще не вышли из юношеского возраста и для решения серьезных задач непригодны. Увы! «Мир» – это синоним слова «несовершенство»!

Качество эмуляции. Какой прок от эмулятора, если на нем нельзя запускать soft-ice? Можно, конечно, использовать и другие отладчики (например, Olly Debugger), но их возможности намного более ограничены, к тому же на некачественных эмуляторах некоторые из защищенных программ просто не идут!

Для увеличения скорости эмуляции многие из разработчиков сознательно усекают набор эмулируемых команд, поддерживая только наиболее актуальные из них (в особенности это относится к привилегированным командам защищенного режима, командам математического сопроцессора, включая «мультимедийные», и некоторым редкоземельным командам реального режима). Служебные регистры, флаги трассировки и другие подобные им возможности чаще всего остаются незадействованными. Тем не менее, такие эмуляторы пригодны не только для запуска игрушек! Их можно использовать как «карантинную» зону для проверки свежераздобытых программ на вирусы или как подопытную мышь для экспериментов с тем же Disk Editor'ом например.

Коммерческие эмуляторы в большинстве своем используют механизмы динамической эмуляции, эмулируя только привилегированные команды, а все остальные выполняя на «живом» процессоре – в сумеречной зоне изолированного адресного пространства, окруженной частоколом виртуальных портов, что не только существенно увеличивает производительность, но и автоматически добавляет поддержку всех новомодных мультимедийных команд (разумеется, при условии, что их поддерживает ваш физический процессор).

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

Встроенный отладчик. Защищенные программы всячески противостоят отладчикам, дизассемблерам, дамперам и прочему хакерскому оружию. Как правило, до нулевого кольца дело не доходит, хотя некоторые защиты (например, extremeprotector) работают и там. Существуют десятки, если не сотни, способов сорвать отладчику крышу, отправляя его в анал, и противостоять им достаточно трудно, особенно если вы только начали хакерствовать.

Могущество эмулятора как раз и заключается в том, что он полностью контролирует выполняемый код и обычные антиотладочные приемы на нем не срабатывают. К тому же, аппаратные ограничения эмулируемого процессора на сам эмулятор не распространяются. В частности, количество «аппаратных» точек останова не обязано равняться четырем, как на x86. При необходимости, эмулятор может поддерживать тысячу или даже миллион точек останова, причем условия их срабатывая могут быть сколь угодно извращенными (например, можно всплывать на каждой команде Jx, следующей за командой TEST EAX, EAX, соответствующей конструкции if (my_func())…).

Естественно, для этого эмулятор должен быть оснащен интегрированным отладчиком. Любой другой отладчик, запущенный под эмулятором, например soft-ice, никаких дополнительных преимуществ не получает. Возможности имеющихся интегрированных отладчиков достаточно невелики и обеспечивают ничуть не лучшую функциональность, чем debug.com, а нередко существенно уступают ему, поэтому, к ним стоит прибегать лишь в крайних случаях, когда обыкновенные отладчики с защитой уже не справляются.

Из всех существующих эмуляторов наибольшей популярностью пользуются: DOS-BOX, Bochs, MicrosoftVirtual-PC и VM Ware, каждый из которых имеет свои особенности, свои сильные и слабые стороны и, конечно же, свой круг поклонников. Совершенно не претендуя на беспристрастное сравнение, автор рискнул высказать свою точку зрения, подчеркивая те характеристики эмуляторов, которые ему по душе и игнорируя все остальные. В конечном счете, любое описание субъективно…

DOS-BOX

Бесплатный эмулятор, распространяющийся в исходных текстах. Эмулирует единственную операционную систему – MS DOS 5.0, главным образом применяясь для запуска старых игр. Жесткие диски не эмулируются (эмуляция дискового ввода-вывода заканчивается на прерывании INT 21h) и soft-ice на нем не идет. Зато cup386 (распаковщик исполняемых файлов плюс отладчик) работает вполне исправно (см. рис. 3). Так же имеется неплохой интегрированный отладчик (правда, для этого эмулятор должен быть перекомпилирован с отладочными ключами).

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

Поддерживаются три режима эмуляции – полная, частичная и динамическая. Полнота «полной» эмуляции на самом деле довольно условна (soft-ice ведь не идет!), однако, для подавляющего большинства неизвращенных программ с лихвой хватает и частичной. Оба этих режима достаточно надежны и вырваться за пределы эмулятора нереально, правда производительность виртуальной машины оставляет желать лучшего – Pentium III 733 MHz опускается до 13.17 MHz, замедляясь более чем в 50 раз. Модуль динамической эмуляции (выполняющий код на «живом» процессоре) все еще находится в стадии разработки и текущая версия содержит много ошибок, некоторые из которых фатальны, поэтому, пользоваться им не рекомендуется (хотя его производительность вчетверо выше).

Обмен данными с внешним миром происходит либо через прямой доступ к CD-ROM, либо через монтирование каталогов физического диска на виртуальные логические диски доступные из-под эмулятора через интерфейс INT 21h, что обеспечивает достаточно надежную защиту от вредоносных программ. Уничтожить смонтированную директорию они смогут, но вот все остальные – нет!

DOS-BOX хорошо подходит для экспериментов с большинством MS-DOS-вирусов (исключая, пожалуй, лишь тех из них, что нуждаются в прерывании INT 13 или портах ввода/вывода), а так же взлома программ, работающих как в реальном, так и защищенном режимах.

Рисунок 3 отладчик cup386, запущенный под управлением эмулятора DOS-Box (непосредственно из-под Windowscpu386 не запускается)

Bochs

Подлинно хакерский эмулятор, ориентированный на профессионалов. Простые смертные находят его через чур запутанным и непроходимо сложным. Здесь все настраивается через текстовые конфигурационные файлы – от количества процессоров (кстати говоря, Bochs единственный из всех известных мне эмуляторов, позволяющий эмулировать более одного процессора!), до геометрии виртуального диска.

Это некоммерческий продукт с открытыми исходными текстами и впечатляющим качеством эмуляции. Контроллеры гибких и жестких IDE-дисков эмулируются на уровне портов ввода/вывода, обеспечивая совместимость практически со всеми низкоуровневыми программами. Полностью эмулируется защищенный режим процессора. Во всяком случае soft-ice запускается вполне успешно (правда, работает несколько нестабильно, периодически завешивая виртуальную клавиатуру). Имеется достаточно приличный интегрированный отладчик с неограниченным количеством виртуальных точек останова и функций обратной трассировки.

К сожалению, невысокая скорость эмуляции не позволяет запускать никакие графические системы. Судите сами – эффективная тактовая частота моего Pentium III 733MHZ падает до 1.49 MHZ. Это же сколько часов Windows 2000 будет загружаться?!

Работа с дисковыми образами реализована через то место, куда Макар телят не гонял. Поддерживаются только фиксированные диски, а сами образы создаются внешними средствами от независимых разработчиков. К счастью, имеется возможность прямого доступа к CD-ROM приводу, но вот к физическим гибким дискам прямого доступа нет и потому чтобы вынести пару файлов из виртуальной машины приходится надрывать задницу. Возможность работы со snap-shoot'ами так же отсутствуют (под shap-shoot'ом Bochs понимает отнюдь не состояние виртуальной машины, а копию ее экрана, который нам на фига).

Эмулятор хорошо подходит для исследования вирусов и отладки извращенных программ, работающий в MS-DOS или терминальном режиме LINIX/Free BSD, а так же экспериментов с различными файловыми системами.

Рисунок 4 отладчик soft-ice, запущенный в MS-DOS сессии под управлением эмулятора Bochs, запущенного из-под Windows

Microsoft Virtual PC

Неплохой коммерческий эмулятор, распространяющийся без исходных текстов, но зато обеспечивающий приличную скорость эмуляции, превращающую Pentium III 733 MHz в Pentium III 187 MHz (динамический режим эмуляции обеспечивает поддержку всех машинных команд физического процессора).

Полностью эмулируется AMI BIOS (с возможностью конфигурирования через Setup – см. рис. 5), чипсет Intel 440BX, звуковая карта типа CreativeLabsSoundBlaster 16 ISA, сетевой адаптер DEC 21140A 10/100 и видео-карта S3 Trio 32/64 PCI с 8 Mбайтами памяти на бору. В общем, довольно внушительная конфигурация, позволяющая запускать современные операционные системы семейства Windows NT и Free BSD с «иксами».

Имеется возможность прямого доступа к гибким и оптическим дискам. Жесткие диски эмулируются на уровне двухканального контроллера IDE (см. документацию на чипсет 440BX), размещаясь на винчестере в виде динамического или фиксированного файла-образа. При желании можно взаимодействовать с хозяйской операционной системой и остальными виртуальными машинами через разделяемые папки или виртуальную локальную сеть. Оба этих метода с хакерской точки зрения небезопасны и потому при исследовании агрессивных программ к ним лучше не прибегать.

Рисунок 5 MicrosoftVirtualPC эмулирует весь компьютер целиком, включая BIOS Setup

К сожалению, при попытке запуска Soft-Ice, эмулятор аварийно завершает работу виртуальной машины, выдавая следующее сообщение (см. рис. 6). Встроенный отладчик отсутствует, как отсутствует и возможность сохранения состояния виртуальной машин с последующим возращением к ним. Все это существенно ограничивает область применения данного эмулятора. Будь он бесплатным продуктом, его было бы можно смело рекомендовать для экспериментов с файловыми системами на предмет обретения навыков по разрушению/восстановлению данных, но это явно не стоит тех денег, которые за него просят. Бесплатно можно утянуть только демонстрационную версию, работающую на протяжении 45 дней, после чего требующую регистрации (впрочем, в нашей стране, где «регистрация» синоним слову «щас-мы-найдем-крэк» на этот счет можно не волноваться).

Рисунок 6 реакция Microsoft Virtual PC на попытку запуска soft-ice

VM Ware

Еще один коммерческий эмулятор, но в отличии от конкурентов действительно стоящий своих денег (особенно в свете того, что покупать его ни один здравомыслящий соотечественник все равно не собирается). Скажем сразу – это единственный эмулятор, стабильно поддерживающий soft-ice и умеющий работать со snap-shoot'ами.

Скорость эмуляции – выше всяких похвал. Pentium III 733 MHz превращается в Pentium III 336 MHz (т. е. замедляется менее чем в два раза). Полностью эмулируется Phoenix BIOS 4.0, чипсет типа Intel 440BX и LSILogicRLSI53C10xxUltra160 SCSII/O контроллер, поддерживающий виртуальные SCSI-диски, размещающиеся в динамическом или фиксированном файле-образе. При желании можно работать и с IDE-дисками, но они несколько менее производительны.

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

Короче говоря, VM Ware представляет собой многоцелевой эмулятор, пригодный для любых экспериментов, за исключением игр. Во всяком случае добиться нормальной поддержки звука из-под MS-DOS, мне так и не удалось, в то время как у остальных эмуляторов с этим не было никаких проблем.

При попытке использования soft-ice под Windows 2000, запущенной из-под VMWare начинаются сплошные лапти – soft-ice работает только из text-mode режима, развернутого на весь экран (заходим в FAR, жмем <ALT>-<ENTER>, затем <CTRL>-<D>), а во всех остальных режимах наглухо завешивает систему. Еханный бабай! Кстати, под Windows 98 он чувствует себя вполне нормально, но переход на Windows 98 – не вариант.

Это известный глюк айса, признанный NuMega и устраненный лишь в Driver Studio версии 3.1 (в официальной формулировке это именуется «поддержкой VMWARE). Подробности можно найти в документации (см. \Compuware\DriverStudio\Books\Using SoftICE.pdf, приложение E – «SoftIce and VMware»). При этом в конфигурационный файл виртуальной машины (имя_виртуальной_машины.vmx) необходимо добавить строку svga.maxFullscreenRefreshTick = «2» и vmmouse.present = «FALSE». Мышь работать не будет, да она в soft-ice не сильно кому и нужна.

Рисунок 7 отладчик soft-ice, запущенный под Windows 2000, под управлением эмулятора VM Ware, запущенном под Windows 2000. нет, это не рекурсия, это просто эмулятор такой хороший

DOS-BOXBochsMicrosoft Virtual PCVM Ware
бесплатностьдаданетнет
исходные текстыдаданетнет
кол-во эмулируемых процессоров11, 2, 4, 811
эффективная тактовая частота на Pentium III 73313,17 MHz1,49 MHz189 MHz336 MHz
расширяемостьнетчастичнонетчастично
поддержка динамической эмуляции процессорачастичнонетдада
виртуальные жесткие дискинетIDE, фиксированные образыIDE, динамические и фиксированные образыIDE/SCSI, динамические и фиксированные образы
поддержка soft-iceнетчастичнонетда
встроенный отладчикда, но требуется перекомпиляцияданетнет
работа со shap-shoot'аминетнетнетда

Таблица 1 основные характеристики наиболее популярных эмуляторов (неблагоприятные свойства выделены серым цветом)

При всех достоинствах VM Ware он не отменяет остальных эмуляторов, особенно тех из них, что содержат интегрированные отладчики, распространяются в исходных текстах и позволяют неограниченно расширять свой функционал. Поэтому ни победителей, ни проигравших в этом сравнении нет. Побеждает только дружба!

  1. soft-ice, запущенный под эмулятором, не замораживает основную систему, не затыкая WinAmp, не разрывая соединения с Интернетом, не замораживая часы системного времени и оставляя MSDN доступным!
  2. для виртуальной машины с лазерного диска необходимо войти в виртуальный BIOS Setup (в частности в VM Ware это делается нажатием клавиши F2 во время начальной заставки) и в меню boot вытянуть CD-ROM наверх;
  3. один и тот же дисковый образ может быть подключен к нескольким виртуальным машинам, что может быть использовано для передачи файлов между ними или совместного использования приложений;
  4. все описываемые эмуляторы могут быть найдены в Осле по их имени;