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 是一个内嵌 wasm3 解释器的已签名 Windows 内核态驱动,让你加载未签名的 .wasm 模块并在内核中运行,可直接通过 FFI 访问 nt/hal 导出。你可以用 C 或 Rust 编写内核逻辑,编译为 wasm32,加载进驱动,然后不断迭代而无需为每个载荷重新签名。
这是完整应用,还是只是一个驱动?它是一个内核态 WDM 驱动(.sys),带有一个用于加载模块和查看日志的 Qt6 GUI 前端;wasm 客体模块单独编译,通过 IOCTL 加载进驱动。
我怎么构建和安装它?在 Visual Studio 2022 中使用 WDK 10.0.26100.0、Qt 6.9 以及面向 wasm32 的 clang(用于客体模块)构建驱动。如果驱动没有正确签名,要运行它需先用 bcdedit /set testsigning on 开启测试签名,再加载驱动。
构建它之前需要哪些工具?VS 2022、WDK 10.0.26100.0、用于 GUI 的 Qt 6.9,以及支持 wasm32 目标的 clang 来编译客体模块。
以这种方式在内核中运行 wasm 载荷的主要限制是什么?客体模块不能使用 f32/f64 类型,wasm 内存边界检查在编译时被剔除,因此有 bug 的模块仍可能破坏内存;每个模块同一时间只允许一个调用者,IOCTL 载荷上限为 16MB,模块槽位硬性限制为 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 让你轮询它的日志环和追踪环。
为什么不直接向内核注入 shellcode,而要用 wasm?wasm3 以纯解释方式执行客体字节码、没有 JIT,因此内核从不执行动态生成的原生代码,这让驱动符合 HVCI 及其他会阻止未签名原生代码执行的 W^X 强制机制。
InfinityHook 在这里用来做什么?它是一个注明出处的第三方跳板(trampoline)技术,驱动用它来实现钩子,提供进程/镜像 notify 风格的回调拦截,而不依赖未公开的 SSDT 补丁。
Size
4.7 MB
Stars
151
Updated
CommitAug 18
Age
1mo
Commits · 90 Days