2008-11-20 12 views
33

से CreateProcess मैं EXE लॉन्च करने के लिए CreateProcess का उपयोग कर सकता हूं। मैं एक मेमोरी बफर में एक EXE की सामग्री रखना चाहता हूं और इसे फ़ाइल में लिखने के बिना CreateProcess (या समकक्ष) करता हूं। क्या उसे करने का कोई तरीका है?मेमोरी बफर

बैकस्ट्रीरी: हम गेम बनाते हैं। हम अपने वितरकों को एक सादा EXE भेजते हैं, जो उसके बाद अपने पसंदीदा डीआरएम का उपयोग करके इसे लपेटते हैं और इसे अपने उपयोगकर्ताओं को बेचते हैं। ऐसे कई उदाहरण हैं जहां उपयोगकर्ताओं को दुर्घटनाएं मिलती हैं। अधिकांश दुर्घटनाओं को ठीक करने में 5 मिनट लगते हैं, लेकिन पैच वितरक के माध्यम से जाना चाहिए और इसमें कई दिन, सप्ताह भी लग सकते हैं। मैं सिर्फ खिलाड़ियों को पैच किए गए EXE नहीं भेज सकता क्योंकि इसमें वितरक का डीआरएम नहीं होगा। मैं एक एन्क्रिप्टेड डेटाफाइल के अंदर वास्तविक गेम EXE को वितरित करने के बारे में सोच रहा हूं, इसलिए लपेटा जाता है (बाहरी EXE) बस वास्तविक एक्सई को डिक्रिप्ट करता है और लॉन्च करता है। इस तरह मैं डीआरएम को अक्षम किए बिना सुरक्षित रूप से एक फिक्स वितरित कर सकता था।

उत्तर

2

आपको एक नई प्रक्रिया बनाने की आवश्यकता क्यों है? मैंने सोचा होगा कि आप प्रक्रिया के संदर्भ में भाग सकते हैं जो अनपॅकिंग/डिक्रिप्शन करता है।

+0

मैं निश्चित रूप से ऐसा कर सकते हैं। मैंने CreateProcess का उल्लेख किया क्योंकि यह मेरा सबसे अच्छा विकल्प है, लेकिन आप जो कहते हैं वह काम करेगा। – ggambett

1

जो आप चाहते हैं उसे "पैकर" नामक चीज़ के साथ हासिल किया जा सकता है। असल में स्मृति से एक्सई लॉन्च करना संभव हो सकता है, लेकिन यह एक पैकर से बहुत कठिन है;)

सबसे प्रसिद्ध ज्ञात पैकर्स में से एक यूपीएक्स (Google इसे) है। इसे डिक्रिप्ट करने के लिए टूल हैं, लेकिन कम से कम आपको काम करने के लिए एक प्रारंभिक बिंदु देना चाहिए। मैं भी काफी निश्चित हूं कि यूपीएक्स ओपन-सोर्स है।

+0

मैंने पहले यूपीएक्स का इस्तेमाल किया था लेकिन मैंने इस बार इसके बारे में नहीं सोचा था। खोज के लायक हो सकता है। धन्यवाद! – ggambett

+0

यह एक बहुत पुराना धागा है;) लेकिन यह सटीक करने के लिए कि यद्यपि यूपीएक्स वास्तव में खुला स्रोत है, लेकिन इसका लाइसेंस एन्क्रिप्शन/obfuscation उद्देश्यों के लिए इसका उपयोग स्पष्ट रूप से मना कर देता है। – Ale

3

आप क्या करना चाहते हैं NtCreateProcess की आवश्यकता है, लेकिन यह अनियंत्रित और इसलिए भंगुर है। This book स्पष्ट रूप से इसके उपयोग को शामिल करता है।

शायद आप पैच सिस्टम बना सकते हैं? जैसे लॉन्च पर, प्रोग्राम उसी निर्देशिका में पैच डीएलएल के लिए जांचता है, और यदि यह मौजूद है तो इसे लोड करता है।

11

आप गेम को डीएलएल के रूप में संकलित कर सकते हैं और डीएलएल को एन्क्रिप्टेड डेटा फ़ाइल में डाल सकते हैं। डीएलएल को डिस्क पर लिखने के बिना स्मृति से लोड किया जा सकता है। कृपया इस ट्यूटोरियल (अंत में नमूना कोड के साथ) देखें: Loading a DLL From Memory

