GoodmansKernel README

The project's README from github.com/zer0condition/GoodmansKernel. As one markdown file: README.md.

The Goodmans Kernel

Demo

Signed WDM driver embedding wasm3. Loads unsigned .wasm modules, gives them nt/hal FFI. Write kernel logic in C/Rust, compile to wasm32, load, iterate. HVCI-compliant.

Features

Build

Needs VS 2022 + WDK 10.0.26100.0, Qt 6.9, clang wasm32.

build.cmd Release

Install

cd deploy
gen_cert.cmd
install.cmd

Needs bcdedit /set testsigning on if not signed.

IOCTLs

Code Purpose
LOAD_MODULE load .wasm, link imports
CALL_EXPORT invoke export, up to 8 args
UNLOAD_MODULE tear down runtime
LIST_MODULES / MODULE_INFO enumerate
UNLOAD_ALL / FORCE_UNLOAD bulk teardown
TAIL_LOG / TAIL_TRACE poll rings
TRACE_CTL toggle trace
READ_GUEST read guest linear memory
NOTIFY_STOP deregister callbacks

Host Imports

Import Sig
host_dbg_print v(ii)
host_alloc / host_free I(i) / v(I)
host_read_u8/32/64 i/I(I)
host_write_u64 v(II)
host_read_bytes / host_write_bytes i(Iii)
host_current_irql i()
host_process_id / host_thread_id i()
host_current_process I()
host_cpuid v(iii)
host_rdtsc I()
host_readmsr / host_writemsr I(i) / i(iI)
host_phys_read / host_phys_write i(Iii)
host_call I(iiiIIIIIIII)
host_ih_trampoline / host_ih_configure / host_ih_quiesce
host_notify_enable / host_notify_poll / host_dispatch_start / host_dispatch_stop
host_mem_base / host_mem_size I() / i()
host_make_unistr / host_free_unistr

Guest bindings in guest_sdk/gvm.h.

Capabilities

Bit Name Grants
0 ALLOC host_alloc, host_free
1 READ_KMEM host_read_*
2 WRITE_KMEM host_write_*
3 MSR_READ host_readmsr
4 MSR_WRITE host_writemsr
5 PHYSMEM host_phys_*
6 CPUID_TSC host_cpuid, host_rdtsc
7 CALLBACKS process/image notify
8 HOSTCALL host_call
9 INTROSPECT pid/tid/irql/current_process

Limits

Credits

License

MIT.

GoodmansKernel (zer0condition/GoodmansKernel)

Searching Database…

Что это?GoodmansKernel — подписанный драйвер режима ядра Windows со встроенным интерпретатором wasm3: он позволяет загружать неподписанные модули .wasm и исполнять их внутри ядра с прямым FFI-доступом к экспортам nt/hal. Логику для ядра вы пишете на C или Rust, компилируете в wasm32, загружаете в драйвер и итерируете без переподписывания каждого пейлоада.
Это полноценное приложение или просто драйвер?Это драйвер режима ядра WDM (.sys) с графическим фронтендом на Qt6 для загрузки модулей и просмотра логов; гостевые модули wasm компилируются отдельно и загружаются в драйвер через IOCTL.
Как его собрать и установить?Соберите драйвер в Visual Studio 2022 с WDK 10.0.26100.0, Qt 6.9 и clang с целью wasm32 для гостевых модулей. Чтобы запустить его без надлежащей подписи, включите тестовую подпись командой 'bcdedit /set testsigning on' перед загрузкой драйвера.
Какие инструменты нужны, чтобы это собрать?VS 2022, WDK 10.0.26100.0, Qt 6.9 для графического интерфейса и clang с поддержкой цели wasm32 для компиляции гостевых модулей.
Каковы главные ограничения запуска wasm-пейлоадов в ядре таким способом?Гостевые модули не могут использовать типы f32/f64, проверки границ памяти wasm выброшены при компиляции, так что модуль с багом всё же может повредить память, у каждого модуля одновременно может быть только один вызывающий, полезная нагрузка IOCTL ограничена 16 МБ, и есть жёсткий предел в 32 слота для модулей.
Это безопасно использовать с точки зрения лицензий?Сам драйвер под лицензией MIT, как и входящие в комплект wasm3 и InfinityHook, но он линкует Qt 6, который под LGPLv3, поэтому распространение собранного бинарника влечёт обязательства LGPL.
Что реально может загруженный wasm-модуль после запуска?Каждый модуль получает битмаску возможностей на слот (ALLOC, READKMEM, WRITEKMEM, MSRREAD/WRITE, PHYSMEM, CPUIDTSC, CALLBACKS, HOSTCALL, INTROSPECT), которая определяет, какие хостовые импорты вроде hostreadmsr или hostphysread ему разрешено вызывать.
Как на практике общаться с модулем после его загрузки?Через IOCTL: LOADMODULE линкует импорты модуля .wasm, CALLEXPORT вызывает экспорт с числом аргументов до 8, а TAILLOG/TAILTRACE позволяют опрашивать его кольца логов и трассировки.
Зачем wasm, если можно просто внедрить шеллкод в ядро?wasm3 интерпретирует гостевой байткод без JIT, поэтому ядро никогда не исполняет динамически сгенерированный нативный код — это сохраняет соответствие драйвера HVCI и прочим механизмам W^X, которые блокировали бы неподписанное нативное исполнение.
Для чего здесь используется InfinityHook?Это сторонняя trampoline-техника с указанием авторства, которую драйвер использует для хуков: она даёт перехват коллбэков в стиле process/image notify без опоры на недокументированный патчинг SSDT.
Size
4.7 MB
Stars
151
Updated
CommitAug 18
Age
1mo
Commits · 90 Days