WasmForge — compila programas Go e C# para executáveis nativos de binário único, isolados em sandbox WASM, com saída polimórfica.
O WasmForge compila programas Go e C# para WebAssembly e os empacota como binários nativos únicos. Os executáveis resultantes isolam o código convidado dentro de um runtime WASM (um fork por build do wazero). De dentro dessa sandbox, os convidados têm acesso transparente a redes, sockets brutos, APIs Win32 e APIs de frameworks macOS.
Você pode escrever Go normal usando net.Dial, net.Listen ou net/http. Você também pode migrar um projeto C# existente do .NET Framework. De qualquer forma, a saída é um único binário que roda no Windows ou macOS, sem exigir que o usuário faça modificações no código fonte convidado.

Uma rápida olhada neste projeto deixará bastante óbvio que ele foi desenvolvido com um uso INTENSO de LLMs. Uma parte da documentação também foi — mas esta seção não. Fiz o meu melhor para descomplicar este README e tornar o processo de usar o WasmForge o mais direto possível. Além disso, embora os LLMs escrevam documentação que elogia fortemente suas próprias realizações, as limitações não são tão claras.
Para definir as expectativas corretamente: embora tenha sido testado com muitos recursos diferentes para Go, NÃO é uma solução completa para todos os programas Go. Ainda há uma porcentagem significativa da API win32 que não é suportada adequadamente (como APIs que exigem thunks de callback). O Sliver, por exemplo, funciona para um bom número de comandos, mas NÃO é uma porta 1:1 completa com funcionalidade. ls, por exemplo, ainda mostrará caminhos com / em vez do tradicional C:\, pois o blob WASM não é totalmente enganado para perceber que está dentro do Windows. Existem outras funcionalidades que apenas causarão uma falha. Certifique-se de testar qualquer funcionalidade que deseja usar antes de tentar usá-la em um alvo real. Se algo não funcionar, tente criar o exemplo mais básico da API que está quebrada e abra uma issue / envie um PR.
O lado C# é mais uma prova de conceito do que uma implementação. O processo usado para compilar C# para WASM é muito experimental, e isso significa que o WasmForge muitas vezes precisa reescrever uma boa parte do programa de qualquer maneira para fazê-lo funcionar. No final, provavelmente investi demais nessa funcionalidade e deveria ter recomendado que as pessoas usassem um LLM para reescrever código C# como código Go. Provavelmente é menos doloroso de lidar. Dito isso, o padrão geral C# -> Wasm -> WasmForge FUNCIONA e quebra um bom número de detecções específicas do C#.
Nessa nota — o WasmForge é destinado principalmente a lidar com detecções ESTÁTICAS. O processo de transpilação quebra a maioria das detecções, até mesmo para varredura em memória, mas, no final, se o seu binário tiver strings muito óbvias como mimikatz ou sliver, existem algumas varreduras de baixo esforço em memória que causarão uma detecção. A ofuscação automática de strings provavelmente será adicionada no futuro, pois é um recurso bastante fácil de automatizar, mas para a primeira versão, não quis adicionar complexidade extra ao pipeline de build para manter a depuração relativamente direta.
Embora tenha havido alguns esforços para limpar/consolidar o código fonte neste repositório, ele ainda está bastante desorganizado. Existem várias pastas diferentes para diferentes processos de teste. Testes unitários básicos tendem a ficar em examples/ e test/, enquanto alguns testes mais complexos destinados a serem executados em um ambiente de laboratório completo ficam em testdata/. Há também várias ferramentas de desenvolvimento/teste apenas nos diretórios scripts/ e internal/devtools. Essas só serão necessárias se você estiver tentando configurar seu próprio ambiente de teste para fazer desenvolvimento adicional. Em geral, qualquer desenvolvimento de LLM de algo tão complexo requer um número de casos de teste muito explícitos para orientar a geração, caso contrário, você acaba com algo que não funciona. O projeto inclui esses harnesses para que qualquer pessoa curiosa possa desenvolver suas próprias ferramentas ou contribuir com o projeto.
Espero que a comunidade considere essas ferramentas relativamente fáceis de usar e, com o tempo, continuaremos a melhorá-las. Talvez um dia a compilação C# funcione tão bem quanto a compilação Go.
Existem três maneiras de obter o wasmforge:
Binário pré-compilado. Baixe uma versão na página de Releases — builds do CLI para Linux, macOS e Windows estão anexados a cada tag.
Imagem Docker. Para projetos C# / .NET, a imagem fornecida já vem com todos
os pré-requisitos (.NET 10 SDK, workload NativeAOT-LLVM, WASI SDK 24.0,
wasm-ld, osslsigncode) pré-instalados. Compile-a uma vez com make docker-builde execute-a commake docker-run` — veja
docs/CSHARP.md para o fluxo completo. Este é o caminho
recomendado para C#.
Compilar a partir do código fonte.
make build
make build regenera o arquivo internal/build/build_assets.tar.gz embutido
e então compila o CLI. Se você apenas executar go build -o wasmforge ./cmd/wasmforge, obterá um binário funcional, mas os builds em modo de distribuição
(quando o CLI é executado fora desta árvore de código fonte) usarão um arquivo
embutido desatualizado. Veja CONTRIBUTING.md para uma explicação mais detalhada.
O diretório examples/ contém programas Go executáveis que você pode compilar
imediatamente. Veja examples/README.md para o menu completo.
GOOS=windows GOARCH=amd64 ./wasmforge build \
--ghost traefik \
-o myapp.exe \
/caminho/para/seu/projeto
A ponte da API Win32 é ativada automaticamente sempre que GOOS=windows — você não
precisa mais passar --win32-apis para o caso comum.
--ghost traefik substitui a distribuição de símbolos gopclntab embutida para se parecer com o proxy reverso Traefik. Dos perfis incluídos, este produz a menor taxa de detecção no VirusTotal. Outros perfis e instruções para gerar o seu próprio estão em docs/GHOST-PROFILES.md.
Os alvos Windows são autoassinados com um certificado autoassinado por padrão. Use --sign google.com para falsificar o certificado TLS de um domínio, ou --no-sign para desabilitar a assinatura completamente.
# Intel
GOOS=darwin GOARCH=amd64 ./wasmforge build -o myapp /caminho/para/seu/projeto
# Apple Silicon
GOOS=darwin GOARCH=arm64 ./wasmforge build -o myapp /caminho/para/seu/projeto
Nenhuma flag extra é necessária. A ponte de frameworks do macOS é ativada automaticamente sempre que GOOS=darwin. Veja docs/MACOS.md para a ponte de frameworks, suporte purego/ObjC e outras notas específicas da Apple.
# Suporte a sockets brutos (requer CAP_NET_RAW ou root no momento da compilação)
./wasmforge build --raw-sockets -o myapp ./caminho/para/projeto
# Saída verbosa (útil para primeiros builds)
GOOS=windows GOARCH=amd64 ./wasmforge build --ghost traefik --win32-apis -v -o tool.exe /caminho/para/projeto
# VERSIONINFO PE personalizado (apenas Windows)
./wasmforge build --pe-company "Acme Corp" --pe-product "AcmeTool" --pe-file-version "10.0.19041.1" ...