WasmForge — Go और C# प्रोग्राम को single-binary, WASM-sandboxed native executables में polymorphic output के साथ संकलित करें।
WasmForge Go और C# प्रोग्रामों को WebAssembly में कंपाइल करता है, फिर उन्हें एकल नेटिव बाइनरीज़ के रूप में पैकेज करता है। परिणामी निष्पादन योग्य फ़ाइलें गेस्ट कोड को एक WASM रनटाइम (wazero के प्रति-बिल्ड फ़ोर्क) के अंदर सैंडबॉक्स करती हैं। उस सैंडबॉक्स के अंदर से, गेस्ट को नेटवर्किंग, रॉ सॉकेट्स, Win32 APIs और macOS फ्रेमवर्क APIs तक पारदर्शी पहुँच मिलती है।
आप net.Dial, net.Listen या net/http का उपयोग करके सामान्य Go लिख सकते हैं। आप किसी मौजूदा .NET Framework C# प्रोजेक्ट को माइग्रेट भी कर सकते हैं। किसी भी तरह से, आउटपुट एक एकल बाइनरी होती है जो Windows या macOS पर चलती है, बिना उपयोगकर्ता को गेस्ट स्रोत में संशोधन करने की आवश्यकता के।

इस प्रोजेक्ट पर एक त्वरित नज़र डालने से काफी स्पष्ट हो जाएगा कि इसे LLMs के भारी उपयोग के साथ विकसित किया गया था। दस्तावेज़ीकरण का एक हिस्सा भी ऐसा ही है - लेकिन यह खंड नहीं है। मैंने इस README को डी-स्लॉपिफाई करने के साथ-साथ WasmForge का उपयोग करने की प्रक्रिया को यथासंभव सीधा बनाने की पूरी कोशिश की है। इसके अलावा, जबकि LLMs ऐसा दस्तावेज़ीकरण लिखेंगे जो अपनी उपलब्धियों की बहुत प्रशंसा करता है, सीमाओं को उतना स्पष्ट नहीं किया जाता है।
अपेक्षाओं को ठीक से सेट करने के लिए, जबकि Go की विभिन्न सुविधाओं के साथ इसका परीक्षण किया गया है, यह सभी Go प्रोग्रामों के लिए पूर्ण समाधान नहीं है। win32 API का एक स्वस्थ प्रतिशत अभी भी ठीक से समर्थित नहीं है (जैसे कि वे APIs जिनमें कॉलबैक थंक्स की आवश्यकता होती है)। उदाहरण के लिए, Sliver कमांड की एक स्वस्थ संख्या के लिए काम करता है, लेकिन यह कार्यक्षमता के साथ पूर्ण 1:1 पोर्ट नहीं है। उदाहरण के लिए, ls अभी भी पारंपरिक C:\ पथ के बजाय / वाले पथ दिखाएगा, क्योंकि WASM ब्लॉब पूरी तरह से यह महसूस नहीं कर पाया है कि वह Windows के अंदर है। अन्य क्षमताएँ हैं जो सिर्फ क्रैश ट्रिगर कर देंगी। यह सुनिश्चित करें कि किसी वास्तविक लक्ष्य पर उपयोग करने का प्रयास करने से पहले आप किसी भी कार्यक्षमता का परीक्षण कर लें जिसका आप उपयोग करना चाहते हैं। यदि कुछ काम नहीं करता है, तो उस API का सबसे बुनियादी उदाहरण बनाने का प्रयास करें जो टूटा हुआ है और एक इश्यू खोलें / PR सबमिट करें।
C# वाला हिस्सा अंततः कार्यान्वयन की तुलना में अधिक प्रूफ-ऑफ-कॉन्सेप्ट है। C# को WASM में कंपाइल करने के लिए जिस प्रक्रिया का उपयोग किया जाता है वह बहुत अधिक प्रयोगात्मक है और इसका मतलब है कि WasmForge को अक्सर प्रोग्राम चलाने के लिए उसका एक स्वस्थ हिस्सा फिर से लिखने की आवश्यकता होती है। अंततः मैं शायद इस क्षमता पर बहुत अधिक समय बिता बैठा और लोगों को C# कोड को Go कोड के रूप में फिर से लिखने के लिए LLM का उपयोग करने की सिफारिश करनी चाहिए थी। यह संभवतः कम दर्दनाक है। फिर भी, C# -> Wasm -> WasmForge का सामान्य पैटर्न काम करता है और यह C#-विशिष्ट डिटेक्शन की एक स्वस्थ संख्या को तोड़ता है।
इस नोट पर - WasmForge मुख्य रूप से स्टैटिक डिटेक्शन से निपटने के लिए है। ट्रांसपिलेशन प्रक्रिया अधिकांश डिटेक्शन को तोड़ देती है, यहाँ तक कि मेमोरी-इन-स्कैनिंग के लिए भी, लेकिन अंततः यदि आपकी बाइनरी में कुछ बहुत स्पष्ट स्ट्रिंग्स हैं जैसे mimikatz या sliver, तो कुछ कम-प्रयास वाले मेमोरी-इन-स्कैन हैं जो डिटेक्शन का कारण बनेंगे। भविष्य में स्वचालित स्ट्रिंग अस्पष्टीकरण जोड़ा जाएगा क्योंकि यह स्वचालित करने के लिए काफी आसान सुविधा है, लेकिन पहले पास के लिए मैं डिबगिंग को अपेक्षाकृत सीधा रखने के लिए बिल्ड पाइपलाइन में अतिरिक्त जटिलता नहीं जोड़ना चाहता था।
जबकि इस रिपॉजिटरी में स्रोत कोड को साफ/समेकित करने के कुछ प्रयास किए गए हैं, यह अभी भी काफी अव्यवस्थित है। विभिन्न परीक्षण प्रक्रियाओं के लिए कई अलग-अलग फ़ोल्डर हैं। बुनियादी यूनिट परीक्षण examples/ और test/ में रहते हैं, जबकि कुछ अधिक जटिल परीक्षण जो पूर्ण प्रयोगशाला वातावरण में चलाए जाने के लिए होते हैं, testdata/ में रहते हैं। इसके अलावा scripts/ और internal/devtools फ़ोल्डरों में कई विकास/परीक्षण-केवल उपकरण हैं। ये केवल तभी आवश्यक होंगे यदि आप आगे के विकास के लिए अपना स्वयं का परीक्षण वातावरण स्थापित करने का प्रयास कर रहे हैं। सामान्य तौर पर इस जटिलता के कुछ विकसित करने के लिए किसी भी LLM को पीढ़ी का मार्गदर्शन करने के लिए बहुत स्पष्ट परीक्षण मामलों की आवश्यकता होती है, अन्यथा आप कुछ ऐसा बना लेते हैं जो बिल्कुल काम नहीं करता है। प्रोजेक्ट में ये हार्नेस शामिल हैं ताकि कोई भी जिज्ञासु व्यक्ति टूलिंग का अपना विकास जारी रख सके या प्रोजेक्ट में योगदान कर सके।
उम्मीद है कि समुदाय इस टूलिंग को अपेक्षाकृत उपयोग में आसान पाएगा और समय के साथ हम इसमें सुधार जारी रखेंगे। शायद एक दिन C# कंपाइलेशन उतना ही अच्छा काम करेगा जितना Go कंपाइलेशन करता है।
wasmforge प्राप्त करने के तीन तरीके हैं:
प्रीबिल्ट बाइनरी। Releases पेज से एक रिलीज़ डाउनलोड करें — CLI के Linux, macOS और Windows बिल्ड प्रत्येक टैग से जुड़े होते हैं।
Docker इमेज। C# / .NET प्रोजेक्ट्स के लिए, बंडल की गई इमेज में सभी पूर्वापेक्षाएँ (.NET 10 SDK, NativeAOT-LLVM workload, 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 लक्ष्य डिफ़ॉल्ट रूप से एक स्व-हस्ताक्षरित प्रमाणपत्र के साथ ऑटो-हस्ताक्षरित होते हैं। किसी डोमेन के TLS प्रमाणपत्र को नकली बनाने के लिए --sign google.com का उपयोग करें, या हस्ताक्षर को पूरी तरह से अक्षम करने के लिए --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 होता है तो अपने आप सक्रिय हो जाता है। फ्रेमवर्क ब्रिज, purego/ObjC समर्थन और अन्य Apple-विशिष्ट नोट्स के लिए docs/MACOS.md देखें।
# रॉ सॉकेट समर्थन (CAP_NET_RAW या बिल्ड समय पर रूट की आवश्यकता है)
./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 माइग्रेशन, पैच और बिल्ड पाइपलाइन चलाता है: