2009-04-30 11 views
14

मैं अपने प्रोजेक्ट के डीएलएस को इस तरह से कैसे सुरक्षित रख सकता हूं कि उन्हें अन्य लोगों द्वारा संदर्भित और उपयोग नहीं किया जा सकता है?डीएलएस की रक्षा कैसे करें?

धन्यवाद

उत्तर

20

संक्षिप्त उत्तर यह है कि स्पष्ट चीजों से परे, आप इतना कुछ नहीं कर सकते हैं।

स्पष्ट चीजें हैं जो आप विचार करना चाह सकते (मोटे तौर पर कठिनाई बढ़ रही है और दिखावट को कम करने के क्रम में) में शामिल हैं:

  • स्टेटिक लिंक तो वहाँ पर हमला करने की कोई DLL है।
  • सभी प्रतीकों को पट्टी।
  • एक .DEF फ़ाइल और एक आयात लाइब्रेरी का उपयोग करें, केवल अज्ञात निर्यात केवल उनके निर्यात आईडी द्वारा ही जाना जाता है।
  • डीएलएल को संसाधन में रखें और इसे चलाने के दौरान फ़ाइल सिस्टम (एक उपयुक्त अस्पष्ट नाम के तहत, शायद यहां तक ​​कि रन टाइम पर भी उत्पन्न) में बेनकाब करें।
  • वास्तविक तरीकों से फ़ंक्शन पॉइंटर्स की एक तालिका के लिए एक गुप्त (बेहतर, गुप्त के ज्ञान का सबूत) का आदान-प्रदान करने वाली फैक्ट्री विधि के पीछे सभी वास्तविक कार्यों को छुपाएं।
  • रिवर्स इंजीनियरिंग को रोकने के लिए मैलवेयर दुनिया से उधार एंटी-डिबगिंग तकनीकों का उपयोग करें। (ध्यान दें कि यह आपको एवी टूल्स से झूठी सकारात्मकता प्राप्त करेगा।)

भले ही, पर्याप्त रूप से निर्धारित उपयोगकर्ता अभी भी इसका उपयोग करने के तरीकों का पता लगा सकता है। एक सभ्य disassembler जल्दी से आवश्यक सभी जानकारी प्रदान करेगा।

ध्यान दें कि यदि आपका डीएलएल वास्तव में एक COM वस्तु है, या फिर भी एक सीएलआर असेंबली है, तो वहां बड़ी मात्रा में रनटाइम प्रकार की जानकारी है जिसे आप अपने इच्छित उपयोग को तोड़ने के बिना बंद नहीं कर सकते हैं।

संपादित करें: जब से तुम सूचित करते हैं कि सी # retagged है और नेट पर्यावरण के बजाय एक शुद्ध Win32 DLL सी में लिखे हैं, तो मैं सच में ऊपर से गौर करना होना करने के लिए "तुम लेकिन नहीं कर सकते, .. "

वातावरण से निपटने के लिए लंबे समय तक obfuscation उपकरण के लिए एक बाजार रहा है जहां संकलित स्रोत की डिलीवरी अनिवार्य है, लेकिन आप उपयोगी स्रोत वितरित नहीं करना चाहते हैं। ऐसे सी # उत्पाद हैं जो उस बाजार में खेलते हैं, और ऐसा लगता है कि कम से कम एक ने चिंतित किया है।

क्योंकि असेंबली को लोड करने के लिए ढांचे से बहुत अधिक प्रयास की आवश्यकता होती है, ऐसा लगता है कि अनुमति बिट्स हैं जो कुछ नियंत्रण लागू करते हैं ईमानदार प्रदाताओं और असेंबली के उपभोक्ताओं। मैंने इन विधियों द्वारा प्रदान की गई वास्तविक सुरक्षा के बारे में कोई चर्चा नहीं देखी है और केवल यह नहीं पता कि वे निर्धारित हमले के खिलाफ कितने प्रभावी हैं।

