Изолированная гипервизором среда выполнения шелл-кода. Отображает память хост-процесса в гостевой vCPU, перехватывает ошибки выполнения DLL и проксирует вызовы API к хосту, совместимо с PIC-шелл-кодом Stardust
Изолированная гипервизором среда выполнения шелл-кода. Отображает память хост-процесса в гостевой vCPU, перехватывает ошибки выполнения DLL и проксирует вызовы API на хост; совместима с PIC-шелл-кодом Stardust.
HyperLoader выполняет позиционно-независимый шелл-код внутри изолированного виртуального процессора, созданного с помощью Windows Hypervisor Platform API (WHvP). vCPU работает в собственном адресном пространстве.
Пользовательские хуки EDR (inline-хуки, хуки IAT) обходятся по самой архитектуре — они находятся в адресном пространстве хост-процесса, а шелл-код там никогда не выполняется. Разрешение API, обход PEB и логика принятия решений шелл-кода полностью выполняются внутри vCPU, невидимо для любого пользовательского инструментирования.
Данная техника не обходит некоторые обнаружения на уровне ядра. WHvCreatePartition и WHvRunVirtualProcessor видны сенсорам EDR уровня ядра, а любые вызовы API, которые хост-прокси выполняет от имени гостя, проходят через обычную цепочку обратных вызовов ядра (уведомления о загрузке образов, minifilter, ETW-TI).
Host process
├── WHvCreatePartition / WHvMapGpaRange
│ └── identity VA -> GPA map: ntdll, kernel32, PEB, TEB (read only, noexec)
├── Exception interception (#PF + execute faults)
└── Exit loop: DLL call proxy
└── executes DLL functions natively on the host
vCPU guest (isolated)
└── Stardust PIC shellcode
├── PEB walk -> resolves ntdll / kernel32 (read only view)
├── API resolution via FNV1a hash over EAT
└── DLL call -> execute fault -> host proxies -> result returned
Выделяется и отображается в гостевую систему по GPA 0 регион нижней памяти размером 2 МБ. Здесь размещаются гостевые таблицы страниц (PML4/PDPT/PD), а также шелл-код, стек, трамплин LSTAR и буфер системных вызовов.
GPA 0x0000 Stack / page tables (identity mapped 2MB, RWX)
GPA 0x1000 PML4
GPA 0x2000 PDPT
GPA 0x3000 PD (2MB large page)
GPA 0x4000 Shellcode (Stardust binary)
GPA 0x5000 Output buffer (RCX arg on entry)
GPA 0x6000 LSTAR trampoline
GPA 0x7000 Syscall buffer (SSN + args + retval)
GPA 0x8000+ PT pool (4KB pages for VA→GPA mappings)
Перед запуском vCPU HyperLoader отображает структуры хост-процесса в гостевую систему с помощью WHvMapGpaRange:
ntdll.dll, kernel32.dll, kernelbase.dll: только чтение, без исполнения0x7FFE0000)Страницы DLL намеренно отображаются без флага исполнения. Гостевая система может их читать (обход EAT, разрешение импортов), но не может их исполнять.
Когда Stardust вызывает функцию DLL, vCPU генерирует ошибку исполнения (WHvRunVpExitReasonMemoryAccess, тип доступа 2). Цикл обработки выхода:
Шелл-код продолжает выполнение так, как если бы вызов завершился нормально. Всё исполнение DLL происходит на хосте через реальные (потенциально перехваченные) функции, но решение о том, что вызывать и когда, принималось внутри изолированной vCPU.
Страницы, не отображённые при запуске, обрабатываются по требованию через перехват #PF (WHvPartitionPropertyCodeExceptionExitBitmap). Когда шелл-код обращается к неотображённой странице, хост разрешает её, отображает в гостевую систему и прозрачно возобновляет выполнение.
LSTAR указывает на небольшой трамплин по адресу GPA 0x6000, который сохраняет номер системного вызова и аргументы в буфер по адресу GPA 0x7000 и выполняет HLT. Это обрабатывает любые прямые инструкции syscall, которые достигают трамплина вместо прохождения через путь проксирования DLL.
WinHvPlatform.dll / WinHvPlatform.libЗамените sc_stardust[] в HyperLoader.cpp на ваш бинарник Stardust:
xxd -i bin/stardust.x64.bin
Вставьте массив байтов и перекомпилируйте. При входе шелл-код получает указатель на выходной буфер в RCX.
Этот проект предназначен для образовательных и исследовательских целей.