दूसरों को मेरी नेट असेंबली का उपयोग करने से कैसे रोकें?

मेरे पास एक असेंबली है जिसे नामित निष्पादन योग्य के अलावा किसी अन्य एप्लिकेशन द्वारा नहीं का उपयोग किया जाना चाहिए। कृपया मुझे ऐसा करने के लिए कुछ निर्देश दें।

0
W/ Assembly.GetEntryAssembly() देखें
जोड़ा लेखक Darren Kopp, स्रोत

13 उत्तर

कुछ हुप्स के माध्यम से कूदने के बिना 100% पूरी तरह असंभव है।

.NET का उपयोग करने के लाभों में से एक प्रतिबिंब का उपयोग करने की क्षमता है, जो एक असेंबली को लोड करता है और इसका निरीक्षण करता है, गतिशील रूप से कॉल विधियों आदि। यह वही है जो VB.NET और F # के बीच इंटरऑप बनाता है।

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

यदि आपको अपने .NET कोड को ऐसे फैशन में शिप करना होगा जो अन्य लोगों को इसे निष्पादित करने से रोकता है, तो आप अपने बाइनरी को एनजीएनएन (x86 पर संकलित कर सकते हैं) और उन बाइनरी को शिप कर सकते हैं।

मैं आपकी स्थिति के विनिर्देशों को नहीं जानता, लेकिन obfuscation पर्याप्त अच्छा होना चाहिए।

0
जोड़ा
हां, आप गतिशील रूप से एक अप्रबंधित DLL लोड कर सकते हैं और उसे निष्पादित भी कर सकते हैं - हालांकि आपको पता होना चाहिए: कोड का मेमोरी पता, पैरामीटर की संख्या/प्रकार, उन पैरामीटरों को कैसे मार्शल करना है आदि। चीजों को करने के लिए अप्रबंधित कोड में कॉल करना स्रोत के बिना व्यावहारिक रूप से असंभव है।
जोड़ा लेखक Chris Smith, स्रोत
मुझे यकीन नहीं है कि इससे मेरी मदद कैसे होगी .. चाहे वह एक .NET असेंबली या मूल असेंबली है, कोई भी इसे सही लोड करने में सक्षम होना चाहिए ..
जोड़ा लेखक cathy, स्रोत

फ़ंक्शन कॉल का उपयोग करने के लिए बस पास करने के लिए पास कोड की आवश्यकता होती है और यदि इसे अधिकृत नहीं किया गया है तो कुछ भी काम नहीं करता है, जैसे .setAuthorizeCode ('123456') तब इस्तेमाल किए जा सकने वाले प्रत्येक स्थान पर यह जांचता है कि क्या अधिकृत है कोड! = 123456 फिर त्रुटि फेंक दें या बाहर निकलें ... यह पुनः उपयोगिता के लिए एक अच्छा जवाब की तरह नहीं लगता है लेकिन यह बिल्कुल सही बात है।

इसका उपयोग करने का एकमात्र समय आपके द्वारा किया जा सकता है और जब आप हार्ड कोड प्रोग्राम में कोड को अधिकृत करते हैं।

सिर्फ एक विचार, जो आप खोज रहे हैं वह हो सकता है या आपको कुछ बेहतर तरीके से प्रेरित कर सकता है।

0
जोड़ा

मुझे यकीन नहीं है कि यह आपके लिए एक उपलब्ध एवेन्यू है, लेकिन शायद आप डब्ल्यूसीएफ या एएसपी.नेट वेब सेवाओं का उपयोग करके असेंबली की मेजबानी कर सकते हैं और कुछ प्रकार की प्रमाणीकरण योजना (एलडीएपी, सार्वजनिक/आरपीवीएटी कुंजी जोड़े इत्यादि) का उपयोग सुनिश्चित कर सकते हैं केवल ग्राहकों को कनेक्ट करने की अनुमति है। यह आपकी असेंबली शारीरिक रूप से किसी और के हाथों से बाहर रखेगा और आप इसे नियंत्रित कर सकते हैं कि कौन इसे जोड़ता है। सिर्फ एक विचार।

0
जोड़ा

आप obfuscation का उपयोग कर सकते हैं।

वह बदल जाएगा:

int MySecretPrimeDetectionAlgorithm(int lastPrimeNumber);

कुछ अपठनीय कुछ में:

int Asdfasdfasdfasdfasdfasdfasdf(int qwerqwerqwerqwerqwerqwer);

अन्य अभी भी आपकी असेंबली का उपयोग करने में सक्षम होंगे, लेकिन किसी भी समझदार बनाना मुश्किल होगा।

0
जोड़ा

आप एक ही कुंजी के साथ असेंबली और निष्पादन योग्य पर हस्ताक्षर कर सकते हैं और फिर उन वर्गों के निर्माता में चेक डाल सकते हैं जिन्हें आप सुरक्षित रखना चाहते हैं:

public class NotForAnyoneElse {
  public NotForAnyoneElse() {
    if (typeof(NotForAnyoneElse).Assembly.GetName().GetPublicKeyToken() != Assembly.GetEntryAssembly().GetName().GetPublicKeyToken()) {
      throw new SomeException(...);
    }
  }
}
0
जोड़ा
टोकन को एक स्ट्रिंग में कनवर्ट करने के बाद मैं इसे काम करने में सक्षम था। BitConverter.ToString (typeof (NotForAnyoneElse) .Assembly.GetN और जेडडब्ल्यूएनजे;। Ame() GetPublicKeyTo और जेडडब्ल्यूएनजे; केन ())
जोड़ा लेखक JohnZaj, स्रोत
मुझे लगता है कि नीचे उल्लिखित InternalsVisibleTo विकल्प बेहतर है। यह कोडिंग के बिना, इस उत्तर के समान ही है। काम करने के लिए आपको InternalsVisibleT के लिए असेंबली पर हस्ताक्षर करने की आवश्यकता है। दोनों तकनीकों के साथ, अन्य उपयोगकर्ता विधियों को देख सकते हैं और उन्हें प्रतिबिंब का उपयोग करके कॉल कर सकते हैं; लेकिन कॉलिंग असेंबली में एक ही कुंजी नहीं होने पर दोनों तकनीकें असफल हो जाएंगी।
जोड़ा लेखक Rob Kraft, स्रोत

आपको आंतरिक रूप से स्कैन किए जाने के लिए सब कुछ करने में सक्षम होना चाहिए, और फिर InternalsVisibleTo विशेषता केवल एक विधानसभा को आंतरिक तरीकों तक पहुंच प्रदान करने के लिए।

0
जोड़ा
क्या यह प्रतिबिंब हरा सकता है?
जोड़ा लेखक cathy, स्रोत

The Code Access Security attribute that @Charles Graham mentions is StrongNameIdentityPermissionAttribute

0
जोड़ा
उस लिंक से - .NET Framework संस्करण 2.0 और बाद में, कॉलिंग असेंबली पर पूर्ण विश्वास होने पर पहचान अनुमतियों की मांग अप्रभावी होती है।
जोड़ा लेखक cathy, स्रोत

.NET 2.0 या बेहतर में, सबकुछ आंतरिक बनाएं, और फिर मित्र असेंबली का उपयोग करें

http://msdn.microsoft.com/en-us/library/0tke9fxk.aspx

यह प्रतिबिंब को रोक नहीं पाएगा। मैं नीचे से कुछ जानकारी शामिल करना चाहता हूं। अगर आपको किसी को कॉल करने से रोकने की ज़रूरत है, तो शायद सबसे अच्छा समाधान है:

  1. .exe और .dll को हटाएं
  2. अंतिम .exe
  3. obfuscate

आप कॉल स्टैक भी देख सकते हैं और प्रत्येक कॉलर के लिए असेंबली प्राप्त कर सकते हैं और यह सुनिश्चित कर सकते हैं कि वे सभी असेंबली के समान कुंजी के साथ हस्ताक्षरित हैं।

