2008-09-18 15 views
10

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

+0

चेक w/[Assembly.GetEntryAssembly()] (http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getentryassembly.aspx) –

उत्तर

13

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

public class NotForAnyoneElse { 
    public NotForAnyoneElse() { 
    if (typeof(NotForAnyoneElse).Assembly.GetName().GetPublicKeyToken() != Assembly.GetEntryAssembly().GetName().GetPublicKeyToken()) { 
     throw new SomeException(...); 
    } 
    } 
} 
+2

मुझे लगता है कि नीचे उल्लिखित InternalsVisibleTo विकल्प बेहतर है। यह कोडिंग के बिना, इस उत्तर के समान ही है। काम करने के लिए आपको InternalsVisibleT के लिए असेंबली पर हस्ताक्षर करने की आवश्यकता है। दोनों तकनीकों के साथ, अन्य उपयोगकर्ता विधियों को देख सकते हैं और उन्हें प्रतिबिंब का उपयोग करके कॉल कर सकते हैं; लेकिन कॉलिंग असेंबली में एक ही कुंजी नहीं होने पर दोनों तकनीकें असफल हो जाएंगी। –

+0

मैं टोकन को एक स्ट्रिंग में परिवर्तित करने के बाद ही इसे काम करने में सक्षम था। बिटकोनवर्टर। टॉस्ट्रिंग (टाइपऑफ (NotForAnyoneElse) .ssembly.GetName()। GetPublicKeyToken()) – JohnZaj

1

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

2

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

+1

क्या यह प्रतिबिंब को हरा सकता है? – cathy

11

नेट 2.0 या बेहतर में, सब कुछ आंतरिक, और फिर दोस्त विधानसभाओं

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

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

  1. ILMerge .exe और .dll
  2. अंतिम .exe

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

+0

क्या यह प्रतिबिंब हरा देगा? – cathy

+0

नहीं, प्रतिबिंब को हरा करने के लिए आपको obfuscate करने की आवश्यकता है। –

0

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

1

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

कि हो जाएगा:

int MySecretPrimeDetectionAlgorithm(int lastPrimeNumber); 

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

int Asdfasdfasdfasdfasdfasdfasdf(int qwerqwerqwerqwerqwerqwer); 

दूसरों अभी भी अपने विधानसभा का उपयोग करने में सक्षम हो जाएगा, लेकिन यह किसी भी समझदार बनाने के लिए कठिन हो जाएगा।

9

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

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

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

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

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

+0

मुझे यकीन नहीं है कि इससे मेरी मदद कैसे होगी .. चाहे वह एक .NET असेंबली या मूल असेंबली है, कोई भी इसे सही लोड करने में सक्षम होना चाहिए .. – cathy

+0

हां, आप गतिशील रूप से एक अप्रबंधित DLL लोड कर सकते हैं और उसे निष्पादित भी कर सकते हैं - हालांकि तो आपको पता होना चाहिए: कोड का स्मृति पता, पैरामीटर की संख्या/प्रकार, उन पैरामीटरों को कैसे मार्शल करना है, आदि। चीजों को करने के लिए अप्रबंधित कोड में कॉल करना स्रोत के बिना व्यावहारिक रूप से असंभव है। उस लिंक से –

2

कोड प्रवेश सुरक्षा विशेषता है कि @Charles Graham उल्लेख StrongNameIdentityPermissionAttribute

+0

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

2

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

एक बात जिसका उल्लेख नहीं किया गया है ilmerge आपकी असेंबली आपके मुख्य .exe/.dll/जो भी हो, यह प्रविष्टि के लिए बाधा उत्पन्न करेगा (लोग आपके दास को अपने आप पर बैठने में सक्षम नहीं होंगे संदर्भित करने के लिए कहा जा रहा है), लेकिन प्रतिबिंब मार्ग को रोक नहीं पाएंगे ..

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

+0

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

3

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

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

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

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

1

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

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

उम्मीद है कि इससे मदद मिलती है। :)

2

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

-2

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

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

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

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