+0

भी http://stackoverflow.com/questions/638277/loading-dll-from-a-location-in-memory – Suma

40

यह वास्तव में काफी आसान है। 3 साल पहले पढ़ने वाले पेपर में इसी तरह की तकनीक का वर्णन किया गया है।

विंडोज आप के साथ CREATE_SUSPENDED झंडा, कि एपीआई बताता प्रक्रिया को निलंबित कर दिया ResumeThread समारोह कहा जाता है जब तक रखने के लिए CreateProcess समारोह कॉल करने के लिए अनुमति देते हैं।

यह हमें GetThreadContext फ़ंक्शन का उपयोग करके निलंबित धागे के संदर्भ को पकड़ने का समय देता है, तो ईबीएक्स रजिस्टर PBE(Process Enviroment Block) संरचना में एक सूचक होगा, जिसे हमें आधार पता निर्धारित करने की आवश्यकता है।

PBE संरचना हम देख सकते हैं कि ImageBaseAddress 8 बाइट में संग्रहीत किया जाता है, इसलिए के लेआउट से [EBX + 8] हमें प्रक्रिया का वास्तविक आधार पते निलंबित किया जा रहा दे देंगे।

अब हमें इन-मेमोरी EXE की आवश्यकता है और स्मृति और संरेखण EXE भिन्न होने पर संरेखण संरेखण की आवश्यकता है।

निलंबित प्रक्रिया के और इन-स्मृति exe से मेल खाता है, के साथ साथ आधार का पता अगर में स्मृति exe की imageSize कम या निलंबित प्रक्रिया 'हम बस WriteProcessMemory उपयोग कर सकते हैं में इन-स्मृति exe लिखने के लिए के बराबर है निलंबित प्रक्रिया की स्मृति स्थान।

लेकिन यदि उपर्युक्त शर्तों को पूरा नहीं किया गया था, तो हमें थोड़ा और जादू चाहिए। सबसे पहले, हम ZwUnmapViewOfSection का उपयोग कर मूल छवि unmap, और फिर निलंबित प्रक्रिया की स्मृति अंतरिक्ष के भीतर VirtualAllocEx का उपयोग कर के लिए पर्याप्त स्मृति आवंटित की जरूरत है। अब हमें WriteProcessMemory फ़ंक्शन का उपयोग करके निलंबित प्रक्रिया की स्मृति स्थान में इन-मेमोरी एक्सई लिखना होगा।

इसके बाद, निलंबित प्रक्रिया के PEB-> ImageBaseAddress में इन-स्मृति exe की BaseAddress पैच। धागा संदर्भ से

EAX रजिस्टर EntryPoint पता है, जो हम में स्मृति exe की EntryPoint पते के साथ फिर से लिखने की जरूरत है। अब हमें SetThreadContext फ़ंक्शन का उपयोग करके संशोधित थ्रेड संदर्भ को सहेजने की आवश्यकता है।

वोला! हम इसे निष्पादित करने के लिए निलंबित प्रक्रिया पर ResumeThread फ़ंक्शन को कॉल करने के लिए तैयार हैं! BoxedAppSDK

पर

+0

कर देखें कि कहीं EXE एक प्रकट किया है यह काम नहीं करता। ओह, यह ठीक है, लेकिन बुरी चीजें हो सकती हैं। – Joshua

+0

कागज भी एक सिंहावलोकन है कि (अब एक ही एक हो सकता है ...) यहां पाया जा सकता: http://www.security.org.sg/code/loadexe.html – Urchin

+0

किसी के द्वारा पारित करने के लिए, यहाँ कुछ उदाहरण है कोड: https://groups.google.com/forum/#!msg/comp.os.ms-windows.programmer.win32/Md3GKPc279A/Ax3bYgXhpD8J –

0

देखो यह एक स्मृति बफर से exe शुरू करने का समर्थन करता है।

उम्मीद है कि यह मदद करता है।

+0

कैसे करें वे अस्थायी फ़ाइलों के बिना निष्पादन योग्य चलाते हैं? ऐसा करने के लिए कोई अन्य सॉफ्टवेयर दावा नहीं करता है। – Navin

+0

बहुत सारे कार्यों को जोड़कर :) –