WasmForge — компилирует программы на Go и C# в однобинарные, изолированные в WASM-песочнице нативные исполняемые файлы с полиморфным выводом.
WasmForge компилирует программы на Go и C# в WebAssembly, а затем упаковывает их в единые нативные бинарные файлы. Полученные исполняемые файлы изолируют гостевой код внутри WASM-среды выполнения (форк wazero, создаваемый при каждой сборке). Из этой песочницы гости получают прозрачный доступ к сети, сырым сокетам, Win32 API и API фреймворков macOS.
Вы можете писать обычный Go, используя net.Dial, net.Listen или net/http. Вы также можете перенести существующий проект на C# .NET Framework. В любом случае результатом будет один бинарный файл, который запускается на Windows или macOS, без необходимости изменять исходный код гостя.

Быстрый взгляд на этот проект покажет, что он разрабатывался с ОЧЕНЬ АКТИВНЫМ использованием LLM. Часть документации тоже написана ими – но этот раздел – нет. Я постарался максимально «деслапифицировать» этот README, а также сделать процесс использования WasmForge максимально простым. И хотя LLM пишут документацию, которая сильно преувеличивает собственные достижения, ограничения в ней не описываются НАСТОЛЬКО чётко.
Чтобы правильно задать ожидания: хотя проект тестировался с множеством различных возможностей Go, это НЕ полное решение для всех программ на Go. Существует ещё значительный процент Win32 API, который не поддерживается должным образом (например, API, требующие callback-заглушек). Sliver, например, работает для значительного числа команд, но это НЕ полное взаимно-однозначное портирование со всей функциональностью. , например, всё ещё будет показывать пути с вместо традиционного , поскольку WASM-блоб не полностью обманут и не осознаёт, что находится в Windows. Другие возможности могут просто вызвать сбой. Если что-то не работает, попробуйте создать самый простой пример проблемного API и откройте issue или отправьте PR.
ls/C:\Сторона C# в конечном счёте скорее proof-of-concept, чем полноценная реализация. Процесс компиляции C# в WASM слишком экспериментален, и это означает, что WasmForge часто всё равно приходится переписывать значительную часть программы, чтобы она заработала. В итоге я, вероятно, слишком углубился в эту возможность и должен был просто рекомендовать людям использовать LLM для переписывания кода на C# в код на Go. Вероятно, это менее болезненно. Тем не менее, общий шаблон C# -> Wasm -> WasmForge РАБОТАЕТ и обходит значительное количество детектов, специфичных для C#.
В связи с этим – WasmForge в первую очередь предназначен для борьбы со СТАТИЧЕСКИМИ детектами. Процесс транспиляции обходит большинство детектов, даже для сканирования в памяти, но если ваш бинарный файл содержит такие очевидные строки, как mimikatz или sliver, некоторые простые сканеры памяти всё равно их обнаружат. Автоматическое обфускация строк, вероятно, будет добавлена в будущем, поскольку это довольно простая функция для автоматизации, но для первого прохода я не хотел добавлять дополнительную сложность в конвейер сборки, чтобы отладка оставалась относительно простой.
Хотя были предприняты некоторые усилия по очистке/консолидации исходного кода в этом репозитории, он всё ещё довольно неорганизован. Здесь есть несколько различных папок для разных процессов тестирования. Базовые модульные тесты обычно находятся в examples/ и test/, а некоторые более сложные тесты, предназначенные для запуска в полноценной лабораторной среде, - в testdata/. Также есть ряд инструментов для разработки/тестирования в папках scripts/ и internal/devtools. Они понадобятся только если вы пытаетесь настроить собственную тестовую среду для дальнейшей разработки. В целом, для разработки чего-то такого сложного с помощью LLM требуется большое количество очень конкретных тестовых случаев для направления генерации, иначе вы получите что-то, что вообще не работает. Проект включает эти обвязки, чтобы любой желающий мог продолжить разработку инструментов или внести свой вклад в проект.
Надеюсь, сообщество сочтёт этот инструмент относительно простым в использовании, и со временем мы продолжим его улучшать. Может быть, когда-нибудь компиляция C# будет работать так же хорошо, как компиляция Go.
Есть три способа получить wasmforge:
Готовый бинарный файл. Загрузите релиз со страницы релизов — сборки 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
Мост Win32 API автоматически включается, когда GOOS=windows — вам больше
не нужно передавать --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
Дополнительные флаги не требуются. Мост фреймворков macOS автоматически включается, когда GOOS=darwin. См. docs/MACOS.md о мосте фреймворков, поддержке purego/ObjC и других заметках по macOS.
# Поддержка сырых сокетов (требует 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> Профиль-призрак: traefik, caddy, terraform (см. docs/GHOST-PROFILES.md)
--raw-sockets Включить поддержку сырых сокетов
--win32-apis Включить мост Win32 API (целевая платформа Windows)
--sign <mode> Подписать бинарный файл: 'self' или имя домена (по умолчанию: self для Windows)
--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> Применить патчи исходного кода C# для NativeAOT-WASI
WasmForge устраняет разрыв между WASM и базовой хост-системой, так что гостевым программам не нужно к этому адаптироваться.
Платформенные API. TCP, UDP, DNS, HTTP, TLS и сырые сокеты работают без изменений гостевого кода как на Windows, так и на macOS. На Windows WasmForge проксирует всю поверхность Win32: реестр, файловый ввод-вывод, процессы, загрузку DLL и SyscallN с до 15 аргументами. Преобразование указателей выполняется автоматически. Цепочки vtable COM зеркалируются, так что 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 runtime на целевой машине.
Память хоста и шеллкод. Прокси памяти хоста на основе VirtualAlloc доступен из гостевой среды. Это делает возможными загрузчики COFF/BOF и выполнение шеллкода без выхода из WASM-песочницы.
Кооперативная уступка. Блокирующие Win32 API (Sleep, WaitForSingleObject, ReadFile и подобные) не замораживают WASM-горутины. Хост выполняет вызов в фоновой горутине и сигнализирует гостю об уступке до получения результата.
Полиморфный вывод. Каждая сборка создает структурно уникальный бинарный файл. WASM-опкоды переставляются, идентификаторы секций и магические байты рандомизируются, а все идентификаторы, PE-импорты, строки VERSIONINFO, блоки лицензий и имена исходных файлов очищаются. Встроенный форк wazero переписывается под переставленный байткод. Профили-призраки переписывают символы gopclntab под реальные корпоративные Go-бинарники (Traefik, Caddy, Terraform). Выводы для Windows по умолчанию подписываются Authenticode — либо самодельным сертификатом, либо имитацией TLS-сертификата реального домена через osslsigncode.
+-------------------- WASM-гость (wasip1) ---------------------+
| |
| Ваша программа на Go (net, net/http, os; работает прозрачно)|
| |
+----------- go:wasmimport ABI (пользовательские опкоды) -----+
|
+----------- Среда выполнения хоста (форк wazero для каждой сборки) ---+
| |
| 90+ хост-функций (сеть, прокси ОС, платформенные API) |
| Windows: преобразование указателей, теневая память, зеркалирование COM |
| macOS: мост фреймворков dlopen/dlsym, ABI-трамплины |
| |
+----------- wazero (пользовательская ВМ: переставленные опкоды/магия) ---+
|
Ядро ОС / Windows API / macOS Frameworks
Конвейер сборки состоит из шести этапов.
syscall/ и net/ для работы с WASM-сетью. Кэшируется в ~/.wasmforge/cache/.GOOS=wasip1 GOARCH=wasm с использованием пропатченной стандартной библиотеки. Автоматические заглушки покрывают платформенно-специфичные пробелы. Системные шмы для golang.org/x/sys и ebitengine/purego внедряются при наличии соответствующих импортов.main.go со случайными идентификаторами, соответствующим форком wazero, встроенными PE-ресурсами и -trimpath.osslsigncode.WasmForge компилирует и запускает немодифицированные сторонние Go-проекты, включая те, которые содержат сложный платформенно-специфичный код.
| Программа | Платформа | Описание | Проверено |
|---|---|---|---|
| Sliver | Windows | C2-фреймворк, интенсивное использование Win32 | HTTPS-бикон, whoami, ps, netstat, execute-assembly (Rubeus, Seatbelt) |
| Sliver | macOS | C2-фреймворк (бикон + сессия) | pwd, ls, download, execute, SOCKS5-прокси |
| go-clr | Windows | Хостинг CLR .NET + выполнение сборок | Цепочка загрузки CLR, триаж Rubeus, системное сканирование Seatbelt |
| Chisel | Windows | TCP/UDP туннель через HTTP с SOCKS5 | Подключение туннеля, пересылка прокси |
| Ligolo-ng | Windows | Продвинутое туннелирование и пивотинг | Интерфейс TUN, подключение агента |
| goffloader | Windows | Загрузчик COFF/BOF с использованием unsafe.Pointer | VirtualAlloc, выполнение шеллкода, разбор 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 требует целевой платформы Windows с флагом --win32-apis (другие цели возвращают 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/ дополнительно предполагают наличие Active Directory-диапазона, развернутого с помощью Ludus с запущенным 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 |
| Использование профилей-призраков и создание пользовательских профилей | 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, скрипты watchdog | docs/internals/LAB-STABILITY.md |
Copyright (c) 2025-2026 Praetorian Security, Inc.