Категория > Новости > Гиперотладка. Разбираем отладку Microsoft Hyper-V с самого начала - «Новости»

Гиперотладка. Разбираем отладку Microsoft Hyper-V с самого начала - «Новости»


12-01-2021, 00:00. Автор: Капитолина

Отладка через COM-порт


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


Для отладки гипер­визора Microsoft раз­работа­ла спе­циаль­ное рас­ширение WinDbg hvexts.dll, которое, к сожале­нию, не вхо­дит в дис­три­бутив и дос­тупно толь­ко пар­тне­рам Microsoft (пос­коль­ку это­му рас­ширению тре­буют­ся сим­волы для модуля гипер­визора, которые Microsoft не пре­дос­тавля­ет). Так­же в катало­ге winxp, находя­щем­ся в пап­ке WinDbg, есть рас­ширение nvkd.dll, которое пред­назна­чено для отладки рас­ширений вир­туаль­ного ком­мутато­ра Hyper-V.


Файл справ­ки WinDbg содер­жит опи­сание отладки гипер­визора через COM-порт (отладка Hyper-V через нуль-модем­ное кабель­ное соеди­нение в фай­ле debugger.chm), под­разуме­вающее наличие двух физичес­ких машин. Так­же гипер­визор мож­но отла­дить, если запус­тить его в любом под­держи­ваемом прог­рам­мном обес­печении вир­туали­зации. Далее мы будем исполь­зовать VMware Workstation.


Для начала нуж­но уста­новить Windows Server 2019 в качес­тве гос­тевой ОС и вклю­чить ком­понент Hyper-V. Если нап­рямую под­клю­чить­ся к вир­туаль­ному COM-пор­ту VMware, то при ком­муника­ции пой­дут ошиб­ки обме­на пакетов (слож­но ска­зать, с чем это свя­зано). Исполь­зуй какую-нибудь бес­плат­ную ути­литу эму­ляции COM-пор­та для ста­били­зации соеди­нения (я уста­новил ути­литу эму­лято­ра COM-пор­та Free Virtual Serial Ports от HHD-software вер­сии 3.32. Пос­ледняя вер­сия 4.12 выда­ет ошиб­ки, ког­да vmdemux пыта­ется открыть COM-порт).


