VMWARE sgdt

Discussion in 'WASM.BEGINNERS' started by Subrealist, Jul 20, 2008.

  1. Subrealist

    Subrealist Member

    Blog Posts:
    0
    sgdt выполняясь под vmware даёт разные результаты в зависимости от режима - ядра или пользователя. Значение в юзермоде не соответствует значению ни в гостевой системе ни в хостовой. Подскажите, как VMM обрабатывает эту команду в зависимости от режима и есть ли какой либо способ получить под vmware корректное значение для gdt из под пользователя без установки драйвера.
     
  2. diamond

    diamond New Member

    Blog Posts:
    0
    VMWare исполняет код режима пользователя напрямую, а код режима ядра эмулирует (VirtualPC делает так же; там используется динамическая трансляция, насчёт VMWare не уверен, но думаю, что то же самое). Чтобы появилась возможность выполнять код напрямую, VMWare создаёт свои системные таблицы gdt,idt,ldt. Команды типа lgdt, создающие свои таблицы, должны выполняться в режиме ядра, и они эмулируются, эмуляция обновляет не только гостевые таблицы, но и внутренние. При разработке процессоров Intel зачем-то разрешила выполнять команды типа sgdt в любом режиме. В результате в режиме ядра они эмулируются, как и lgdt, а в режиме пользователя с прямым исполнением кода их перехватить нельзя и они возвращают адрес реальной gdt, то есть внутренней для VMWare. Это популярный способ детекта VMWare (где-то тут в документах или статьях даже на эту тему сборник лежит).

    Насчёт корректного значения - можешь попробовать в .vmx файле гостевой машины [при этом гость должен быть выключен, а не просто спать] добавить
    • monitor_control.disable_directexec = "TRUE"
    но насчёт последствий ничего не обещаю, сам не пробовал.
     
  3. Subrealist

    Subrealist Member

    Blog Posts:
    0
    diamond
    Благодарю за ответ.
    Тут мне не понятна такая деталь.
    Значение получаемое sgdt в пользовательском режиме - 0xFFC07000.
    На хостовой системе оно 0x8003F000. То есть vmware использует ещё какую-то собственную gdt?
    При использовании
    monitor_control.disable_directexec = "TRUE"
    gdt получается корректным, но как получить это не прибегая к изменениям на стороне хоста?

    В описании команд vmware порта 5658h есть такая:
    10h? (likely keyword: monitorControl)(Y)NNNNNN
    но в списке, который есть у меня, подробностей по ней нет. Если кто знает, подскажите
     
  4. diamond

    diamond New Member

    Blog Posts:
    0
    Да, afaik она копирует гостевую gdt и добавляет туда дескрипторы для работы собственно кода vmware.
    По идее это замедляет работу гостя, хотя и ненамного. Поэтому по умолчанию и выставлено в false.
    Не знаю, сам не копал и раскопок не видел. Судя по гробовому молчанию в этой ветке, никто из присутствующих не знает.