0
जोड़ा
क्या यह प्रतिबिंब हरा देगा?
जोड़ा लेखक cathy, स्रोत
नहीं, प्रतिबिंब को हरा करने के लिए आपको obfuscate करने की जरूरत है।
जोड़ा लेखक Rick Minerich, स्रोत

आप असेंबली पर कोड एक्सेस सुरक्षा नीतियों में इसे सेट करने में सक्षम हो सकते हैं।

0
जोड़ा

जैसा कि कुछ लोगों ने उल्लेख किया है, आंतरिक VisibleTo विशेषता का उपयोग करें और सबकुछ आंतरिक के रूप में चिह्नित करें। यह निश्चित रूप से प्रतिबिंब के खिलाफ सुरक्षा नहीं करेगा।

One thing that hasnt been mentioned is to ilmerge your assemblies into your main .exe/.dll/whatever, this will up the barrier for entry a bit (people won't be able to see your assemby sitting on its own asking to be referenced), but wont stop the reflection route..

अद्यतन: इसके अलावा, आईआईआरसी, इल्मेज में एक सुविधा है जहां यह स्वचालित रूप से मर्ज किए गए असेंबली को आंतरिक रूप से आंतरिक कर सकती है, जिसका अर्थ यह होगा कि आपको InternalsVisibleTo का उपयोग करने की आवश्यकता नहीं है

0
जोड़ा
विडंबना यह है कि, वही असेंबली प्रतिबिंब का उपयोग करके मांग पर लोड की जा रही है। मुझे लगता है कि इसे रोकने के लिए कोई मूर्ख तरीका नहीं है।
जोड़ा लेखक cathy, स्रोत

आप Netz निष्पादन योग्य पैकर और कंप्रेसर का उपयोग करने पर भी देख सकते हैं।

यह आपकी असेंबली और आपकी .exe फ़ाइल लेता है और उन्हें एक निष्पादन योग्य में पैक करता है ताकि वे बाहर की दुनिया के आसपास खुदाई के बिना दिखाई दे सकें।

मेरा अनुमान है कि यह अधिकांश .NET प्रोग्रामर के लिए उपयोग को रोकने के लिए पर्याप्त है।

.netz दृष्टिकोण का एक बड़ा लाभ यह है कि आपको अपने कोड को बदलने की आवश्यकता नहीं है। एक और लाभ यह है कि यह वास्तव में आपकी स्थापना प्रक्रिया को सरल बनाता है।

0
जोड़ा

यदि असेंबली उदाहरण के लिए एक वेब सेवा थी, तो आप यह सुनिश्चित कर सकते हैं कि नामित निष्पादन योग्य एसओएपी संदेश में एक गुप्त मूल्य गुजरता है।

0
जोड़ा

ऐसा लगता है कि आप एक सुरक्षा या obfuscation उपकरण की तलाश में हैं। जबकि चांदी की बुलेट नहीं है, मैं जिस सुरक्षा उपकरण की सिफारिश करता हूं वह है smartassembly । कुछ विकल्प Salamander Obfuscator हैं, dotfuscator , और Xenocode

दुर्भाग्यवश, यदि आप किसी को पढ़ने के लिए अपने बाइट्स देते हैं ... यदि उनके पास पर्याप्त समय और प्रयास है, तो वे आपके कोड को लोड और कॉल करने का तरीका ढूंढ सकते हैं। एक टिप्पणी का उत्तर देने के लिए मुझे लगता है कि आप अक्सर पूछते हैं: सैलामैंडर आपके कोड को सीधे परावर्तक उपकरण में लोड होने से रोक देगा, लेकिन स्मार्टसाइब्स के साथ मैंने बेहतर (यानी: अधिक विश्वसनीय) अनुभव किए हैं।

उम्मीद है की यह मदद करेगा। :)

0
जोड़ा