Об­щий порядок дей­ствий таков.



  1. Соз­дай COM-порт для вир­туаль­ной машины VMware (Hardware -> Add -> Serial port -> Use named pipe). Вве­ди .pipecom_1.


    Соз­дание COM-пор­та для вир­туаль­ной машины


  2. Для нас­трой­ки отладки вве­ди в коман­дной стро­ке опции отладки гипер­визора:


    bcdedit /hypervisorsettings serial DEBUGPORT:1 BAUDRATE:115200
    bcdedit /set hypervisordebug on

    За­тем нуж­но ввес­ти парамет­ры отладки хос­товой ОС (будет исполь­зован тот же COM-порт):


    bcdedit /set dbgtransport kdhvcom.dll
    bcdedit /dbgsettings serial DEBUGPORT:1 BAUDRATE:115200
    bcdedit /debug on

    До­пол­нитель­но (для отладки заг­рузки гипер­визора — см. соот­ветс­тву­ющий раз­дел статьи):


    Bcdedit /set bootdebug on

    Ни­же при­веден спи­сок модулей отладки, при­сутс­тву­ющих в Windows:


    kdcom.dll
    kdhvcom.dll
    kd1934.dll
    kdhv1394.dll
    kdusb.dll
    kdnet.dll (разные производители сетевых карт — разные модули)
    kd.dll

    В нашем слу­чае мы исполь­зуем kdhvcom.dll.



  3. Пе­резаг­рузи Windows Server 2019. Заг­рузка оста­новит­ся и будет ждать под­клю­чения отладчи­ка.



  4. От­крой HHD software Free Virtual Serial Ports, выбери File, затем Create Pipe Port. В поле Pipe name ука­жи то же зна­чение, что было рань­ше запол­нено для вир­туаль­ной машины, — .pipecom_1. Чек­бокс Create pipe дол­жен быть отклю­чен (в про­тив­ном слу­чае будет соз­дан новый име­нован­ный канал, а не выпол­нено под­клю­чение к сущес­тву­юще­му). Наж­ми OK.


    Гиперотладка. Разбираем отладку Microsoft Hyper-V с самого начала - «Новости»
    Соз­дание нового пор­та

    Вир­туаль­ный COM-порт нуж­но соз­давать пос­ле запус­ка вир­туаль­ной машины, ина­че ты уви­дишь ошиб­ку, что канал не был соз­дан (VMware соз­дает канал пос­ле запус­ка ВМ).




  5. За­пус­ти ути­литу vmdemux (находит­ся в пап­ке с WinDbg x64) с ука­зани­ем име­ни толь­ко что соз­данно­го COM-пор­та в качес­тве одно­го из парамет­ров:


    vmdemux.exeВ -srcВ com:port=com2,baud=115200

    Ути­лита соз­даст два име­нован­ных канала: Vm0 для гипер­визора и Vm1 для root-раз­дела.


    Ути­лита vmdemux соз­даст два име­нован­ных канала


  6. Ты можешь под­клю­чить WinDbg Preview к каж­дому каналу для тес­тирова­ния:


    WinDBGx.exe -k com:port=.pipeVm0,pipe,reconnect,resets=0 гипервизор
    Под­клю­чение WinDbg к соз­данным нами каналам

  7. Пос­ле это­го мож­но открыть файл hvix64.exe в IDA PRO, выб­рать WinDbg в качес­тве отладчи­ка и ука­зать в process options -> connection string: com:port=.pipeVm0,pipe,resets=0.


  8. Вы­бери Process Attach, наж­ми Same.



  9. От­ладчик оста­новит­ся внут­ри гипер­визора.


    От­ладчик оста­новит­ся внут­ри гипер­визора


  10. По срав­нению с Windows Server 2012 (R2) в акту­аль­ной вер­сии сер­верной вин­ды появил­ся новый модуль — kdstub.dll. Ран­ние вер­сии гипер­визора ста­тичес­ки лин­ковались с биб­лиоте­кой отладки и име­ли дос­таточ­но боль­шой раз­мер (2–3 Мбайт), раз­мер текущей вер­сии (10.0.17763.1577) гипер­визора hvix64.exe — 1230 Кбайт. В слу­чае сетевой отладки kdstub.dll будет заменен под­ходящим отла­доч­ным модулем, нап­ример kd_02_8086.dll.


    При сетевой отладке kdstub.dll будет заменен под­ходящим отла­доч­ным модулем

    Во всех под­робнос­тях нас­трой­ка отладки через COM-порт в сре­де Hyper-V опи­сана в статье Саара Ама­ра (@AmarSaar).



Отладка по сети


В Windows Server 2012 и выше появи­лась воз­можность отладки гипер­визора по сети. Так­же эта воз­можность при­сутс­тву­ет во всех вер­сиях Windows 10. Для это­го в хос­товой ОС необ­ходимо выпол­нить коман­ды, что­бы нас­тро­ить парамет­ры отладки гипер­визора:


bcdedit /set hypervisordebug on
bcdedit /hypervisorsettings NET HOSTIP:192.168.2.1 PORT:50000

Ес­ли есть необ­ходимость, для отладки ОС на хос­те нуж­но ука­зать дру­гой порт:


bcdedit /debug yes
bcdedit /dbgsettings net hostip:192.168.2.1В port:50002

Пос­ле выпол­нения команд будет отоб­ражена стро­ка для под­клю­чения. В нас­трой­ках вир­туаль­ной машины VMware нуж­но уста­новить тип адап­тера Host Only, в нас­трой­ках вир­туаль­ной сети (Edit -> Virtual Network Editor) нас­тро­ить DHCP для это­го адап­тера и убе­дить­ся, что гос­тевая ОС нор­маль­но получа­ет этот адрес, нап­ример выпол­нив коман­ду ipconfig /renew. Опция bcdeditВ /dbgsettingsВ nodhcp поз­воля­ет исполь­зовать IP-адрес опе­раци­онной сис­темы. В этом слу­чае нас­трой­ка DHCP необя­затель­на.


Пос­ле это­го нуж­но запус­тить два экзем­пля­ра IDA PRO, выб­рать тип отладки KernelMode, ука­зать в Process Option -> Connection string сле­дующие стро­ки, получен­ные в резуль­тате выпол­нения при­веден­ных выше команд:


