Как работает VmWare?

Тема в разделе "WASM.HEAP", создана пользователем Medstrax, 27 фев 2010.

  1. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Преамбула.
    Наковырял на днях несколько интересных инструкций, вернее они документированные, просто юзаются немного нестандартно. Борщ на них обламывается, либо UD#, либо рез-т совсем левый. Проверил под варей, переваривает )) блин на ура, я даже озадачился поначалу, ну не могли тамошние девелоперы учесть все нюансы.
    Собственно амбула.
    Кто нибудь в курсе как варя эмулит поток команд? Ясно, что какую то часть кода она выполняет непосредственно на камне, иначе вышесказанное не объяснить. Как она решает,
    что выполнять, а что эмулить? Напрашивается вывод, что как то парсит код. Проверил - любое сочетание и любое количество префиксов почти перед любыми инструкциями она разруливает на ура.Это получается парсинг на уровне ИИ ;), чисто программная эмуляция в этом случае будет немногим медленней, однако варя весьма шустро работает. Просветите кто реально в курсе. Гугль не сильно помог, какие то общие фразы.
     
  2. Derek

    Derek New Member

    Публикаций:
    0
    Регистрация:
    2 ноя 2008
    Сообщения:
    121
    А под VirtualBox ?
     
  3. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    А что за инструкции и как выглядят? Насколько я себе представляю, VMWare дизассемблирует "влегкую", т.е. ее интересует инструкция в том случае, если произошло исключение (например, запись в crX, порты ввода/вывода и т.д.), а также для отлова инструкций типа sgdt/sidt, которые показывают значения различных системных регистров. Но если процессор поддерживает виртуализацию, это даже и не нужно.
     
  4. Wizard109

    Wizard109 New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2006
    Сообщения:
    346
    medstrax1
    Если курнуть доки Intel'а а потом хорошей травы - эмуляцию инструкций процессора сделать не так уж сложно.
    Вся сложность в виртуальной аппаратуре.
     
  5. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    BOCHS всё исполняет сам (эмулирует полностью) - потому там проблемы.
    VmWare и VirtualBox эмулируют только привилегированные команды.
    Т.е. код запускается на реальном процессоре: выполнился - хорошо, получили исключение - тогда дизаасемблирует и эмулирует команду.
    Так что если твоя хитрозакрученная команда не привелигированная - её процессор исполняет как обычно, эмулятор её даже не анализирует.
     
  6. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Насчет борща беру свои слова обратно, просто я юзал какую-то древнюю версию. Эмулит просто изумительно, даже не вижу пока как задетектить, юзая только проц, не трогая ОС и железо. Я как то сваял небольшой детект для виртуалок, см. http://wasm.ru/forum/viewtopic.php?id=31540 , дык борщ щас эту фичу эмулит без проблем, в отличие от вари и виртуалбокса. Виртуалбокс, надо сказать, откровенный отстой, он банальное FF E8 эмулит неправильно, как и кучу других "кривых" инструкций.
    А как быть с непривилегированными командами? Почему они тоже эмулируются правильно?
    В любом случае перед тем как отпустить код на выполнение на реальном камне, он должен пропарсить его на предмет потенциально опасных команд, я не вижу другого решения. Но это нифига не быстро.
     
  7. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Они не эмулируются, они исполняются процессором.

    В ring3 потенциально опасная команда не выполнится без исключения.
     
  8. newbie

    newbie New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    1.246
    что есть борщ?
     
  9. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
  10. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Ага,как же, попробуй SIDT выполнить под варей, значение будет совсем другое нежели в хостовой JC.
    Под потенциально опасными я имел ввиду непривилегированный команды, результат которых может повлиять на гостевую систему. К примеру, smsw команда непривилегированная, но она в случае выполнения на реальном камне дает доступ к cr0.pe. Если гостевая ось рассчитана на работу в реалмоде, ей нельзя давать видеть что проц уже в протмоде, поэтому варя фейкает smsw.
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Нужно какимто хитрым способом стянуть у них отладочные символы к vmx86.sys, если попросить думаю не датут :dntknw:
     
  12. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Часть исходников вроде как открыта. Мы не смотрели правда что там и как, но полагаем, что найти релевантный код возможно.
     
  13. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    medstrax1
    Т.е. дизассемблировать таки надо, но все, что требуется, это только получить код операции инструкции для идентификации инструкции. Если с ней все в порядке -- пусть исполняется. Если нет -- надо виртуализировать. Я когда-то пробовал обмануть Virtual Box с помощью самомодифицирующегося кода, но без особого интереса и следовательно без успеха. Но где-то писали, что это возможно.
     
  14. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    они уже убрали унылые ассерты а-ля "Error Function SuperPuperEmulation() failed. \super\puper\emulation.c:666" ?
    помню неплохо так помогали править их баги )
     
  15. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Sol_Ksacap
    Сурцы не нужны, нужны отладочные символы.
    n0name
    Оо точно, как я забыл :))
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    VMWare и другие эмуляторы работают на принципе динамической рекомпиляции. Где-то была классная статья на эту тему.

    Sol_Ksacap
    Я ща просмотрел, на первый взгляд - не интересно. Там модули поддержки (типа vmware-user), исходников самого драйвера я не нашел.
     
  17. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    Great
    лучше посмотреть классные исходники. тем более, что их есть. хоть и не от вари. а сама идея проста как бублик
    машкод1 до первого перехода --> представление удобное для автоанализа/модификации --> машкод2 + переход на новую рекомпиляцию в конце

    машкод1 !== машкод2. они даже не обязательно должны у одному типу процев относиться.

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

    а главнвя проблема с эмулями - железо.
     
  18. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Хорошие новости для борцов с эмуляторами. Ни один из протестированных мной (bochs, vmware, virtualpc, virtualbox, qemu)не эмулирует корректно инструкцию fstenv. Подозреваю, что схожая ситуация и с немалым количеством других команд FPU. Уточню, проверял на проце без аппаратной виртуализации. Возможно с поддержкой VT-х рез-ты будут другими, но это малоактуально. Если в гостевой ОС иметь ринг0 привилегии, то задетектить аппаратный гипервизор очень легко.
     
  19. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.561
    Адрес:
    Russia
    medstrax1
    Если тока это не вложенная виртуализация. Тогда это уже не так легко.
     
  20. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Еще. Ни один эмулятор не рубит такую фишку.Ставим брекпойнт на чтение/запись дескриптора GDT, потом грузим селектор этого дескриптора в сегментный регистр.
    На реальной машине имеем #DB, в виртуалке бряк игнорится