كيف تمنع الآخرين من استخدام مجموعة .Net الخاصة بي؟

لديّ تجميع يجب ألا يستخدم لا من خلال أي تطبيق آخر غير الملف التنفيذي المعين. من فضلك أعطني بعض التعليمات للقيام بذلك.

0
وأضاف تحرير
الآراء: 1
تحقق من w/ Assembly.GetEntryAssembly()
وأضاف المؤلف Darren Kopp, مصدر

13 إجابة

100 ٪ مستحيل تماما دون القفز من خلال بعض الأطواق.

أحد مزايا استخدام .NET هو القدرة على استخدام الانعكاس ، الذي يتم تحميله من خلال تجميع وتفتيشه ، وطرق الاتصال بشكل ديناميكي ، وما إلى ذلك. وهذا ما يجعل إمكانية التشغيل المتداخل بين VB.NET و F # ممكنًا.

ومع ذلك ، نظرًا لأن شفرتك موجودة في مجموعة مدارة ، فهذا يعني أن أي شخص يمكنه إضافة مرجع إلى شفرتك واستدعاء أساليبه العامة أو تحميله باستخدام الانعكاس والاتصال بالطرق الخاصة . حتى في حالة "تعتيم" شفرتك ، سيظل بإمكان الأشخاص استخدام التفكير واستدعاء الشفرة. ومع ذلك ، لأن جميع الأسماء ستكون ملثمين فعل أي شيء صعب للغاية.

إذا كان من الضروري شحن رمز .NET الخاص بك بطريقة تمنع الآخرين من تنفيذه ، فقد تتمكن من NGEN الخاص بك الثنائي (قم بتجميعه إلى x86) وشحن تلك الثنائيات.

لا أعرف تفاصيل موقفك ، ولكن يجب أن يكون التشويش جيدًا بما يكفي.

0
وأضاف
نعم ، يمكنك تحميل DLL غير مدار ديناميكيًا وتنفيذ ذلك أيضًا - ومع ذلك يجب عليك معرفة: عنوان الذاكرة الخاص بالرمز ، وعدد/نوع المعلمات ، وكيفية تنظيم هذه المعلمات ، إلخ. الاتصال برمز غير مُدار للقيام بالأشياء مستحيل عمليا دون وجود المصدر.
وأضاف المؤلف Chris Smith, مصدر
أنا لست متأكدا كيف سيساعدني ذلك .. سواء كان تجميع .net أو تجميع أصلية ، يجب أن يكون أي شخص قادرا على تحميله الحق ..
وأضاف المؤلف cathy, مصدر

كل ما عليك هو طلب رمز مرور ليتم إرساله باستخدام مكالمة وظيفية ، وإذا لم يكن مصرحًا له ، فعندئذ لن ينجح شيء ، مثل .setAuthorizeCode ('123456') ، ثم في كل مكان يمكن استخدامه ، تحقق إذا كان authorizeCode! = 123456 ثم رمي خطأ أو الخروج فقط ... لا يبدو وكأنه إجابة جيدة لإعادة الاستخدام ، ولكن هذا هو بالضبط الهدف.

المرة الوحيدة التي يمكن استخدامها هي من قبلك وعند رمز الثابت تخويل التعليمات البرمجية في البرنامج.

مجرد التفكير ، يمكن أن يكون ما تبحث عنه أو قد يلهمك على شيء أفضل.

0
وأضاف

لست متأكداً إذا كان هذا سبيلاً متاحاً لك ، ولكن ربما يمكنك استضافة التجميع باستخدام خدمات ويب WCF أو ASP.NET واستخدام نوع من نظام المصادقة (LDAP ، أزواج المفاتيح العامة/rpivate ، إلخ) لضمان يسمح فقط للعملاء الاتصال. هذا من شأنه أن يبقي التجميع الخاص بك جسديا بعيدا عن يدي أي شخص آخر ويمكنك التحكم في من يتصل به. مجرد فكرة.