net:port=50002,Key=1.2.3.4 — root partition
net:port=50000,Key=5.6.7.8 — hypervisor

Это поз­воля­ет одновре­мен­но отла­живать root-раз­дел и гипер­визор. Сетевая отладка гораз­до про­ще в кон­фигура­ции, дает большую про­изво­дитель­ность и ста­биль­нее, поэто­му я рекомен­дую исполь­зовать ее там, где это воз­можно. Выпол­нить некото­рые коман­ды WinDbg мож­но даже без наличия сим­волов. Если какие-то из перечис­ленных ниже команд не будут дос­тупны, прос­то пов­торно заг­рузи сле­дующие рас­ширения WinDbg:


.load kext
.load kdexts
.load exts
.load ext

Здесь:



  • lm — прос­мотр заг­ружен­ных модулей (обыч­но hv и модуль отладки);


  • k — прос­мотр сте­ка;


  • d, e — чте­ние/запись дан­ных по вир­туаль­ных адре­сам;


  • !d, !e — чте­ние/запись дан­ных в физичес­кой памяти;


  • r — отоб­ражение зна­чений регис­тров;


  • !vtop — тран­сля­ция вир­туаль­ных адре­сов в физичес­кие. Спер­ва нуж­но получить содер­жимое регис­тра cr3 и исполь­зовать его как пер­вый параметр. Вир­туаль­ный адрес — вто­рой параметр.

2: kd> !vtop 0x10839d000 0xfffffbb3aa6c3e66
Amd64VtoP: Virt fffffbb3aa6c3e66, pagedir 000000010839d000
Amd64VtoP: PML4E 000000010839dfb8
Amd64VtoP: PDPE 000000010a603670
Amd64VtoP: PDE 000000010a604a98
Amd64VtoP: Large page mapped phys 00000001000c3e66
Virtual address fffffbb3aa6c3e66 translates to physical address 1000c3e66.
!pte2va
!ptov <cr3>

dx — рас­ширение дос­тупно тоже, но с некото­рыми огра­ниче­ниями (из-за отсутс­твия сим­волов): @$debuggerRootNamespace.Debugger.State.PseudoRegisters.General. Exentry — псев­дорегистр, отоб­ража­ющий адрес заг­рузки модуля гипер­визора (hvix64).


Exentry — псев­дорегистр, отоб­ража­ющий адрес заг­рузки модуля гипер­визора

Отладка с использованием встроенных возможностей vmwp.exe


От­ладка вир­туаль­ной машины может быть выпол­нена с исполь­зовани­ем встро­енных воз­можнос­тей про­цес­са vmwp.exe (на одну ВМ один экзем­пляр). Эту воз­можность впер­вые упо­мянул на форуме OSR online один из архи­тек­торов Hyper-V Джейк Ошинс (Jake Oshins). Более под­робно опи­сал Рафа­эль Ривера (Rafael Rivera — @WithinRafael) в сво­ем бло­ге. Я обно­вил скрипт Риверы и выложил его на GitHub.


Скрипт так­же может скон­фигури­ровать парамет­ры заг­рузчи­ка гос­тевой ОС при помощи PowerShell direct. Для это­го:


  1. Вык­лючи гос­тевую ОС.



  2. Ука­жи парамет­ры для скрип­та hyperv-dbg-2019.ps1.


    Па­рамет­ры для скрип­та hyperv-dbg-2019.ps1

  3. За­пус­ти скрипт от име­ни адми­нис­тра­тора (или отклю­чи UAC).



  4. За­пус­ти WinDbg сле­дующей коман­дой:


    WinDBG -k net:port=50010,target=127.0.0.1,key=1.2.3.4


  5. Вы­пол­ни коман­ду break (Ctrl-Break), пос­ле которой отладчик оста­новит­ся внут­ри гос­тевой ОС. Теперь мож­но иссле­довать ВМ, исполь­зуя стан­дар­тные коман­ды WinDbg, но в моих экспе­римен­тах интенсив­ная отладка (нап­ример, трас­сиров­ка) нес­коль­ко раз при­води­ла к тому, что все зависа­ло.


Отладка через протокол GDB


VMware Workstation под­держи­вает встро­енный GDB-отладчик. Что­бы его вклю­чить, нуж­но добавить нес­коль­ко строк в кон­фигура­цион­ный файл VMware:


