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 من حيث الوظائف. فمثلاً، سيستمر في عرض المسارات بشرطات بدلاً من المسارات التقليدية لأن كتلة WASM ليست مخدوعة بالكامل لإدراك أنها تعمل داخل Windows. هناك قدرات أخرى ستؤدي ببساطة إلى انهيار البرنامج. إذا كان هناك شيء لا يعمل، فحاول بناء أبسط مثال لواجهة البرمجة المعطّلة وافتح Issue أو أرسل Pull Request.
ls/C:\الجانب الخاص بـ 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.
wasmforge build [package] Compile Go (or C#) package to a WASM-sandboxed native binary
-o, --output <path> Output binary path
--ghost <name> Ghost profile: traefik, caddy, terraform (see docs/GHOST-PROFILES.md)
--raw-sockets Enable raw socket support
--win32-apis Enable Win32 API bridge (Windows targets)
--sign <mode> Sign binary: 'self' or domain name (default: self for Windows)
--no-sign Disable default auto-signing for Windows targets
--tags <tags> Go build tags (comma-separated)
--pe-company / --pe-product / --pe-description / --pe-copyright / --pe-file-version
PE VERSIONINFO overrides
-v, --verbose Verbose build output
wasmforge run [package] Build and immediately execute
wasmforge clean Remove cached patched GOROOTs (~/.wasmforge/cache/)
wasmforge version Print version
wasmforge dotnet-migrate <dir> Migrate .NET Framework project to .NET 10 NativeAOT-WASI
wasmforge dotnet-patch <dir> Apply NativeAOT-WASI C# source patches
يسدّ WasmForge الفجوة بين WASM والمضيف الأساسي بحيث لا يضطر الكود الضيف إلى التعامل معها.
واجهات برمجة تطبيقات النظام. تعمل TCP وUDP وDNS وHTTP وTLS والمقابس الخام دون تغيير كود الضيف على كل من Windows وmacOS. على Windows، يقوم WasmForge بوساطة كامل سطح Win32: السجل، إدخال/إخراج الملفات، العمليات، تحميل DLL، وSyscallN حتى 15 وسيطاً. ترجمة المؤشرات تلقائية. تنعكس سلاسل جداول COM الافتراضية بحيث يعمل CLR وغيره من واجهات البرمجة المعتمدة على COM بشكل كامل من البداية إلى النهاية. على 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 القائمة وينتج ملفات PE ثنائية واحدة لنظام Windows دون الحاجة إلى بيئة تشغيل .NET على الهدف.
ذاكرة المضيف وshellcode. يمكن الوصول من داخل الكود الضيف إلى وسيط ذاكرة مضيف مدعوم بـ VirtualAlloc. وهذا يجعل محمّلات COFF/BOF وتنفيذ shellcode ممكنة دون الخروج من بيئة WASM المعزولة.
التنازل التعاوني. لا تؤدي واجهات برمجة تطبيقات Win32 المعطِّلة (Sleep, WaitForSingleObject, ReadFile, وما شابهها) إلى تجميد goroutines الخاصة بـ WASM. يقوم المضيف بتوزيع الاستدعاء على goroutine في الخلفية ويُشير إلى الكود الضيف بالتنازل عن المعالج حتى تصبح النتيجة جاهزة.
مخرجات متعددة الأشكال. ينتج كل تجميع ملفاً ثنائياً فريداً من الناحية البنيوية. يتم تبديل opcodes الخاصة بـ WASM، وعشوائية معرّفات الأقسام والبايتات السحرية، وتنظيف كل معرّف واستيراد PE وسلسلة VERSIONINFO وكتلة ترخيص واسم ملف مصدري. تُعاد كتابة نسخة wazero المرفقة لتطابق البايتكود المبدَّل. تعيد ملامح Ghost كتابة رموز gopclntab لتطابق ملفات Go الثنائية الحقيقية للمؤسسات (Traefik، Caddy، Terraform). يتم توقيع مخرجات Windows بتوقيع Authenticode افتراضياً، إما بتوقيع ذاتي أو بانتحال شهادة TLS لنطاق حقيقي عبر osslsigncode.
+-------------------- 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/ للشبكات عبر WASM. تُخزَّن مؤقتاً في ~/.wasmforge/cache/.GOOS=wasip1 GOARCH=wasm مقابل المكتبة القياسية المُرقَّعة. تغطي الدوال البديلة التلقائية الفجوات الخاصة بالمنصة. يتم حقن طبقات التوافق (sysshims) الخاصة بـ 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 | استضافة .NET CLR + تنفيذ التجميعات | سلسلة تحميل CLR، تقييم Rubeus، فحص نظام Seatbelt |
| Chisel | Windows | نفق TCP/UDP عبر HTTP مع SOCKS5 | اتصال النفق، إعادة توجيه البروكسي |
| Ligolo-ng | Windows | أنفاق متقدمة وتنقّل جانبي | واجهة TUN، اتصال الوكيل |
| goffloader | Windows | محمّل COFF/BOF يستخدم unsafe.Pointer | VirtualAlloc، تنفيذ shellcode، تحليل PE، تحليل IAT |
برامج .NET NativeAOT-WASI:
| البرنامج | المنصة | الوصف | التحقق |
|---|---|---|---|
| Seatbelt | Windows | تعداد الأمان | تمر معظم الأوامر؛ أما القلة التي تتطلب توزيع استدعاءات WMI / Defender فهي مُثبَّتة بدوال فارغة صريحة (honest stubs) بانتظار دعم الجسر. |
| Rubeus | Windows | أدوات Kerberos | تعمل عمليات التجزئة (hash) والتوكنات مباشرة؛ تمر أفعال الشبكة (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 أو صلاحيات الجذر. يحتاج جسر 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، ping عبر ICMP) | 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 |
مراجع المشرفين
| الموضوع | المستند |
|---|---|
| عقد واجهة برمجة المضيف — الصادرات المسجلة، استقرار التواقيع | 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 |
حقوق النشر (c) 2025-2026 Praetorian Security, Inc.