0
وأضاف

يمكنك استخدام التعتيم.

سيحول ذلك:

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 & zwnj؛ آمي() GetPublicKeyTo & zwnj؛ كين ())
وأضاف المؤلف JohnZaj, مصدر
أعتقد أن الخيار InternalsVisibleTo المذكورة أدناه أفضل. إنه نفس الشيء مثل هذه الإجابة ، بدون الترميز. تحتاج إلى توقيع التجميعات لـ InternalsVisibleTo للعمل. باستخدام كلتا التقنيتين ، يمكن للمستخدمين الآخرين رؤية الطرق واستدعاءهم باستخدام الانعكاس ؛ ولكن ستفشل كلا التقنيين إذا لم يكن لدى مجموعة الاستدعاء نفس المفتاح.
وأضاف المؤلف 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. ILMerge the.exe و .dll
  2. التشويش النهائي .exe

يمكنك أيضًا التحقق من مكدس الاستدعاءات والحصول على التجميع لكل متصل وتأكد من توقيع كل منهم بنفس المفتاح مثل التجميع.

0
وأضاف
سوف يفوز هذا التفكير؟
وأضاف المؤلف cathy, مصدر
لا ، للتغلب على التفكير تحتاج إلى التشويش.
وأضاف المؤلف Rick Minerich, مصدر

قد تتمكن من ضبط هذا في سياسات Code Access Security على التجميع.

0
وأضاف

كما ذكر بعض الأشخاص ، استخدم السمة InternalsVisibleTo وقم بتمييز كل شيء على أنه داخلي. هذا بالطبع لن يحرس ضد التفكير.

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..

تحديث: أيضا ، IIRC ، ilmerge لديه ميزة حيث يمكن automaticaly استيعاب التجميعات المدمجة ، مما يعني أنك لا تحتاج إلى استخدام InternalsVisibleTo على الإطلاق

0
وأضاف
ومن المفارقات أن هذا التجمع نفسه يتم تحميله عند الطلب باستخدام الانعكاس. أعتقد أنه لا يوجد طريقة مضمونة لمنع هذا.
وأضاف المؤلف cathy, مصدر

يمكنك أيضًا النظر في استخدام Netz للمكبس القابل للتنفيذ والضاغط.

هذا يأخذ التجميعات وملف. exe الخاص بك وحزمها في واحد قابل للتنفيذ بحيث تكون غير مرئية للعالم الخارجي دون قليل من الحفر حولها.

تخميني هو أن هذا يكفي لمنع الوصول إلى معظم المبرمجين.

هناك فائدة كبيرة من طريقة .netz وهي أنها لا تتطلب منك تغيير شفرتك. فائدة أخرى هي أنه يبسط حقا عملية التثبيت الخاصة بك.

0
وأضاف

إذا كان التجميع خدمة ويب على سبيل المثال ، يمكنك التأكد من أن الملف التنفيذي المعين يمرر قيمة سرية في رسالة SOAP.

0
وأضاف

يبدو أنك تبحث عن أداة حماية أو تشويش. على الرغم من عدم وجود رصاصة فضية ، فإن أداة الحماية التي أوصي بها هي smartassembly . بعض البدائل Salamander Obfuscator ، dotfuscator و Xenocode .

لسوء الحظ ، إذا كنت تعطي وحدات البايت الخاصة بك لشخص ما ليتم قراءتها ... إذا كان لديهم ما يكفي من الوقت والجهد ، يمكنهم العثور على طريقة لتحميل واستدعاء شفرتك. للإجابة بشكل استباقي على تعليق أراك تسأل بشكل متكرر: سيمنع Salamander من تحميل الرمز الخاص بك مباشرة في أداة Reflector ، ولكن كان لدي خبرة أفضل (أي: أكثر موثوقية) مع smartassembly.

أتمنى أن يساعدك هذا. :)

0
وأضاف