WasmForge — compila programmi Go e C# in eseguibili nativi a singolo binario, sandboxati con WASM, con output polimorfo.
WasmForge compila programmi Go e C# in WebAssembly, poi li impacchetta come singoli binari nativi. Gli eseguibili risultanti isolano il codice guest all'interno di un runtime WASM (un fork per build di wazero). Dall'interno di quel sandbox, i guest ottengono accesso trasparente a networking, socket raw, API Win32 e API dei framework macOS.
Puoi scrivere Go normale usando net.Dial, net.Listen o net/http. Puoi anche migrare un progetto C# .NET Framework esistente. In entrambi i casi, il risultato è un singolo binario che gira su Windows o macOS, senza richiedere all'utente di modificare il codice sorgente guest.

Uno sguardo veloce a questo progetto renderà abbastanza ovvio che è stato sviluppato con un uso INTENSO di LLM. Anche una parte della documentazione lo è stata – ma questa sezione no. Ho fatto del mio meglio per "de-slopificare" questo README e per rendere il processo di utilizzo di WasmForge il più semplice possibile. Inoltre, mentre gli LLM scriveranno documentazione che loda pesantemente i propri risultati, le limitazioni non sono rese ABBASTANZA chiare.
Per impostare correttamente le aspettative: sebbene sia stato testato con molte funzionalità diverse di Go, NON è una soluzione completa per tutti i programmi Go. C'è ancora una percentuale significativa dell'API Win32 che non è supportata correttamente (come le API che richiedono callback thunk). Sliver, ad esempio, funziona per un buon numero di comandi ma NON è una portabilità 1:1 completa. ls, per esempio, mostrerà ancora percorsi con / invece del classico C:\ poiché il blob WASM non è completamente ingannato per rendersi conto di essere all'interno di Windows. Ci sono altre funzionalità che causeranno semplicemente un crash. Assicurati di testare qualsiasi funzionalità che intendi utilizzare prima di provare a usarla su un target reale. Se qualcosa non funziona, prova a costruire l'esempio più basilare dell'API che è rotta e apri un issue / invia una PR.
Il lato C# è più una prova di concetto che una implementazione vera e propria. Il processo utilizzato per compilare C# in WASM è troppo sperimentale e significa che WasmForge spesso deve riscrivere una buona parte del programma comunque per farlo funzionare. Alla fine probabilmente ho dedicato troppo tempo a questa funzionalità e avrei dovuto semplicemente consigliare alle persone di usare un LLM per riscrivere il codice C# come codice Go. Probabilmente è meno doloroso da gestire. Detto questo, il pattern generale C# -> Wasm -> WasmForge FUNZIONA e riesce a bypassare un buon numero di rilevamenti specifici di C#.
A tal proposito – WasmForge è pensato principalmente per gestire rilevamenti STATICI. Il processo di transpilazione supera la maggior parte dei rilevamenti, anche per la scansione in memoria, ma alla fine se il tuo binario ha stringhe molto ovvie come mimikatz o sliver ci sono alcune scansioni in memoria a basso sforzo che causeranno un rilevamento. L'offuscamento automatico delle stringhe sarà probabilmente aggiunto in futuro poiché è una funzionalità abbastanza facile da automatizzare, ma per il primo passaggio non ho voluto aggiungere ulteriore complessità alla pipeline di build per mantenere il debug relativamente semplice.
Sebbene ci siano stati alcuni sforzi per pulire/consolidare il codice sorgente in questo repository, è ancora piuttosto disorganizzato. Ci sono diverse cartelle per diversi processi di test. I test unitari base tendono a trovarsi in examples/ e test/ mentre alcuni test più complessi pensati per essere eseguiti in un ambiente di laboratorio completo vivono in testdata/. Ci sono anche numerosi strumenti solo per sviluppo/test nelle cartelle scripts/ e internal/devtools. Questi saranno necessari solo se stai cercando di impostare il tuo ambiente di test per ulteriori sviluppi. In generale, qualsiasi sviluppo con LLM di qualcosa di così complesso richiede un numero di casi di test molto espliciti per guidare la generazione, altrimenti ti ritrovi con qualcosa che non funziona affatto. Il progetto include questi harness in modo che chiunque sia curioso possa sviluppare ulteriormente gli strumenti o contribuire al progetto.
Spero che la comunità trovi questi strumenti relativamente facili da usare e col tempo continueremo a migliorarli. Forse un giorno la compilazione C# funzionerà davvero come quella Go.
Ci sono tre modi per ottenere wasmforge:
Binario precompilato. Scarica una release dalla pagina Releases – build CLI per Linux, macOS e Windows sono allegate a ogni tag.
Immagine Docker. Per progetti C# / .NET, l'immagine in bundle include ogni
prerequisito (.NET 10 SDK, carico di lavoro NativeAOT-LLVM, WASI SDK 24.0,
wasm-ld, osslsigncode) preinstallato. Costruiscila una volta con
make docker-build e guidala con make docker-run – vedi
docs/CSHARP.md per il flusso di lavoro completo. Questo è il
percorso consigliato per C#.
Compila dal sorgente.
make build
make build rigenera l'archivio embedded internal/build/build_assets.tar.gz
e poi compila la CLI. Se esegui solo go build -o wasmforge ./cmd/wasmforge otterrai un binario funzionante, ma le build in modalità distribuzione
(quando la CLI viene eseguita al di fuori di questo albero dei sorgenti) useranno un archivio
embedded obsoleto. Vedi CONTRIBUTING.md per la spiegazione più lunga.
La directory examples/ contiene programmi Go eseguibili che puoi compilare subito.
Vedi examples/README.md per il menu completo.
GOOS=windows GOARCH=amd64 ./wasmforge build \
--ghost traefik \
-o myapp.exe \
/path/to/your/project
Il bridge API Win32 viene attivato automaticamente ogni volta che GOOS=windows – non devi
più passare --win32-apis per il caso comune.
--ghost traefik sostituisce la distribuzione dei simboli gopclntab embedded per assomigliare al proxy inverso Traefik. Tra i profili in bundle, questo produce il tasso di rilevamento VirusTotal più basso. Altri profili e istruzioni per generarli tuoi si trovano in docs/GHOST-PROFILES.md.
I target Windows vengono automaticamente firmati con un certificato autofirmato per impostazione predefinita. Usa --sign google.com per falsificare il certificato TLS di un dominio, oppure --no-sign per disabilitare completamente la firma.
# 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
Non sono necessari flag aggiuntivi. Il bridge dei framework macOS si attiva automaticamente ogni volta che GOOS=darwin. Vedi docs/MACOS.md per il bridge dei framework, il supporto purego/ObjC e altre note specifiche di Apple.
# Supporto socket raw (richiede CAP_NET_RAW o root al momento della build)
./wasmforge build --raw-sockets -o myapp ./path/to/project
# Output verboso (utile per le prime build)
GOOS=windows GOARCH=amd64 ./wasmforge build --ghost traefik --win32-apis -v -o tool.exe /path/to/project
# VERSIONINFO PE personalizzato (solo Windows)
./wasmforge build --pe-company "Acme Corp" --pe-product "AcmeTool" --pe-file-version "10.0.19041.1" ...