आपके उपयोग के मामले पर बहुत कुछ निर्भर होने जा रहा है। यदि आप केवल आकस्मिक उपयोग को रोकना चाहते हैं, तो संभवतः आप एक समाधान ढूंढ सकते हैं जो आपके लिए काम करता है। यदि आप रिवर्स इंजीनियरिंग और पुन: उपयोग से मूल्यवान व्यापार रहस्यों की रक्षा करना चाहते हैं, तो आप बहुत खुश नहीं हो सकते हैं।

3

आप इसे अपने निष्पादन में एम्बेड सकता है, और रनटाइम पर निकालने और LoadLibrary और इसे में कहते हैं। या आप साथ में फ़ाइल को एन्क्रिप्ट/डिक्रिप्ट करने के लिए किसी भी प्रकार की साझा कुंजी का उपयोग कर सकते हैं और उपरोक्त कार्य कर सकते हैं।

मुझे लगता है कि आप इसे संकलित करने जैसे समाधानों को पहले ही मान चुके हैं यदि आप वास्तव में इसे साझा नहीं करना चाहते हैं। अगर कोई वास्तव में इसे प्राप्त करना चाहता है, तो ऐसा करने के कई तरीके हैं।

+0

.NET exe फ़ाइलों में भी असेंबली हैं और संदर्भित किया जा सकता है। –

+0

इसके लिए समाधान क्या है? – Josh

+0

दुर्भाग्यवश, यह रोकने के लिए एक बहुत ही आसान समाधान है। एक बार जब आप इसे लोड कर लेते हैं तो असेंबली को स्मृति से डंप करना काफी आसान होता है जिससे किसी को भी "एन्क्रिप्टेड" असेंबली का उपयोग करने की इजाजत मिलती है। –

5

StrongNameIdentityPermissionAttribute पर एक नज़र डालें। यह आपको आपकी असेंबली तक पहुंच घोषित करने की अनुमति देगा। एक अच्छा कोड सुरक्षा उपकरण (जैसे CodeVeil (अस्वीकरण मैं कोडवेल बेचता हूं) के साथ संयुक्त) आप बहुत खुश होंगे।

12

आप डीआरएम के समर्थकों के समान मुद्दे का सामना कर रहे हैं।

तो अपने कार्यक्रम (जो आप DLL को चलाने के लिए सक्षम होने के लिए चाहते हैं) कुछ उपयोगकर्ता खाते से runnable है, तो वहाँ कुछ भी नहीं है कि एक पर्याप्त निर्धारित प्रोग्रामर जो अलग से है कि उपयोगकर्ता के रूप में पर लॉग इन कर सकते रोक सकता है कोड जो डिक्रिप्शन करता है और इसका उपयोग करके आपके डीएलएल को डिक्रिप्ट करने और इसे चलाने के लिए उपयोग करता है।

आप निश्चित रूप से इस रिवर्स इंजीनियरिंग को करने के लिए असुविधाजनक बना सकते हैं, और यह पर्याप्त हो सकता है।

+2

+1 क्योंकि +100 की अनुमति नहीं है। – RBerteig

1

वैसे आप के रूप में "आंतरिक" या "आंतरिक संरक्षित" अपने "सार्वजनिक" वर्गों के सभी निशान सकता है तो आप [विधानसभा के साथ विधानसभाओं चिह्नित करें: InternalsVisibleTo ("")] विशेषता और कोई भी चिह्नित विधानसभा सामग्री को देख सकता है।

+0

प्रतिबिंब भी निजी प्रकार/सदस्यों का उपयोग करने की अनुमति देता है। –

+0

क्या आपका मतलब है, भले ही आप InternalsVisibleTo विशेषता Reflector.Net लागू करते हैं, फिर भी कोड को बेनकाब कर सकते हैं? – Jon

+0

हां। कोई भी डिस्सेबलर का उपयोग कर सकता है और उनके आंतरिक की सामग्री को देख सकता है VisibleTo विशेषता और उसी नाम के साथ एक असेंबली बना सकता है और पहुंच प्राप्त कर सकता है। –

1

क्या आपने कोशिश की है। नेट रिएक्टर? मैं हाल ही में इस पर आया था। कुछ लोग इसका महान कहते हैं लेकिन मैं अभी भी इसका परीक्षण कर रहा हूं।

संबंधित मुद्दे