151 ·GitHub
这是什么?
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 补丁。
What are similar projects?
scriptc, CalcKernel, open-gpu-kernel-modules, ZygiskNext, linux, mquickjs, reactos, lytlnyblOS
Which topics is it in?
qt6, clang, interpreter, driver, virtual-machine, webassembly, kernel, low-level, systems-programming, native, sandbox, wasm