debugStub.listen.guest64 = "TRUE"
debugStub.listen.guest64.remote = "TRUE" — для подключения с других сетевых машин
debugStub.hideBreakpoints = "TRUE"
monitor.debugOnStartGuest64 = "TRUE"— остановка сразу же после включения VM

За­тем ты можешь под­клю­чить IDA PRO, «Гид­ру» или Radare2 к акти­виро­ван­ному сер­веру GDB. При­мер отладки через GDB-про­токол будет показан в раз­деле «Заг­рузка гипер­визора».


Отладка эмулятора Windows 10X


Эму­лятор Windows 10X дос­тупен в магази­не Microsoft Store. Этот эму­лятор работа­ет на базе Hyper-V. Сам эму­лятор запус­кает­ся как Hyper-V ВМ, Windows 10X — вло­жен­ная ВМ.


Не­обхо­димо смон­тировать образ flash.vhdx (прос­то два раза щел­кнуть мышью на фай­ле), с которым работа­ет эму­лятор и который рас­положен в пап­ке по сле­дующе­му пути:


C:ProgramFilesWindowsAppsMicrosoft.Windows10XEmulatorImage10.0.19578.0Previ_1.0.1.0_x64__8wekyb3d8bbweContent

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


Сос­тояние сис­темы до мон­тирова­ния
Сос­тояние сис­темы пос­ле мон­тирова­ния

Вы­бери том с мет­кой VIRT_EFIESP:


mountvol Z: ?Volume{12aef83a-6cf2-4ea1-932f-b3a586a65308}
bcdedit /store "Z:efiMicrosoftbootBCD" /dbgsettings

Ко­ман­да bcdedit /enum all /v /store "Z:efiMicrosoftbootBCD" покажет опции заг­рузоч­ной записи опе­раци­онной сис­темы эму­лято­ра. Что­бы у нас появи­лась воз­можность отладки гос­тевой ОС, понадо­бит­ся дамп ядра, который мож­но получить с исполь­зовани­ем встро­енных фун­кций эму­лято­ра.


По­луче­ние дам­па ядра

От­крой Windows device portal — «Отладка». Заг­рузи live kernel dump, а затем открой его в WinDbg и запус­ти скрипт decypher_kdnet_key.py. Скрипт най­дет парамет­ры kdnet и закоди­рует в фор­мате Base36.


Ис­поль­зование скрип­та decypher_kdnet_key.py

Те­перь запус­ти WinDbg, исполь­зуя коман­ду windbgx.exe -k net:port=50005,key=2k85xmoorkrbx.u7xg1f35gwi4.24033ib08wzhs.2o8xly2z2ik5y. В резуль­тате ты смо­жешь под­клю­чить­ся к ОС хос­та.


Под­клю­чение к хос­товой ОС

Отладка Hyper-V c помощью подмененного загрузчика


На эту тему опуб­ликова­ны два иссле­дова­ния: Hyper-V backdoor Дмит­рия Олек­сюка (@d_olex) и Voyager, соз­данный @_xeroxz. Их суть — в замене заг­рузоч­ных фай­лов Windows в целях перех­вата про­цес­са заг­рузки гипер­визора и интегра­ции сво­их управля­ющих модулей. Пол­ноцен­ной отладкой это слож­но наз­вать, но с при­мене­нием это­го метода появ­ляет­ся воз­можность читать и изме­нять память Hyper-V. Под­робнос­ти ты най­дешь на стра­ницах упо­мяну­тых про­ектов.


Заг­рузи пос­леднюю сбор­ку бэк­дора и запус­ти скрипт bootkit_installer.ps1 в хос­товой ОС (про­тес­тирова­но в вир­туаль­ной сре­де на Windows Server 2019 внут­ри VMware Workstation). Перезаг­рузим хос­товую ОС и уви­дим сле­дующую кар­тину.


За­пуск скрип­та bootkit_installer.ps1

В гос­тевой ОС мы можем запус­тить backdoor_client.exe и получить дос­туп к раз­личным струк­турам дан­ных Hyper-V.


Дос­туп к раз­личным струк­турам дан­ных Hyper-V на гос­тевой ОС

