WasmForge — يُجمِّع برامج Go وC# إلى ملفات تنفيذية أصلية أحادية الملف الثنائي، معزولة داخل بيئة WASM، مع إخراج متعدد الأشكال.
يقوم WasmForge بتجميع برامج Go وC# إلى WebAssembly، ثم يحزمها كملفات ثنائية أصلية واحدة. تُشغِّل الملفات التنفيذية الناتجة الكود الضيف داخل بيئة معزولة داخل بيئة تشغيل WASM (نسخة معدّلة لكل بناء من wazero). ومن داخل هذه البيئة المعزولة، يحصل الكود الضيف على وصول شفاف إلى الشبكات، والمقابس الخام (raw sockets)، وواجهات برمجة تطبيقات Win32، وواجهات برمجة تطبيقات أطر عمل macOS.
يمكنك كتابة كود Go عادي باستخدام net.Dial أو net.Listen أو net/http. كما يمكنك ترحيل مشروع C# قائم على .NET Framework. وفي كلتا الحالتين، يكون الناتج ملفاً ثنائياً واحداً يعمل على Windows أو macOS، دون أن يضطر المستخدم إلى إجراء أي تعديلات على الكود المصدري للكود الضيف.

نظرة سريعة على هذا المشروع ستُظهر بوضوح أنه طُوّر باستخدام مكثّف جداً لنماذج اللغة الكبيرة (LLMs). جزء كبير من التوثيق كُتب بها أيضاً — لكن هذا القسم ليس كذلك. لقد بذلت قصارى جهدي لإزالة الركاكة الناتجة عن الذكاء الاصطناعي من هذا الملف README، مع جعل عملية استخدام WasmForge الفعلية أبسط ما يمكن. كما أنه بينما تكتب نماذج اللغة الكبيرة توثيقاً يمجّد إنجازاتها بشكل مفرط، فإن القيود لا تُوضَّح بوضوح كافٍ.
لوضع التوقعات بشكل صحيح: على الرغم من اختبار هذا المشروع مع العديد من الميزات المختلفة للغة Go، إلا أنه ليس حلاً كاملاً لجميع برامج Go. لا تزال نسبة لا بأس بها من واجهة برمجة تطبيقات win32 غير مدعومة بشكل صحيح (مثل واجهات البرمجة التي تتطلب thunks لاستدعاءات الاسترجاع). على سبيل المثال، يعمل Sliver مع عدد لا بأس به من الأوامر لكنه ليس نقلاً كاملاً 1:1 من حيث الوظائف. فمثلاً، سيستمر ls في عرض المسارات بشرطات / بدلاً من المسارات التقليدية C:\ لأن كتلة WASM ليست مخدوعة بالكامل لإدراك أنها تعمل داخل Windows. هناك قدرات أخرى ستؤدي ببساطة إلى انهيار البرنامج. تأكد من اختبار أي وظيفة تريد استخدامها قبل تجربتها على هدف حقيقي. إذا كان هناك شيء لا يعمل، فحاول بناء أبسط مثال لواجهة البرمجة المعطّلة وافتح Issue أو أرسل Pull Request.
الجانب الخاص بـ C# في هذا المشروع هو في النهاية إثبات مفهوم أكثر منه تنفيذاً كاملاً. العملية المستخدمة لتجميع C# إلى WASM تجريبية للغاية، وهذا يعني أن WasmForge غالباً ما يحتاج إلى إعادة كتابة جزء كبير من البرنامج على أي حال لتشغيله. في النهاية، ربما أمعنتُ في هذه الإمكانية أكثر من اللازم، وكان الأجدر بي أن أنصح الناس باستخدام نموذج لغة كبير لإعادة كتابة كود C# إلى كود Go. فمن المرجح أن يكون التعامل مع ذلك أقل إيلاماً. ومع ذلك، فإن النمط العام C# -> Wasm -> WasmForge يعمل بالفعل، ويكسر عدداً لا بأس به من الاكتشافات الخاصة بـ C#.
في هذا الصدد — صُمم WasmForge بشكل أساسي للتعامل مع الاكتشافات الثابتة (STATIC). عملية التحويل البرمجي تكسر معظم الاكتشافات، حتى بالنسبة للمسح داخل الذاكرة، لكن في النهاية إذا كان ملفك الثنائي يحتوي على سلاسل نصية واضحة جداً مثل mimikatz أو sliver، فهناك بعض عمليات مسح الذاكرة منخفضة الجهد التي ستؤدي إلى اكتشافه. من المحتمل إضافة تشويش تلقائي للسلاسل النصية في المستقبل لأنه ميزة سهلة الأتمتة إلى حد ما، لكن في النسخة الأولى لم أرغب في إضافة تعقيد إضافي إلى خط البناء لإبقاء عملية التصحيح بسيطة نسبياً.
على الرغم من بذل بعض الجهود لتنظيف/توحيد الكود المصدري في هذا المستودع، إلا أنه لا يزال غير منظم إلى حد ما. توجد عدة مجلدات مختلفة لعمليات اختبار مختلفة. تميل اختبارات الوحدة الأساسية إلى التواجد في examples/ وtest/، بينما توجد بعض الاختبارات الأكثر تعقيداً والمخصصة للعمل في بيئة مختبرية كاملة في testdata/. هناك أيضاً عدد من الأدوات المخصصة للتطوير/الاختبار فقط في مجلدات scripts/ وinternal/devtools. لن تكون هذه ضرورية إلا إذا كنت تحاول إعداد بيئة الاختبار الخاصة بك لإجراء المزيد من التطوير. بشكل عام، أي تطوير بواسطة نماذج اللغة الكبيرة لشيء بهذا التعقيد يتطلب عدداً كبيراً من حالات الاختبار الواضحة جداً لتوجيه التوليد، وإلا سينتهي بك الأمر بشيء لا يعمل إطلاقاً. يتضمن المشروع هذه الأدوات المساعدة (harnesses) حتى يتمكن أي شخص مهتم من مواصلة تطوير أدواته الخاصة أو المساهمة في المشروع.
آمل أن يجد المجتمع هذه الأدوات سهلة الاستخدام نسبياً، وسنواصل تحسينها بمرور الوقت. ربما يوماً ما سيعمل تجميع C# بشكل جيد تماماً مثل تجميع Go.
هناك ثلاث طرق للحصول على wasmforge:
ملف ثنائي معد مسبقاً. حمّل إصداراً من صفحة الإصدارات — تُرفق إصدارات Linux وmacOS وWindows من CLI بكل وسم (tag).
صورة 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 تلقائياً كلما كان GOOS=windows — لم تعد بحاجة إلى تمرير --win32-apis في الحالة الشائعة.
يستبدل --ghost traefik توزيع رموز gopclntab المضمّن ليبدو مثل البروكسي العكسي Traefik. من بين الملفات المرفقة، ينتج هذا الملف أقل معدل اكتشاف في VirusTotal. الملفات الأخرى وتعليمات توليد ملف خاص بك موجودة في docs/GHOST-PROFILES.md.
يتم توقيع أهداف Windows تلقائياً بشهادة موقعة ذاتياً (self-signed) بشكل افتراضي. استخدم --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، وملاحظات أخرى خاصة بـ Apple.
# Raw socket support (requires CAP_NET_RAW or root at build time)
./wasmforge build --raw-sockets -o myapp ./path/to/project
# Verbose output (useful for first builds)
GOOS=windows GOARCH=amd64 ./wasmforge build --ghost traefik --win32-apis -v -o tool.exe /path/to/project
# Custom PE VERSIONINFO (Windows only)
./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.