WasmForge — 将 Go 和 C# 程序编译为单一二进制、WASM 沙箱化的原生可执行文件,支持多态输出。
WasmForge 将 Go 和 C# 程序编译为 WebAssembly,然后将其打包成单一原生二进制文件。生成的执行文件将客户代码沙箱化在 WASM 运行时(基于 wazero 的按构建版分支)中。从沙箱内部,客户程序可以透明地访问网络、原始套接字、Win32 API 和 macOS 框架 API。
你可以编写使用 net.Dial、net.Listen 或 net/http 的标准 Go 程序。你也可以迁移现有的 .NET Framework C# 项目。无论哪种方式,输出都是一个可在 Windows 或 macOS 上运行的单一二进制文件,无需用户对客户源代码进行任何修改。

快速浏览这个项目就会明显看出,它的开发过程中大量使用了 LLM。部分文档也是如此——但这一节不是。我已尽力使本 README 摆脱“AI味”,同时让使用 WasmForge 的过程尽可能直接。此外,虽然 LLM 编写的文档会大肆吹嘘自身的成就,但并未完全清楚地说明局限性。
为了正确设定预期:虽然此工具已针对 Go 的许多不同特性进行了测试,但它并非所有 Go 程序的完整解决方案。仍有相当一部分 Win32 API 未得到妥善支持(例如需要回调 thunk 的 API)。例如,Sliver 可以处理大量命令,但并非完全 1:1 移植所有功能。例如,ls 命令仍会显示以 / 分隔的路径,而不是传统的 C:\ 路径,因为 WASM blob 并未完全“欺骗”到让它意识到自己处于 Windows 环境中。其他一些功能可能会直接导致崩溃。在尝试对真实目标使用任何功能之前,请确保已对其进行测试。 如果有某些功能无法正常工作,请尝试构建出该问题 API 的最基本示例,然后提交 Issue 或 PR。
C# 这边更多是概念验证而非实际实现。将 C# 编译为 WASM 的过程过于实验性,这意味着 WasmForge 通常需要重写相当一部分程序才能使其运行。归根结底,我可能在研究这个功能上钻牛角尖了,其实应该建议人们使用 LLM 将 C# 代码重写为 Go 代码。这样处理起来可能更省心。不过话虽如此,C# -> Wasm -> WasmForge 的通用模式确实有效,并且确实能绕过大量 C# 特有的检测。
说到这里——WasmForge 主要用于处理静态检测。编译过程会绕过大多数检测,即使是内存扫描也是如此,但最终如果你的二进制文件中包含一些非常明显的字符串,如 mimikatz 或 sliver,则某些低成本的内存扫描仍然会导致检测。未来可能会添加自动字符串混淆功能,因为这是一个相当容易自动化的特性,但在第一版中,为了保持调试相对简单,我不希望在构建流水线中增加额外的复杂性。
虽然已经做了一些清理/整合仓库源代码的工作,但它仍然相当混乱。有几个不同的文件夹用于不同的测试过程。基本的单元测试通常位于 examples/ 和 test/ 中,而一些更复杂的、需要在完整实验室环境中运行的测试则位于 testdata/ 中。此外,scripts/ 和 internal/devtools 文件夹中还包含一些仅用于开发/测试的工具。这些工具仅在你试图设置自己的测试环境进行进一步开发时才需要。总体而言,使用 LLM 开发如此复杂的东西需要大量非常明确的测试用例来指导生成,否则最终你会得到根本无法工作的东西。该项目包含了这些框架,以便任何感兴趣的人可以进一步开发相关工具或为项目做出贡献。
希望社区发现这个工具相对容易使用,随着时间的推移,我们将继续改进它。也许有一天,C# 编译将真正像 Go 编译一样工作。
有三种方式获取 wasmforge:
预构建二进制文件。 从 Releases 页面 下载一个发行版——CLI 的 Linux、macOS 和 Windows 构建版本都附在每个标签上。
Docker 镜像。 对于 C# / .NET 项目,捆绑的镜像预先安装了所有先决条件(.NET 10 SDK、NativeAOT-LLVM 工作负载、WASI SDK 24.0、wasm-ld、osslsigncode)。使用 make docker-build 构建一次,然后使用 make docker-run 驱动它——完整工作流程见 docs/CSHARP.md。这是推荐用于 C# 的路径。
从源代码构建。
make build
make build 会重新生成嵌入的 internal/build/build_assets.tar.gz,然后编译 CLI。如果你只运行 go build -o wasmforge ./cmd/wasmforge,你会得到一个可用的二进制文件,但分发模式构建(当 CLI 在此源代码树之外运行时)将使用过时的嵌入存档。更详细的说明请参见 CONTRIBUTING.md。
examples/ 目录包含可直接构建的可运行 Go 程序。完整菜单请参见 examples/README.md。
GOOS=windows GOARCH=amd64 ./wasmforge build \
--ghost traefik \
-o myapp.exe \
/path/to/your/project
每当 GOOS=windows 时,Win32 API 桥会自动启用——通用情况下你不再需要传递 --win32-apis 标志。
--ghost traefik 会替换嵌入的 gopclntab 符号分布,使其看起来像 Traefik 反向代理。在捆绑的配置文件中,此配置文件产生的 VirusTotal 检测率最低。其他配置文件以及生成你自己的配置文件的说明位于 docs/GHOST-PROFILES.md。
Windows 目标默认使用自签名证书进行自动签名。使用 --sign google.com 来伪造域的 TLS 证书,或使用 --no-sign 完全禁用签名。
# Intel
GOOS=darwin GOARCH=amd64 ./wasmforge build -o myapp /path/to/your/project
# Apple Silicon
GOOS=darwin GOARCH=arm64 ./wasmforge build -o myapp /path/to/your/project
不需要额外的标志。每当 GOOS=darwin 时,macOS 框架桥会自动启用。有关框架桥、purego/ObjC 支持和其他 Apple 特定说明,请参见 docs/MACOS.md。
# 原始套接字支持(构建时需要 CAP_NET_RAW 或 root 权限)
./wasmforge build --raw-sockets -o myapp ./path/to/project
# 详细输出(首次构建时有用)
GOOS=windows GOARCH=amd64 ./wasmforge build --ghost traefik --win32-apis -v -o tool.exe /path/to/project
# 自定义 PE VERSIONINFO(仅 Windows)
./wasmforge build --pe-company "Acme Corp" --pe-product "AcmeTool" --pe-file-version "10.0.19041.1" ...
C# 项目(.csproj 文件)会被自动检测。WasmForge 使用一条命令运行完整的 NativeAOT-WASI 迁移、补丁和构建流水线:
GOOS=windows GOARCH=amd64 ./wasmforge build --win32-apis -o seatbelt.exe path/to/Seatbelt/Seatbelt/
对于 C# 工作,我们强烈建议使用 Docker 构建环境。它捆绑了所有先决条件(.NET 10 SDK、NativeAOT-LLVM 工作负载、WASI SDK 24.0、wasm-ld),因此你无需在主系统上安装任何一个。完整说明位于 docs/CSHARP.md。
wasmforge build [package] 编译 Go(或 C#)包为 WASM 沙箱化的原生二进制文件
-o, --output <path> 输出二进制文件路径
--ghost <name> Ghost 配置文件:traefik, caddy, terraform(参见 docs/GHOST-PROFILES.md)
--raw-sockets 启用原始套接字支持
--win32-apis 启用 Win32 API 桥(Windows 目标)
--sign <mode> 签名二进制文件:'self' 或域名(Windows 默认使用 self)
--no-sign 禁用 Windows 目标的自动签名
--tags <tags> Go 构建标签(逗号分隔)
--pe-company / --pe-product / --pe-description / --pe-copyright / --pe-file-version
PE VERSIONINFO 覆盖
-v, --verbose 详细构建输出
wasmforge run [package] 构建并立即执行
wasmforge clean 清除缓存的已打补丁的 GOROOT(~/.wasmforge/cache/)
wasmforge version 打印版本
wasmforge dotnet-migrate <dir> 将 .NET Framework 项目迁移到 .NET 10 NativeAOT-WASI
wasmforge dotnet-patch <dir> 应用 NativeAOT-WASI C# 源代码补丁
WasmForge 弥合了 WASM 和底层主机之间的差距,使客户程序无需修改即可工作。
平台 API。 TCP、UDP、DNS、HTTP、TLS 和原始套接字在 Windows 和 macOS 上无需修改客户代码即可工作。在 Windows 上,WasmForge 代理完整的 Win32 表面:注册表、文件 I/O、进程、DLL 加载以及最多支持 15 个参数的 SyscallN。指针翻译是自动的。COM vtable 链被镜像,因此 CLR 和其他重度使用 COM 的 API 可以端到端工作。在 macOS 上,dlopen 和 dlsym 可以访问任何框架(Security、CoreGraphics、IOKit 等),ebitengine/purego 和 Objective-C 运行时可直接使用。
.NET 托管和迁移。 CLR 通过标准链加载(CoInitializeEx、CLRCreateInstance、Load_3、Invoke_3)。AMSI 在启动时被修补,因此 Assembly.Load(byte[]) 不会阻止已知工具。一个独立的 NativeAOT-WASI 流水线获取现有的 .NET Framework 项目,并生成单一的 Windows PE 二进制文件,目标系统上无需 .NET 运行时。
主机内存和外壳代码。 一个由 VirtualAlloc 支持的主机内存代理可从客户内部访问。这使得 COFF/BOF 加载器和外壳代码执行成为可能,而无需逃逸 WASM 沙箱。
协作式 yield。 阻塞 Win32 API(Sleep、WaitForSingleObject、ReadFile 等)不会冻结 WASM goroutine。主机在后台 goroutine 上调度调用,并通知客户 yield,直到结果准备就绪。
多态输出。 每次构建都会生成一个结构上唯一的二进制文件。WASM 操作码被置换,节 ID 和魔数字节被随机化,所有标识符、PE 导入、VERSIONINFO 字符串、许可块和源文件名都被清除。捆绑的 wazero 分支被重写以匹配置换后的字节码。Ghost 配置文件重写 gopclntab 符号以匹配真实的企业 Go 二进制文件(Traefik、Caddy、Terraform)。Windows 输出默认使用 Authenticode 签名,可以是自签名或通过 osslsigncode 伪造真实域的 TLS 证书。
+-------------------- WASM Guest (wasip1) --------------------+
| |
| Your Go Program (net, net/http, os; works transparently) |
| |
+----------- go:wasmimport ABI (custom opcodes) --------------+
|
+----------- Host Runtime (per-build wazero fork) ------------+
| |
| 90+ host functions (networking, OS proxies, platform APIs) |
| Windows: pointer translation, shadow memory, COM mirroring |
| macOS: dlopen/dlsym framework bridge, ABI trampolines |
| |
+----------- wazero (custom VM: permuted opcodes/magic) ------+
|
OS Kernel / Windows APIs / macOS Frameworks
构建流水线分六个阶段运行。
syscall/ 和 net/。缓存在 ~/.wasmforge/cache/ 中。GOOS=wasip1 GOARCH=wasm 针对修补后的标准库进行构建。自动存根覆盖特定于平台的空白。当检测到相关导入时,会注入 golang.org/x/sys 和 ebitengine/purego 的系统填充。-trimpath 生成多态 main.go。osslsigncode 进行 Authenticode 签名。WasmForge 编译并运行未经修改的第三方 Go 项目,包括那些具有复杂平台特定代码的项目。
| 程序 | 平台 | 描述 | 验证情况 |
|---|---|---|---|
| Sliver | Windows | C2 框架,重度使用 Win32 | HTTPS beacon, whoami, ps, netstat, execute-assembly (Rubeus, Seatbelt) |
| Sliver | macOS | C2 框架(beacon + session) | pwd, ls, download, execute, SOCKS5 代理 |
| go-clr | Windows | .NET CLR 托管 + 程序集执行 | CLR 加载链、Rubeus 初步分析、Seatbelt 系统扫描 |
| Chisel | Windows | 基于 HTTP 的 TCP/UDP 隧道 + SOCKS5 | 隧道连接、代理转发 |
| Ligolo-ng | Windows | 高级隧道和跳板 | TUN 接口、agent 连接 |
| goffloader | Windows | 使用 unsafe.Pointer 的 COFF/BOF 加载器 | VirtualAlloc、shellcode 执行、PE 解析、IAT 解析 |
.NET NativeAOT-WASI 程序:
| 程序 | 平台 | 描述 | 验证情况 |
|---|---|---|---|
| Seatbelt | Windows | 安全枚举 | 大多数命令通过;少数需要 WMI / Defender 回调分发的命令已诚实存根,等待桥接支持。 |
| Rubeus | Windows | Kerberos 工具 | 哈希 + 令牌操作直接工作;网络动词(asktgt、kerberoast、asreproast)通过 TCP 桥接;LSA 查询(klist、logonsession)与原生基线匹配。 |
参见 docs/BUILDING-SLIVER.md 获取分步 Sliver 构建指南,以及 docs/CSHARP.md 获取 C# 流水线说明。
WasmForge 可在 Linux、macOS 或 Windows 构建主机上运行。需要 Go 1.25 或更新版本。
某些功能需要额外设置。原始套接字需要 CAP_NET_RAW 或 root 权限。Win32 桥需要带有 --win32-apis 的 Windows 目标(其他目标返回 ENOSYS)。macOS 框架桥需要 macOS 目标,并从 GOOS=darwin 自动检测。代码签名需要 osslsigncode 在 PATH 中。C# 项目需要 .NET 10 SDK、NativeAOT-LLVM 工作负载和 WASI SDK 24.0。或者,捆绑的 Docker 镜像(在 docs/CSHARP.md 中说明)预先安装了所有这些依赖。
对等性测试框架(test/parity/)和 scripts/lab-setup/ 下的实验室搭建脚本还假定使用 Ludus 搭建的 Active Directory 范围,并运行 GOAD (Game of Active Directory)——所有硬编码的 sevenkingdoms.local / kingslanding / SEVENKINGDOMS-CA 默认值都是 GOAD 默认值,可通过 WASMFORGE_PARITY_* 环境变量覆盖(参见 test/parity/internal/lab/lab.go)。完整的实验室设置见 docs/internals/PARITY-HARNESS.md 和 docs/internals/LAB-STABILITY.md。
从这里开始
| 主题 | 文档 |
|---|---|
| 可运行示例(TCP 扫描器、HTTP 服务器、ICMP ping) | examples/README.md |
| 端到端构建 Sliver(Windows + macOS) | docs/BUILDING-SLIVER.md |
| C# / .NET 项目编译(Docker 工作流) | docs/CSHARP.md |
| macOS 目标和框架桥 | docs/MACOS.md |
| Ghost 配置文件使用和自定义配置文件构建 | docs/GHOST-PROFILES.md |
构建时环境变量(R80 配方,所有 WASMFORGE_* 旋钮) | docs/ENVIRONMENT.md |
深入探讨
| 主题 | 文档 |
|---|---|
| 架构——主机模块、构建流水线、设计决策 | docs/ARCHITECTURE.md |
| 贡献——仓库布局、先决条件、添加主机函数 | CONTRIBUTING.md |
| 安全策略 + 披露 | SECURITY.md |
| 行为准则 | CODE_OF_CONDUCT.md |
维护者参考
| 主题 | 文档 |
|---|---|
| 主机 API 合约——已注册导出、签名稳定性 | docs/internals/HOST-API-CONTRACT.md |
| AST 修补器内部——字符串替换规则和分派 | docs/internals/AST-PATCHER.md |
| 对等性框架——运行 C# 原生与 WASM 差异 | docs/internals/PARITY-HARNESS.md |
| 实验室稳定性——Ludus + GOAD 范围设置、看门狗脚本 | docs/internals/LAB-STABILITY.md |
版权所有 © 2025-2026 Praetorian Security, Inc.