Вто­рой про­ект, Voyager, может быть заг­ружен с сай­та GitHacks. Бинар­ников он не содер­жит, поэто­му их необ­ходимо ском­пилиро­вать с помощью Visual Studio для под­ходящей вер­сии Windows. Пос­ле чего запус­тить файл launch.bat, который заменит заг­рузоч­ные фай­лы Windows. Пос­ле перезаг­рузки мы уви­дим сле­дующую кар­тину.


Заг­рузка ОС пос­ле при­мене­ния Voyager

Для про­вер­ки работос­пособ­ности мож­но запус­тить example.exe внут­ри гос­тевой ВМ.


Про­вер­ка работос­пособ­ности Voyager

На­деюсь, мы уви­дим в будущем боль­ше при­меров для это­го про­екта.


Отладка secure kernel


От­ладку поз­воля­ет выпол­нить модуль EXDi для LiveCloudKd без вклю­чения опции отладки в заг­рузчи­ке гос­тевой ОС. Все под­робнос­ти мож­но узнать в соот­ветс­тву­ющей до­кумен­тации.


Отладка с помощью Radare2


Radare2 — кон­соль­ное средс­тво отладки, под­держи­вающее очень мно­го режимов. Мы рас­смот­рим толь­ко отладку ядра Windows. Бинар­ники мож­но заг­рузить с того же github.com по адре­су https://github.com/radareorg/radare2/releases.


Нез­начитель­но изме­нив исходни­ки, мож­но получить допол­нитель­ную информа­цию о Hyper-V (модифи­циро­ван­ные бинар­ники при­ложе­ны к статье). Для начала рекомен­дую почитать офи­циаль­ные источни­ки, они содер­жат от­личные инс­трук­ции.


До запус­ка необ­ходимо ско­пиро­вать сле­дующие рас­ширения WinDbg x64 в пап­ку с Radare2:


ext.dll
exts.dll
kdexts.dll
kext.dll

Не забудь ука­зать путь к пап­ке с уста­нов­ленным WinDbg x64 в перемен­ной окру­жения _NT_DEBUGGER_EXTENSION_PATH. Вот некото­рые коман­ды для тес­тирова­ния успешнос­ти под­клю­чения:



  • pd — дизас­сем­бли­рова­ние;


  • xq @0x<address> — отоб­ражение реги­она памяти;


  • v — перек­лючение в режим GUI.

Radare2 может под­клю­чать­ся к ядру Windows в двух режимах: через интерфейс dbgeng.dll и с исполь­зовани­ем собс­твен­ного про­токо­ла winkd.


Radare2 и интерфейс dbgeng.dll


Спер­ва необ­ходимо нас­тро­ить гипер­визор в режиме сетевой отладки, как это было опи­сано рань­ше, и запус­тить Radare2 сле­дующим обра­зом:


radare2 -d "windbg://-k net:port=50011,key=1.2.3.4"
За­пуск Radare2

Под­клю­чено! Теперь ты можешь выпол­нять стан­дар­тные коман­ды WinDbg, исполь­зуя пре­фикс =!.


Вы­пол­нение стан­дар­тных команд отладчи­ка

Radare2 и встроенный протокол


Мож­но поп­робовать под­клю­чить­ся к гипер­визору по сети, выпол­нив коман­ду radare2 -D winkd winkd://192.168.174.1:50011:1.2.3.4. Я получил ошиб­ку откры­тия UDP-сокета, хотя netstat показал, что порт открыт. Воз­можно, это ошиб­ка нас­трой­ки на моем стен­де, но испра­вить ее мне не уда­лось. В свя­зи с этим будем исполь­зовать отладку через COM-порт. Для это­го нуж­но нас­тро­ить гипер­визор так, как это было опи­сано рань­ше, запус­тить vmdemux и под­клю­чить Radare2 к име­нован­ному каналу:


Ис­поль­зуя дан­ные про­токо­ла отладки, мож­но получить допол­нитель­ную информа­цию о заг­ружен­ном модуле Hyper-V.


По­луче­ние допол­нитель­ной информа­ции о заг­ружен­ном модуле Hyper-V

Иног­да Radare2 не может под­клю­чить­ся к COM-пор­ту и вис­нет. В этом слу­чае нуж­но прос­то спер­ва под­клю­чить­ся обыч­ным WinDbg-отладчи­ком, отклю­чить­ся и под­соеди­нить­ся с помощью Radare2.



Перейти обратно к новости