- tarik
- عدد المساهمات : 134
تاريخ التسجيل : 08/10/2012
الوافي في حماية البرنامج عبر التسجيل والتفعيل
السبت سبتمبر 28, 2013 8:44 am
بسم الله الرحمن الرحيم
وأفضل الصلاة و أتم التسليم على رسولنا الكريم
السلام عليكم ورحمة الله وبركاته
تحية طيبة وبعد:
سنتناول في هذا الموضوع طريقة تسجيل البرنامج وتفعيله و الذي تم تناوله سابقا في الفيجوال بيسك 6 ورغم الوقت بين الموضوعين لم أجد موضوع يطرح نفس الفكرة تماما وإنما بتشابه وبعض التعقيد لذلك سأعيد بناء الفكرة و أطرحها في هذا الموضوع إن شاء الله من جديد بأسلوب بسيط ومطول قليلا من الناحية النظرية ليتم استيعابها بالشكل الكافي .
بداية وقبل كل شيء الطريقة مطروحة لأسباب تعليمية وطبعا لن أناقش فعالية الحماية أو قوة الكسر لان الأمر مفروغ منه ولا أحب الولوج فيه لكن إن شاء الله سيتم تغطية بعض الجوانب الوقائية لهذا الموضوع .
بسم الله نبدأ:
سنعتمد في برنامجنا الذي سنقوم بتصميمه طريقة الحماية عبر تسجيل وتفعيل البرنامج وهي أن برنامجنا عند تشغيله يظهر للمستخدم رقم ويطالبه بإدخال الرقم المقابل له وهذا الرقم طبعا سيكون فريد أو مميز أي يختلف من جهاز إلى أخر ولنا الحرية في حال اعتماد رقم قطعة في الجهاز أو دالة معينة وبعد ظهور الرقم للمستخدم يتم إرساله لك لتوليد الرقم المقابل له و إرساله للعميل ليعمل البرنامج إذا كان الرقم مطلوب بمجرد التشغيل أو ليقوم بتفعيل كامل الميزات إذا كنت عرضته بطريقة تعطيل بعض النوافذ أو الخصائص.
إذا الفكرة الأساسية أن برنامجنا يطلب رقم ليصبح نسخة كاملة .
بداية نستخرج رقم فريد من جهاز الحاسوب بحيث يكون هذا الرقم يختلف بين كل حاسب و أخر كرقم القرص الصلب أو المعالج أو ... ونقوم بعمليات تمويه له لكي لا يظهر مكشوفا كما هو فينتج رقم التسجيل للمستخدم.
الآن نقوم بعلميات تمويه أخرى لرقم التسجيل لنشتق رقم التفعيل فالبرنامج يحوي رقم القطعة أي إحدى عتاد الحاسوب ورقم تسجيل ورقم تفعيل فرقم القطعة لا علاقة لنا به لأننا بعد استخرجاه عدلناه ليظهر بطريقة أخرى والناتج سيكون رقم التسجيل الآن نعيد نفس الكرة ونعدل التسجيل لاستخراج رقم التفعيل وبذلك برنامجنا يجوي الأرقام الثلاثة و الظاهر منها هو رقم التسجيل فقط لدى العميل.
سيقوم العميل بإرسال رقم التسجيل لنا لنستخرج رقم التفعيل بنفس الطريقة التي استخدمناها في برنامجنا ونرسله له وعندها تتم المقارنة بين الرقمين وكسر البرنامج من قبل المهندس العكسي صورة عفوا أقصد المقارنة بين الرقمين وتفعيل البرنامج في حال التساوي.
الطريقة التي سنتبعها في درسنا هي رقم المعالج البر وسيسور.
زمن vb6 كنا نستخدم مكتبة ميكروسوفت WbemScripting لاستخراج رقم المعالج وفي الدوت نت سنستخدم System.Management.dll لاستخراج الرقم و المكتبة نستطيع من خلالها استخراج مواصفات عتاد الجهاز لكم كبير من هذا العتاد ما يهمنا في موضوعنا هو رقم المعالج كونه فريد ونريد الاعتماد عليه في تغيير الرقم لكل مستخدم لبرنامجنا.
افتح Microsoft Visual Studio 2008 و أنشأ مشروع جديد وسمه ما شئت
توجه الى نافذة Solution Explorer واضغط عل المشروع بالزر الأيمن واختر الخصائص Properties ادخل إلى التبويب References و أضف AddReferences المكتبة System.Management
بعد إضافة المكتبة توجه للنموذج أي الفورم و أضف صندوق نص تحت مسمى TextBoxId وزر أمر وسمه GetIdButton
الآن ضغطتين متتاليتين على زر الأمر لإدخال الكود المناسب لاستخراج رقم المعالج ووضعه في صندوق النص :
وبالأحرى هذا الكود كاملا أولا استيراد لوظائف المكتبة وبعدها كود الزر:
قم بتشغيل البرنامج و أضغط على الزر وستجد بإذن الله رقم المعالج يطبع في صندوق النص.
بالنسبة لشرح الكود السابق :
في البداية استيراد فضاء المكتبة وفي كود الزر قمنا بالبحث في مواصفات المعالج Processor عن قيمة Value الخاصية ProcessorId بواسطة حلقة For Each وعند إيجادها نستخرجها في صندوق النص.
ربما يسأل البعض لماذا لا نعرض الرقم مباشرة بدون الحلقة والبحث فيها فالجواب سيكون لان رقم الخاصية بين خصائص المعالج لن تكون الأولى وربما يختلف ترتيبها من جهاز لأخر لذلك نحن نبحث عنها ضمن المواصفات كلها وعند إيجادها يتم قنص القيمة و وضعها في صندوق النص.
الآن نستطيع استخدام رقم المعالج كما هو لعمليات التسجيل والتفعيل بحيث يكون الرقم مباشرة رقم تسجيل ورقم التفعيل يكون بإضافة بعض أرقام أو معادلة له لكن بهذه الطريقة إذا كان المستخدم لديه بعض البديهة فسينتبه إلى الرقم ويكتشف انه رقم المعالج وعندها يعرف التغير الذي حصل لرقم التفعيل بحذف رقم المعالج من السلسة لذلك سوف نقوم بتشفير الرقم و إظهاره بطريقة تجعل المستخدم لا يعرف ما هو الرقم الذي اعتمدنا عليه لذلك الآن نتجه لإنتاج رقم التسجيل والتفعيل .
أدرج صندوقي نص جديدين تحت مسميات TextBoxReg و TextBoxAct
الآن سنتجه لاستخراج رقم التسجيل والتفعيل عبر تحويل أو تشفير السلسة النصية التي تعبر عن رقم المعالج و التي تظهر في صندوق النص الأول TextBoxIdسأستخدم دالة التحويل إلى الاسكي (الناتج سيكون رقمي) وهذه طرقة سهلة لتلقين رقم التفعيل للعميل كونها محصورة بالشكل الرقمي من 0 إلى 9 فقط وبعيدة عن الرموز أو الأحرف
أضف الدالة التالية لبرنامجك :
و أضف في أخر كود الزر السطرين التالين :
أي يصبح الكود كاملاً :
شغل البرنامج وجرب
فالرقم الأول هو رقم المعالج سنخفيه عن العميل
الرقم الثاني هو رقم التسجيل مشتق بتحويل رقم المعالج إلى قيم الاسكي وهو سيظهر للعميل ويرسله لنا
الرقم الثالث رقم التفعيل مشتق من رقم التسجيل بنفس الطريقة الأولى وهو سيكون مخفي للعميل وهذا الرقم سيكون لدينا أيضا بالقيام بعملية تحويل التسجيل إلى اسكي أي قيم رقمية لإرساله إلى العميل وعندما يدخله تتم المقارنة بينه وبين رقم التفعيل المخفي عنه إذا تساوى الرقمين تتم العملية و إلا فلا
فالمربعات ذات اللون الأسود لن تظهر للعميل و إنما سيظهر فقط رقم التسجيل الذي سيرسله لنا أي المربع الأبيض الأول ومربع يطلب منه إدخال رقم التفعيل المرسل له من قبلنا وهو المربع الأخير
وبعد إدخال الرقم تتم المقارنة بين الرقمين في المربعين الأخيرين في حال التساوي تتم العملية وإلا فلا
بالنسبة لطريقة التشفير فكما تلاحظون حاولنا استخدام دالة التحويل لقيم الاسكي للمفاتيح ويمكنكم اعتماد أي طريقة لتشفير الرقم حيث هناك طرق لا حصر لها يمكننا إجراء غربلة للرقم أو الاقتصاص منه أو الزيادة عليه أو تعديله بإضافة واحد أو أكثر أو تشويش السلسة كلها أو أخذ مواضع محددة من السلسة أو..............الخ
الأن طريقة المقارنة بين رقم التفعيل المخفي و الرقم الذي أدخله العميل
طبعا وجود المقارنة بحسب معلومات المهندس العكسي يسهل تجاوز البرنامج وكسره
الطريقة المحلية هي الأتي :
أضف زر أمر وسمه ButtonOk وصندوق النص الرابع الذي سيدخل العميل فيه الرقم سمه TextBoxUser
و أضف كود الزر ButtonOk التالي:
الآن جرب لترى النتيجة :
حن اعتمدنا إظهار رسالة للعميل تفيد بأن الرقم صح أو خطا أما بالشكل العملي فالأمر سيكون بتفعيل فتح نوافذ واستخدام إمكانيات كالطباعة مثلا أو فتح البرنامج إذا كان التفعيل يظهر عند إقلاع البرنامج مباشرة لذلك نحن نستعيض بعبارة
بالإجراء المطلوب تنفيذه عند إدخال القيمة الصحيحة وإلا لن نظهر له شيء لان المهندس العكسي ينصحنا بذلك
ومن نصائحه لنا هي أن لا نستخدم MsgBox ونحن أيضاً سنلتزم بأوامره فكما ذكرت سابقا الرسالة لإيضاح نجاح العملية أما الأصل فهو استخدام الإجراء المناسب كفتح البرنامج أو تفعيل الميزات المحجوبة
ربما يسأل البعض ما دخل المهندس العكسي في الموضع أقول أنه ربما يفكر في الكسر لذلك نحن نريده أن يكسب الجائزة بعرق جبينه وليس بسهولة لذلك سنجعل عملياتنا مخفية عليه بعض الشيء لنكسبه بعض الخبرة ويكون الكسر تم بتعبه وعرق جبينه و إلا فنحن نتحرى الخير في الناس وفي عملائنا أنهم لا يحاولوا كسر برامجنا ويتركونا نتسبب.
نتابع مع بعض النصائح : لا تجعل مكان التفعيل هو نفسه مكان المقارنة وإعطاء الصلاحيات
ما المقصود بذلك ؟
المقصود أحبتي : أننا عند تفعيل برنامجنا بشكله الصحيح فأنه لا يتم تخزين الرقم الخاطئ و يتم تخزين الرقم لأنه صحيح فقط أما تفعيل الميزات فتحتاج لمقارنة أخرى في فورم أخر بعيدا عن مكان التفعيل بشرح بسيط لو أدخل المستخدم رقم التفعيل الصحيح ستظهر رسالة تفيد بذلك وبنفس الوقت نخزن الرقم الصحيح في مكان معين (البرنامج- الريجستري-ملف ) وعند إقلاع البرنامج يتم المقارنة مرة أخرى بنفس الطريقة لان البرنامج ربما يتم تجاوزه من خلال الهندسة العكسية ويتم تدمير قسم المقارنة لذلك المقارنة الأساسية تتم في مكان أخر وواجهة التفعيل هي فقط لتخزين الرقم الصحيح وعند إقلاع البرنامج تتم المقارنة بين رقم التفعيل والرقم المخزن من جديد صح يفعل الميزات وإلا فلا وهكذا نقوم بحشو برنامجنا بعشرة مقارنات ونضع عشرة مقارنات أخرى احتياط مثل بعد التشغيل الخامس للبرنامج في اليوم الأول من كل شهر وبعد شهرين بذلك نضمن أن قفزات الجمل الشرطية مهما حطم منها يبقى شيء مفعوله موجود
الهدف : بهذه الطريقة التمويهية نجعل أمر تجاوز المقارنات صعب بالتالي لن يكسر وطبعا هنا لن نسبية بطريقة القفز وتدمير المقارنات ماذا لو فكر بتدمير جميع المقارنات فالأمر صعب لان برنامجك ربما يحوي مقارنات عادية كالبحث وغيره بالتالي لن يعمل البرنامج بشكل صحيح فليس أمامه في طريقة القفز إلا العمل على البرنامج لمدة سنة كاملة وبعدين يعطينا نسخة مكسورة تعمل بطلاقة .
الطرقة الثانية للمهندس العكسي : هي استنتاج الرقم طبعا سيكون هذا الأمر مجدي له أكثر بخلاف العادة فبمجرد الوصول لأول مقارنة بين رقم التفعيل و الرقم المدخل سيكشفه إذا كان ذكي قليلا حسب معلوماتي المتواضعة عن هذه الأمور.
لكن هذه الطريقة تفتح أمامه مجالين :
الأول : أنه سيكشف الرقم للجهاز الذي يحاول الكسر عليه بالتالي يجب عليه الذهاب لكل جهاز والكسر عليه بهذه الحالة نضمن أن النسخ المكسورة ستكون أقل ما يمكن لأنه مش معقول يحمل العدة ويجوب على المستخدمين ياهو كسر برنامج فلان .
الثاني : هو الخطير لو استطاع كشف المعادلة بالتالي يستطيع عمل مولد أرقام مثل الذي لدينا وهذا سنحاول تجنبه بتعقيد المعادلة المخصصة لاستخراج رقم المعالج وتشفيره بحيث لا يستطيع فك عمليات التشفير على الرقم.
أتوقع كافي نظري حول تجنب الكسر و لا أقول لا أو انه صعب الكسر فالسوق أكبر دليل لكن كان سعيي لتوليد فكرة حول الأمر للجميع حتى يناقشوه في برامجهم ويستخدموه بالشكل الأمثل الذي يناسبهم.
منقووووووووووول للافادة ...........
وأفضل الصلاة و أتم التسليم على رسولنا الكريم
السلام عليكم ورحمة الله وبركاته
تحية طيبة وبعد:
سنتناول في هذا الموضوع طريقة تسجيل البرنامج وتفعيله و الذي تم تناوله سابقا في الفيجوال بيسك 6 ورغم الوقت بين الموضوعين لم أجد موضوع يطرح نفس الفكرة تماما وإنما بتشابه وبعض التعقيد لذلك سأعيد بناء الفكرة و أطرحها في هذا الموضوع إن شاء الله من جديد بأسلوب بسيط ومطول قليلا من الناحية النظرية ليتم استيعابها بالشكل الكافي .
بداية وقبل كل شيء الطريقة مطروحة لأسباب تعليمية وطبعا لن أناقش فعالية الحماية أو قوة الكسر لان الأمر مفروغ منه ولا أحب الولوج فيه لكن إن شاء الله سيتم تغطية بعض الجوانب الوقائية لهذا الموضوع .
بسم الله نبدأ:
سنعتمد في برنامجنا الذي سنقوم بتصميمه طريقة الحماية عبر تسجيل وتفعيل البرنامج وهي أن برنامجنا عند تشغيله يظهر للمستخدم رقم ويطالبه بإدخال الرقم المقابل له وهذا الرقم طبعا سيكون فريد أو مميز أي يختلف من جهاز إلى أخر ولنا الحرية في حال اعتماد رقم قطعة في الجهاز أو دالة معينة وبعد ظهور الرقم للمستخدم يتم إرساله لك لتوليد الرقم المقابل له و إرساله للعميل ليعمل البرنامج إذا كان الرقم مطلوب بمجرد التشغيل أو ليقوم بتفعيل كامل الميزات إذا كنت عرضته بطريقة تعطيل بعض النوافذ أو الخصائص.
إذا الفكرة الأساسية أن برنامجنا يطلب رقم ليصبح نسخة كاملة .
بداية نستخرج رقم فريد من جهاز الحاسوب بحيث يكون هذا الرقم يختلف بين كل حاسب و أخر كرقم القرص الصلب أو المعالج أو ... ونقوم بعمليات تمويه له لكي لا يظهر مكشوفا كما هو فينتج رقم التسجيل للمستخدم.
الآن نقوم بعلميات تمويه أخرى لرقم التسجيل لنشتق رقم التفعيل فالبرنامج يحوي رقم القطعة أي إحدى عتاد الحاسوب ورقم تسجيل ورقم تفعيل فرقم القطعة لا علاقة لنا به لأننا بعد استخرجاه عدلناه ليظهر بطريقة أخرى والناتج سيكون رقم التسجيل الآن نعيد نفس الكرة ونعدل التسجيل لاستخراج رقم التفعيل وبذلك برنامجنا يجوي الأرقام الثلاثة و الظاهر منها هو رقم التسجيل فقط لدى العميل.
سيقوم العميل بإرسال رقم التسجيل لنا لنستخرج رقم التفعيل بنفس الطريقة التي استخدمناها في برنامجنا ونرسله له وعندها تتم المقارنة بين الرقمين وكسر البرنامج من قبل المهندس العكسي صورة عفوا أقصد المقارنة بين الرقمين وتفعيل البرنامج في حال التساوي.
الطريقة التي سنتبعها في درسنا هي رقم المعالج البر وسيسور.
زمن vb6 كنا نستخدم مكتبة ميكروسوفت WbemScripting لاستخراج رقم المعالج وفي الدوت نت سنستخدم System.Management.dll لاستخراج الرقم و المكتبة نستطيع من خلالها استخراج مواصفات عتاد الجهاز لكم كبير من هذا العتاد ما يهمنا في موضوعنا هو رقم المعالج كونه فريد ونريد الاعتماد عليه في تغيير الرقم لكل مستخدم لبرنامجنا.
افتح Microsoft Visual Studio 2008 و أنشأ مشروع جديد وسمه ما شئت
توجه الى نافذة Solution Explorer واضغط عل المشروع بالزر الأيمن واختر الخصائص Properties ادخل إلى التبويب References و أضف AddReferences المكتبة System.Management
بعد إضافة المكتبة توجه للنموذج أي الفورم و أضف صندوق نص تحت مسمى TextBoxId وزر أمر وسمه GetIdButton
الآن ضغطتين متتاليتين على زر الأمر لإدخال الكود المناسب لاستخراج رقم المعالج ووضعه في صندوق النص :
وبالأحرى هذا الكود كاملا أولا استيراد لوظائف المكتبة وبعدها كود الزر:
- الكود:
Imports System.Management
Public Class Form1
Private Sub GetIdButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GetIdButton.Click
Dim Searcher As ManagementObjectSearcher
Searcher = New ManagementObjectSearcher("Select ProcessorId From Win32_Processor")
For Each Device As ManagementObject In Searcher.Get
For Each Prop As PropertyData In Device.Properties
TextBoxId.Text = (Prop.Value.ToString)
Next
Next
End Sub
End Class
قم بتشغيل البرنامج و أضغط على الزر وستجد بإذن الله رقم المعالج يطبع في صندوق النص.
بالنسبة لشرح الكود السابق :
في البداية استيراد فضاء المكتبة وفي كود الزر قمنا بالبحث في مواصفات المعالج Processor عن قيمة Value الخاصية ProcessorId بواسطة حلقة For Each وعند إيجادها نستخرجها في صندوق النص.
ربما يسأل البعض لماذا لا نعرض الرقم مباشرة بدون الحلقة والبحث فيها فالجواب سيكون لان رقم الخاصية بين خصائص المعالج لن تكون الأولى وربما يختلف ترتيبها من جهاز لأخر لذلك نحن نبحث عنها ضمن المواصفات كلها وعند إيجادها يتم قنص القيمة و وضعها في صندوق النص.
الآن نستطيع استخدام رقم المعالج كما هو لعمليات التسجيل والتفعيل بحيث يكون الرقم مباشرة رقم تسجيل ورقم التفعيل يكون بإضافة بعض أرقام أو معادلة له لكن بهذه الطريقة إذا كان المستخدم لديه بعض البديهة فسينتبه إلى الرقم ويكتشف انه رقم المعالج وعندها يعرف التغير الذي حصل لرقم التفعيل بحذف رقم المعالج من السلسة لذلك سوف نقوم بتشفير الرقم و إظهاره بطريقة تجعل المستخدم لا يعرف ما هو الرقم الذي اعتمدنا عليه لذلك الآن نتجه لإنتاج رقم التسجيل والتفعيل .
أدرج صندوقي نص جديدين تحت مسميات TextBoxReg و TextBoxAct
الآن سنتجه لاستخراج رقم التسجيل والتفعيل عبر تحويل أو تشفير السلسة النصية التي تعبر عن رقم المعالج و التي تظهر في صندوق النص الأول TextBoxIdسأستخدم دالة التحويل إلى الاسكي (الناتج سيكون رقمي) وهذه طرقة سهلة لتلقين رقم التفعيل للعميل كونها محصورة بالشكل الرقمي من 0 إلى 9 فقط وبعيدة عن الرموز أو الأحرف
أضف الدالة التالية لبرنامجك :
- الكود:
Function Str2Int(ByVal InStrng As Object) As String
Dim StrLn As Integer
Dim Cntr As Integer
Dim NewStr As String
Str2Int = ""
StrLn = Len(InStrng)
If StrLn = 0 Then Exit Function
NewStr = ""
For Cntr = 1 To StrLn
Select Case Mid(InStrng, Cntr, 1)
Case "0" To "z"
NewStr = NewStr & Asc(Mid(InStrng, Cntr, 1))
End Select
Next Cntr
Str2Int = NewStr
End Functio
و أضف في أخر كود الزر السطرين التالين :
- الكود:
TextBoxReg.Text = Str2Int(TextBoxId.Text)
TextBoxAct.Text = Str2Int(TextBoxReg.Text)
أي يصبح الكود كاملاً :
- الكود:
Imports System.Management
Public Class Form1
Private Sub GetIdButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GetIdButton.Click
Dim Searcher As ManagementObjectSearcher
Searcher = New ManagementObjectSearcher("Select ProcessorId From Win32_Processor")
For Each Device As ManagementObject In Searcher.Get
For Each Prop As PropertyData In Device.Properties
TextBoxId.Text = (Prop.Value.ToString)
Next
Next
TextBoxReg.Text = Str2Int(TextBoxId.Text)
TextBoxAct.Text = Str2Int(TextBoxReg.Text)
End Sub
Function Str2Int(ByVal InStrng As Object) As String
Dim StrLn As Integer
Dim Cntr As Integer
Dim NewStr As String
Str2Int = ""
StrLn = Len(InStrng)
If StrLn = 0 Then Exit Function
NewStr = ""
For Cntr = 1 To StrLn
Select Case Mid(InStrng, Cntr, 1)
Case "0" To "z"
NewStr = NewStr & Asc(Mid(InStrng, Cntr, 1))
End Select
Next Cntr
Str2Int = NewStr
End Function
End Class
شغل البرنامج وجرب
فالرقم الأول هو رقم المعالج سنخفيه عن العميل
الرقم الثاني هو رقم التسجيل مشتق بتحويل رقم المعالج إلى قيم الاسكي وهو سيظهر للعميل ويرسله لنا
الرقم الثالث رقم التفعيل مشتق من رقم التسجيل بنفس الطريقة الأولى وهو سيكون مخفي للعميل وهذا الرقم سيكون لدينا أيضا بالقيام بعملية تحويل التسجيل إلى اسكي أي قيم رقمية لإرساله إلى العميل وعندما يدخله تتم المقارنة بينه وبين رقم التفعيل المخفي عنه إذا تساوى الرقمين تتم العملية و إلا فلا
فالمربعات ذات اللون الأسود لن تظهر للعميل و إنما سيظهر فقط رقم التسجيل الذي سيرسله لنا أي المربع الأبيض الأول ومربع يطلب منه إدخال رقم التفعيل المرسل له من قبلنا وهو المربع الأخير
وبعد إدخال الرقم تتم المقارنة بين الرقمين في المربعين الأخيرين في حال التساوي تتم العملية وإلا فلا
بالنسبة لطريقة التشفير فكما تلاحظون حاولنا استخدام دالة التحويل لقيم الاسكي للمفاتيح ويمكنكم اعتماد أي طريقة لتشفير الرقم حيث هناك طرق لا حصر لها يمكننا إجراء غربلة للرقم أو الاقتصاص منه أو الزيادة عليه أو تعديله بإضافة واحد أو أكثر أو تشويش السلسة كلها أو أخذ مواضع محددة من السلسة أو..............الخ
الأن طريقة المقارنة بين رقم التفعيل المخفي و الرقم الذي أدخله العميل
طبعا وجود المقارنة بحسب معلومات المهندس العكسي يسهل تجاوز البرنامج وكسره
الطريقة المحلية هي الأتي :
أضف زر أمر وسمه ButtonOk وصندوق النص الرابع الذي سيدخل العميل فيه الرقم سمه TextBoxUser
و أضف كود الزر ButtonOk التالي:
- الكود:
Private Sub ButtonOk_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonOk.Click
If TextBoxUser.Text = TextBoxAct.Text Then
MsgBox("تم تفعيل البرنامج شكراً لك")
Else
MsgBox("الرقم المدخل خاطئ")
End If
End Sub
الآن جرب لترى النتيجة :
حن اعتمدنا إظهار رسالة للعميل تفيد بأن الرقم صح أو خطا أما بالشكل العملي فالأمر سيكون بتفعيل فتح نوافذ واستخدام إمكانيات كالطباعة مثلا أو فتح البرنامج إذا كان التفعيل يظهر عند إقلاع البرنامج مباشرة لذلك نحن نستعيض بعبارة
- الكود:
MsgBox("تم تفعيل البرنامج شكراً لك")
بالإجراء المطلوب تنفيذه عند إدخال القيمة الصحيحة وإلا لن نظهر له شيء لان المهندس العكسي ينصحنا بذلك
- الكود:
If TextBoxUser.Text = TextBoxAct.Text Then
MsgBox("تم تفعيل البرنامج شكراً لك")
End If
ومن نصائحه لنا هي أن لا نستخدم MsgBox ونحن أيضاً سنلتزم بأوامره فكما ذكرت سابقا الرسالة لإيضاح نجاح العملية أما الأصل فهو استخدام الإجراء المناسب كفتح البرنامج أو تفعيل الميزات المحجوبة
ربما يسأل البعض ما دخل المهندس العكسي في الموضع أقول أنه ربما يفكر في الكسر لذلك نحن نريده أن يكسب الجائزة بعرق جبينه وليس بسهولة لذلك سنجعل عملياتنا مخفية عليه بعض الشيء لنكسبه بعض الخبرة ويكون الكسر تم بتعبه وعرق جبينه و إلا فنحن نتحرى الخير في الناس وفي عملائنا أنهم لا يحاولوا كسر برامجنا ويتركونا نتسبب.
نتابع مع بعض النصائح : لا تجعل مكان التفعيل هو نفسه مكان المقارنة وإعطاء الصلاحيات
ما المقصود بذلك ؟
المقصود أحبتي : أننا عند تفعيل برنامجنا بشكله الصحيح فأنه لا يتم تخزين الرقم الخاطئ و يتم تخزين الرقم لأنه صحيح فقط أما تفعيل الميزات فتحتاج لمقارنة أخرى في فورم أخر بعيدا عن مكان التفعيل بشرح بسيط لو أدخل المستخدم رقم التفعيل الصحيح ستظهر رسالة تفيد بذلك وبنفس الوقت نخزن الرقم الصحيح في مكان معين (البرنامج- الريجستري-ملف ) وعند إقلاع البرنامج يتم المقارنة مرة أخرى بنفس الطريقة لان البرنامج ربما يتم تجاوزه من خلال الهندسة العكسية ويتم تدمير قسم المقارنة لذلك المقارنة الأساسية تتم في مكان أخر وواجهة التفعيل هي فقط لتخزين الرقم الصحيح وعند إقلاع البرنامج تتم المقارنة بين رقم التفعيل والرقم المخزن من جديد صح يفعل الميزات وإلا فلا وهكذا نقوم بحشو برنامجنا بعشرة مقارنات ونضع عشرة مقارنات أخرى احتياط مثل بعد التشغيل الخامس للبرنامج في اليوم الأول من كل شهر وبعد شهرين بذلك نضمن أن قفزات الجمل الشرطية مهما حطم منها يبقى شيء مفعوله موجود
الهدف : بهذه الطريقة التمويهية نجعل أمر تجاوز المقارنات صعب بالتالي لن يكسر وطبعا هنا لن نسبية بطريقة القفز وتدمير المقارنات ماذا لو فكر بتدمير جميع المقارنات فالأمر صعب لان برنامجك ربما يحوي مقارنات عادية كالبحث وغيره بالتالي لن يعمل البرنامج بشكل صحيح فليس أمامه في طريقة القفز إلا العمل على البرنامج لمدة سنة كاملة وبعدين يعطينا نسخة مكسورة تعمل بطلاقة .
الطرقة الثانية للمهندس العكسي : هي استنتاج الرقم طبعا سيكون هذا الأمر مجدي له أكثر بخلاف العادة فبمجرد الوصول لأول مقارنة بين رقم التفعيل و الرقم المدخل سيكشفه إذا كان ذكي قليلا حسب معلوماتي المتواضعة عن هذه الأمور.
لكن هذه الطريقة تفتح أمامه مجالين :
الأول : أنه سيكشف الرقم للجهاز الذي يحاول الكسر عليه بالتالي يجب عليه الذهاب لكل جهاز والكسر عليه بهذه الحالة نضمن أن النسخ المكسورة ستكون أقل ما يمكن لأنه مش معقول يحمل العدة ويجوب على المستخدمين ياهو كسر برنامج فلان .
الثاني : هو الخطير لو استطاع كشف المعادلة بالتالي يستطيع عمل مولد أرقام مثل الذي لدينا وهذا سنحاول تجنبه بتعقيد المعادلة المخصصة لاستخراج رقم المعالج وتشفيره بحيث لا يستطيع فك عمليات التشفير على الرقم.
أتوقع كافي نظري حول تجنب الكسر و لا أقول لا أو انه صعب الكسر فالسوق أكبر دليل لكن كان سعيي لتوليد فكرة حول الأمر للجميع حتى يناقشوه في برامجهم ويستخدموه بالشكل الأمثل الذي يناسبهم.
منقووووووووووول للافادة ...........
- tarik
- عدد المساهمات : 134
تاريخ التسجيل : 08/10/2012
رد: الوافي في حماية البرنامج عبر التسجيل والتفعيل
السبت سبتمبر 28, 2013 8:48 am
نعود لكودنا في الزر طبعا الدالة يمكنك أن ترميها في موديول وتخلص من رؤيتها أمامك لأنها جاهزة ولن نعدل عليها وإنما سنستدعيها فقط لذلك أول شيء قم بقص الدالة و الصقها في الموديل .
الآن سنجعل رقم المعالج يظهر بمجرد فتح الفورم طبعا فقط ننقل الكود من حدث ضغط الزر GetIdButton_Clickإلىتحميل الفورمForm1_Load ولسنا بحاجة لأكثر من صندوقين نص واحد تسجيل والأخر تفعيل والقيم الوسطى نخزنها ضمن متغيرات idpidp1idp2 فيصبح الكود كالأتي :
لاحظ أننا الآن بحاجة لصندوقي نص هما TextBoxReg يظهر فيه رقم التسجيل و TextBoxUser لإدخال رقم التفعيل من قبل العميل أما البقية والزر لا تلزم لان القيم صارت ضمن متغيرات ولا ننسى الدالة ألصقناها بالموديول من قبل فشكل نافذة التفعيل الآن هو الأتي :
صورة
لو انتبهت للكود فجملة If تناقش الحالة الصحيحة وإذا خطأ لن نقوم بأي عمل لأننا بحالة توليد مسج بوكس أنه خطأ نسهل العملية بحسب النصائح السابقة وكما ذكرت أنفا المسج بوكس يجب الاستغناء عنه لأنه أولا نقطة ضعف وثانيا لن يفيدنا تخيل انه المستخدم فعل البرنامج خلاص أغلق البرنامج وهو يشغله ويراه مفعل أو أغلق فورم التفعيل و خزن الرقم أو حتى خزن الرقم وبس. وما في ضرورة نلقمه إياها بالملعقة بيب مسج بوكس بيب تم التفعيل يا عميل خلص أغلق فورمه التفعيل ورح من هنا بيب شكرا لك هيه صار عندك نسخة كاملة هذا الحشو مش مهم .
طيب الآن ربما يسأل السائل ربما يستنتج العميل أو حبيبنا العكسي أن الرقم المستخرج هو رقم المعالج وبنظرة بسيطة بالمقارنة بين رقمي التسجيل و رقم المعالج سينتبه أن الثاني مشتق من الأول بالتحويل الرقمي كيف لتشابه أرقام في المعالج مع المقابل الرقمي في حال التكرار مثلا لدي يظهر
رقم المعالج:
0383F9FF000006B1
رقم التسجيل:
48515651705770704848484848546649
فربما يفهم العملية لذلك سنحاول جعله لا يفهم العملية بالقيام بتشويش السلسة النصية ومن ثم تحويلها إلى رقم وبذلك حتى الرقمين المتشابهين سيكون بالتشويش لديها قيم مختلفة :
لذلك أول شيء اذهب للموديول و الصق الدالة التالية أسفل الدالة السابقة صاحبة الاسكي ليصبح الموديول كاملا كالأتي:
نشوش بالدالة بهذه الطريقة :
الآن رقم المعالج هو
0383F9FF000006B1
بالتشويش بدالة Obfuscate يصبح
16=:ODSUACEGIQ_P
الآن نحوله إلى الرقمي
49546158796883856567697173819580
لاحظ من جديد هذا الرقم يختلف عن القيمة السابقة لأننا قمنا بتشويش رقم المعالج قبل تحويله إلى قيم الاسكي طبعا أنت تستطيع التفعيل بالقيم الحرفية لكن الرقمية تبقى أسهل للتلقين كما ذكرنا أول الموضوع
حاول المقارنة بين اللونين الأحمرين في رقم المعالج ورقم التسجيل لن تستنتج شيء لان التشويش قضى على هذا الأمر.
بينما كان الأمر جلي قبل التشويش.
لاحظ الفرق السابق فلا علاقة واضحة أبدا خمسة أصفار وكل شفرة لها مقابل مختلف هكذا يصبح الأمر مشفر أكثر
عد للنموذج وعدل الكود كالأتي :
اتضح الأمر أكثر الآن فنحن نقوم باستخراج رقم المعالج وتشويشه وتحويله إلى أسكي فينتج رقم التسجيل ونطبعه للمستخدم في صندوق النص ونطالبه بالمقابل الذي هو عبارة عن رقم التسجيل مشوش ومحول إلى أسكي من جديد
وبعدها المقارنة في حدث الزر لن أكرر المسج بوكس بس للتوضيح حول المقارنة وليس للاستخدام.
الآن ربما تتململ من أن رقم المعالج 16 رقم ينتج عنها رقم تسجيل 32 رقم ورقم التفعيل سيكون بالتالي 64 رقم فهذا كثير مع أنني أفضل طول الرقم لكننا سنكتفي بطول رقم التسجيل 32 رقم ونقوم بتصغير رقم التفعيل إلى 14 رقم مثلا وذلك بعملية اقتصاص من رقم التفعيل كالآتي وذلك بإضافة السطر التالي في أخر الفورم لوود (اقتصاص سلسة نصية)
طبعا لك الحرية في اختيار طول الرقم بتغير الرقم 14 إلى أي رقم آخر لكن طول الرقم يصعب عملية الاشتقاق أصلا.
كذلك يمكنك اختيار نقطة البدء من أي محرف 0
الآن يسأل السائل إذا قام العميل بالتفعيل فهل سأقول له مبروك فقط أما ماذا يحدث
الآن سنجعل رقم المعالج يظهر بمجرد فتح الفورم طبعا فقط ننقل الكود من حدث ضغط الزر GetIdButton_Clickإلىتحميل الفورمForm1_Load ولسنا بحاجة لأكثر من صندوقين نص واحد تسجيل والأخر تفعيل والقيم الوسطى نخزنها ضمن متغيرات idpidp1idp2 فيصبح الكود كالأتي :
- الكود:
Imports System.Management
Public Class Form1
Dim idp As String ' رقم المعالج
Dim idp1 As String ' رقم التسجيل
Dim idp2 As String ' رقم التفعيل
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim Searcher As ManagementObjectSearcher
Searcher = New ManagementObjectSearcher("Select ProcessorId From Win32_Processor")
For Each Device As ManagementObject In Searcher.Get
For Each Prop As PropertyData In Device.Properties
idp = (Prop.Value.ToString)
Next
Next
idp1 = Str2Int(idp)
idp2 = Str2Int(idp1)
TextBoxReg.Text = idp1
End Sub
Private Sub ButtonOk_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonOk.Click
If TextBoxUser.Text = idp2 Then
MsgBox("تم تفعيل البرنامج شكراً لك")
End If
End Sub
End Class
لاحظ أننا الآن بحاجة لصندوقي نص هما TextBoxReg يظهر فيه رقم التسجيل و TextBoxUser لإدخال رقم التفعيل من قبل العميل أما البقية والزر لا تلزم لان القيم صارت ضمن متغيرات ولا ننسى الدالة ألصقناها بالموديول من قبل فشكل نافذة التفعيل الآن هو الأتي :
صورة
لو انتبهت للكود فجملة If تناقش الحالة الصحيحة وإذا خطأ لن نقوم بأي عمل لأننا بحالة توليد مسج بوكس أنه خطأ نسهل العملية بحسب النصائح السابقة وكما ذكرت أنفا المسج بوكس يجب الاستغناء عنه لأنه أولا نقطة ضعف وثانيا لن يفيدنا تخيل انه المستخدم فعل البرنامج خلاص أغلق البرنامج وهو يشغله ويراه مفعل أو أغلق فورم التفعيل و خزن الرقم أو حتى خزن الرقم وبس. وما في ضرورة نلقمه إياها بالملعقة بيب مسج بوكس بيب تم التفعيل يا عميل خلص أغلق فورمه التفعيل ورح من هنا بيب شكرا لك هيه صار عندك نسخة كاملة هذا الحشو مش مهم .
طيب الآن ربما يسأل السائل ربما يستنتج العميل أو حبيبنا العكسي أن الرقم المستخرج هو رقم المعالج وبنظرة بسيطة بالمقارنة بين رقمي التسجيل و رقم المعالج سينتبه أن الثاني مشتق من الأول بالتحويل الرقمي كيف لتشابه أرقام في المعالج مع المقابل الرقمي في حال التكرار مثلا لدي يظهر
رقم المعالج:
0383F9FF000006B1
رقم التسجيل:
48515651705770704848484848546649
فربما يفهم العملية لذلك سنحاول جعله لا يفهم العملية بالقيام بتشويش السلسة النصية ومن ثم تحويلها إلى رقم وبذلك حتى الرقمين المتشابهين سيكون بالتشويش لديها قيم مختلفة :
لذلك أول شيء اذهب للموديول و الصق الدالة التالية أسفل الدالة السابقة صاحبة الاسكي ليصبح الموديول كاملا كالأتي:
- الكود:
Module Module1
' التحويل الى الاسكي
Function Str2Int(ByVal InStrng As Object) As String
Dim StrLn As Integer
Dim Cntr As Integer
Dim NewStr As String
Str2Int = ""
StrLn = Len(InStrng)
If StrLn = 0 Then Exit Function
NewStr = ""
For Cntr = 1 To StrLn
Select Case Mid(InStrng, Cntr, 1)
Case "0" To "z"
NewStr = NewStr & Asc(Mid(InStrng, Cntr, 1))
End Select
Next Cntr
Str2Int = NewStr
End Function
'دالة التشويش
Public Function Obfuscate(ByVal origText As String) As String
Dim textBytes As Byte() = System.Text.Encoding.Unicode.GetBytes(origText)
For counter As Integer = 0 To textBytes.Length - 1
If (textBytes(counter) > 31) And (textBytes(counter) < 127) Then
textBytes(counter) += CByte(counter Mod 31 + 1)
If (textBytes(counter) > 126) Then textBytes(counter) -= CByte(95)
End If
Next counter
Return System.Text.Encoding.Unicode.GetChars(textBytes)
End Function
End Module
نشوش بالدالة بهذه الطريقة :
- الكود:
Idp1 = Obfuscate(Idp)
الآن رقم المعالج هو
0383F9FF000006B1
بالتشويش بدالة Obfuscate يصبح
16=:ODSUACEGIQ_P
الآن نحوله إلى الرقمي
49546158796883856567697173819580
لاحظ من جديد هذا الرقم يختلف عن القيمة السابقة لأننا قمنا بتشويش رقم المعالج قبل تحويله إلى قيم الاسكي طبعا أنت تستطيع التفعيل بالقيم الحرفية لكن الرقمية تبقى أسهل للتلقين كما ذكرنا أول الموضوع
حاول المقارنة بين اللونين الأحمرين في رقم المعالج ورقم التسجيل لن تستنتج شيء لان التشويش قضى على هذا الأمر.
بينما كان الأمر جلي قبل التشويش.
لاحظ الفرق السابق فلا علاقة واضحة أبدا خمسة أصفار وكل شفرة لها مقابل مختلف هكذا يصبح الأمر مشفر أكثر
عد للنموذج وعدل الكود كالأتي :
- الكود:
Imports System.Management
Public Class Form1
Dim Idp As String
Dim Idp1 As String
Dim idp2 As String
Private Sub FrmActiv_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'الرقم التسلسلي للمعالج
Dim Searcher As ManagementObjectSearcher
Searcher = New ManagementObjectSearcher("Select ProcessorId From Win32_Processor")
For Each Device As ManagementObject In Searcher.Get
For Each Prop As PropertyData In Device.Properties
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'استخراج الرقم
Idp = (Prop.Value.ToString)
Next
Next
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'تشويش الرقم
Idp = Obfuscate(Idp)
'تحويله الى اسكي
Idp = Str2Int(Idp)
'رقم التسجيل
TextBoxReg.Text = Idp
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'تشويش الرقم
Idp1 = Obfuscate(Idp)
'تحويله الى اسكي
'رقم التفعيل
Idp1 = Str2Int(Idp1)
End Sub
Private Sub ButtonOk_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonOk.Click
'متغير جمالي
idp2 = Idp1
If TextBoxUser.Text = idp2 Then
MsgBox("تم تفعيل البرنامج شكراً لك")
End If
End Sub
End Class
اتضح الأمر أكثر الآن فنحن نقوم باستخراج رقم المعالج وتشويشه وتحويله إلى أسكي فينتج رقم التسجيل ونطبعه للمستخدم في صندوق النص ونطالبه بالمقابل الذي هو عبارة عن رقم التسجيل مشوش ومحول إلى أسكي من جديد
وبعدها المقارنة في حدث الزر لن أكرر المسج بوكس بس للتوضيح حول المقارنة وليس للاستخدام.
الآن ربما تتململ من أن رقم المعالج 16 رقم ينتج عنها رقم تسجيل 32 رقم ورقم التفعيل سيكون بالتالي 64 رقم فهذا كثير مع أنني أفضل طول الرقم لكننا سنكتفي بطول رقم التسجيل 32 رقم ونقوم بتصغير رقم التفعيل إلى 14 رقم مثلا وذلك بعملية اقتصاص من رقم التفعيل كالآتي وذلك بإضافة السطر التالي في أخر الفورم لوود (اقتصاص سلسة نصية)
- الكود:
'اقتصاص 14 رقم
Idp1 = (Idp1.Substring(0, 14))
طبعا لك الحرية في اختيار طول الرقم بتغير الرقم 14 إلى أي رقم آخر لكن طول الرقم يصعب عملية الاشتقاق أصلا.
كذلك يمكنك اختيار نقطة البدء من أي محرف 0
الآن يسأل السائل إذا قام العميل بالتفعيل فهل سأقول له مبروك فقط أما ماذا يحدث
- tarik
- عدد المساهمات : 134
تاريخ التسجيل : 08/10/2012
رد: الوافي في حماية البرنامج عبر التسجيل والتفعيل
السبت سبتمبر 28, 2013 8:53 am
نبدأ من جديد :
عند إدخال الرقم الصحيح سنقوم بتخزينه وأكرر لك الحرية في اختيار موضع التخزين ولا يهم ظهور الرقم لأنه صحيح ونحن من زودناه به لذلك سألجأ إلى Settings
نتجه إلى Solution Explorer ونضغط على المشروع بالزر الأيمن ونختار Properties ونذهب لتبويب Settingsونضيف إليه متغير جديد سأسميه nameuser وليس numact شوية تمويه يبدو التجنيد مؤثر بي كثير.
اسم المتغير
Name = nameuser
نوع المتغير
StringType =
قيمة المتغير
Value =
صورة
الآن سنتجه لكود الزر ونغيره إلى :
لاحظ الكود السابق في حال التساوي فإنه يسند الرقم إلى الإعدادات ثم يحفظها فقضية التفعيل كلها هنا هي هل الرقم متساوي إذا كان الجواب نعم فعندها لا يفعل الميزات بل يحفظ الرقم فقط وعملية التفعيل في أمكنة أخرى بعيدا عن مركز اختبار الرقم الظاهر للعميل و بذلك لن يظهر للعكسي الأمر واضح كالعادة .
هل تم الأمر لا خطوة أخيرة فقط :
الآن أصبح كود مشروعنا الكامل هو الأتي :
الموديول :
الفورم:
انتهى أمر التفعيل إذا خطأ لن يقوم بأي إجراء منعا لإجراء التجارب من قبل المعتدين و إذا صح يحفظ الرقم فقط
وتتم المقارنة لاحقاً.
الآن طريقة المقارنة بعيدا عن فورم التفعيل كالأتي :
اذهب لأي فورم و ألصق كود الرقم
ففي أي فورم أو فورما محددة على مزاجك سيتم استنتاج الرقم كما تعلمنا سابقا في فورم التفعيل وحفظ الرقم في متغير
كما تلاحظ من الكود أخر قيمة كانت رقم التفعيل المكون من 14 رقم والمتغير هو Idp1
المقارنة كالتالي
والآن ضع المقارنة أينما تريد في زر الطباعة في زر البحث في تحميل فورم المبيعات في .... الخ ....
واختر الإجراء المناسب سواء بإغلاق البرنامج أو بتعطيل بعض الأزرار أو بإخفاء نوافذ أو .... الخ.....
وكل ما كثرت المقارنات صار البرنامج أبطأ عفواً أقصد صار الأمر مبهم أكثر (ملح وفلفل)
عداك عند وضع مقارنات زمنية. (شهرية ... ساعية ... بعد 10 استعمالات ... الخ .....) بمحض إرادتك .
مداخلة :
حاول أيضا تفحص قيمة المتغير الأخير الذي سنخزن فيه رقم التفعيل بحيث إذا كانت فارغة الخروج من الإجراء وعدم التفعيل أو استخدم Try.
لأنه ربما بعد عشرين سنة يخرج نظام ويندوز لا يدعم المكتبة فيكون استخراج رقم المعالج خالي وتتم المقارنة مع قيمة خالية فتتساوى القيمة ويتم التفعيل أو يولد خطأ .
إلى هنا ننتهي من قسم التسجيل ونذهب الآن لقسم توليد ارقام التفعيل:
إن برنامج التفعيل يجب أن يتواجد لديك فقط أو للأشخاص الاعتباريين الذي يحق لهم توليد أرقام التفعيل بحسب رغبتك.
لان برنامج التفعيل هو الكيجن لبرنامجك إن صح التعبير
طريقة توليد أرقام التفعيل :
هنا الأمر بسيط جدا لأنه جزء صغير مما سبق
وهو جزء من مشروعنا فهو رقم التسجيل مشوش ومحول لاسكي ومقتص 14 رقم
ننشأ مشروع جديد ونضيف فيه موديول نضع فيه الدوال السابقة كما في التسجيل كالموديول السابق تماماً
وننشأ فورم جديد عليه زر أمر وصندوقي نص ButtonOkTextBoxRegTextBoxUser
كود زر التفعيل :
طبعا لا حاجة للشرح فالأمر واضح مما سبق ومن الكود (فقط بعض التعديلات على رقم التسجيل)
الآن ما عليك إلا الضغط على زر رقم التفعيل بعد إدخال رقم التسجيل وسيظهر في الصندوق الثاني رقم التفعيل لترسله للعميل ويتمكن من تفعيل البرنامج بالشكل الصحيح .
وبذلك نكون قد ناقشنا الموضوع بطريقة مطولة بعض الشيء لذلك معذرة مني إليكم .
وفي الختام:
· الغرض من برنامجنا هو غرض تعليمي.
· إذا كان برنامجك يستحق الحماية فقم بحمايته.
· لا تعرض برنامجك مباشرة و إنما قم بنشر نسخة محدودة المهام أصلا أي البرمجة غير كاملة بمثال عدم وجود البحث أبدا أو الطباعة أو .... وعند الطلب أرسل للعميل فقط نسخة كاملة تحتاج للتفعيل بإحدى الطرق ويفضل أن تتوسع في البحث عن حمايات أقوى مما قدمناه.
· جاهز لأي استفسار حول الموضع في حدود استطاعتي.
· ولكم مني جزيل الشكر لإصغائكم.
عند إدخال الرقم الصحيح سنقوم بتخزينه وأكرر لك الحرية في اختيار موضع التخزين ولا يهم ظهور الرقم لأنه صحيح ونحن من زودناه به لذلك سألجأ إلى Settings
نتجه إلى Solution Explorer ونضغط على المشروع بالزر الأيمن ونختار Properties ونذهب لتبويب Settingsونضيف إليه متغير جديد سأسميه nameuser وليس numact شوية تمويه يبدو التجنيد مؤثر بي كثير.
اسم المتغير
Name = nameuser
نوع المتغير
StringType =
قيمة المتغير
Value =
صورة
الآن سنتجه لكود الزر ونغيره إلى :
- الكود:
Private Sub ButtonOk_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonOk.Click
'متغير جمالي
idp2 = Idp1
If TextBoxUser.Text = idp2 Then
My.Settings.nameuser = TextBoxUser.Text
My.Settings.Save()
End
End If
End Sub
لاحظ الكود السابق في حال التساوي فإنه يسند الرقم إلى الإعدادات ثم يحفظها فقضية التفعيل كلها هنا هي هل الرقم متساوي إذا كان الجواب نعم فعندها لا يفعل الميزات بل يحفظ الرقم فقط وعملية التفعيل في أمكنة أخرى بعيدا عن مركز اختبار الرقم الظاهر للعميل و بذلك لن يظهر للعكسي الأمر واضح كالعادة .
هل تم الأمر لا خطوة أخيرة فقط :
الآن أصبح كود مشروعنا الكامل هو الأتي :
الموديول :
- الكود:
Module Module1
' التحويل الى الاسكي
Function Str2Int(ByVal InStrng As Object) As String
Dim StrLn As Integer
Dim Cntr As Integer
Dim NewStr As String
Str2Int = ""
StrLn = Len(InStrng)
If StrLn = 0 Then Exit Function
NewStr = ""
For Cntr = 1 To StrLn
Select Case Mid(InStrng, Cntr, 1)
Case "0" To "z"
NewStr = NewStr & Asc(Mid(InStrng, Cntr, 1))
End Select
Next Cntr
Str2Int = NewStr
End Function
'دالة التشويش
Public Function Obfuscate(ByVal origText As String) As String
Dim textBytes As Byte() = System.Text.Encoding.Unicode.GetBytes(origText)
For counter As Integer = 0 To textBytes.Length - 1
If (textBytes(counter) > 31) And (textBytes(counter) < 127) Then
textBytes(counter) += CByte(counter Mod 31 + 1)
If (textBytes(counter) > 126) Then textBytes(counter) -= CByte(95)
End If
Next counter
Return System.Text.Encoding.Unicode.GetChars(textBytes)
End Function
End Module
الفورم:
- الكود:
Imports System.Management
Public Class Form1
Dim Idp As String
Dim Idp1 As String
Dim idp2 As String
Private Sub FrmActiv_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'الرقم التسلسلي للمعالج
Dim Searcher As ManagementObjectSearcher
Searcher = New ManagementObjectSearcher("Select ProcessorId From Win32_Processor")
For Each Device As ManagementObject In Searcher.Get
For Each Prop As PropertyData In Device.Properties
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'استخراج الرقم
Idp = (Prop.Value.ToString)
Next
Next
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'تشويش الرقم
Idp = Obfuscate(Idp)
'تحويله الى اسكي
Idp = Str2Int(Idp)
'رقم التسجيل
TextBoxReg.Text = Idp
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'تشويش الرقم
Idp1 = Obfuscate(Idp)
'تحويله الى اسكي
'رقم التفعيل
Idp1 = Str2Int(Idp1)
'اقتصاص 14 رقم
Idp1 = (Idp1.Substring(0, 14))
End Sub
Private Sub ButtonOk_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonOk.Click
'متغير جمالي
idp2 = Idp1
If TextBoxUser.Text = idp2 Then
'حفظ الاعدادت
My.Settings.nameuser = TextBoxUser.Text
My.Settings.Save()
End
End If
End Sub
End Class
انتهى أمر التفعيل إذا خطأ لن يقوم بأي إجراء منعا لإجراء التجارب من قبل المعتدين و إذا صح يحفظ الرقم فقط
وتتم المقارنة لاحقاً.
الآن طريقة المقارنة بعيدا عن فورم التفعيل كالأتي :
اذهب لأي فورم و ألصق كود الرقم
- الكود:
الآن طريقة المقارنة بعيدا عن فورم التفعيل كالأتي :
اذهب لأي فورم و ألصق كود الرقم
ففي أي فورم أو فورما محددة على مزاجك سيتم استنتاج الرقم كما تعلمنا سابقا في فورم التفعيل وحفظ الرقم في متغير
كما تلاحظ من الكود أخر قيمة كانت رقم التفعيل المكون من 14 رقم والمتغير هو Idp1
المقارنة كالتالي
- الكود:
If My.Settings.nameuser = Idp1 Then
'do thing
Else
'end
End If
والآن ضع المقارنة أينما تريد في زر الطباعة في زر البحث في تحميل فورم المبيعات في .... الخ ....
واختر الإجراء المناسب سواء بإغلاق البرنامج أو بتعطيل بعض الأزرار أو بإخفاء نوافذ أو .... الخ.....
وكل ما كثرت المقارنات صار البرنامج أبطأ عفواً أقصد صار الأمر مبهم أكثر (ملح وفلفل)
عداك عند وضع مقارنات زمنية. (شهرية ... ساعية ... بعد 10 استعمالات ... الخ .....) بمحض إرادتك .
مداخلة :
حاول أيضا تفحص قيمة المتغير الأخير الذي سنخزن فيه رقم التفعيل بحيث إذا كانت فارغة الخروج من الإجراء وعدم التفعيل أو استخدم Try.
لأنه ربما بعد عشرين سنة يخرج نظام ويندوز لا يدعم المكتبة فيكون استخراج رقم المعالج خالي وتتم المقارنة مع قيمة خالية فتتساوى القيمة ويتم التفعيل أو يولد خطأ .
إلى هنا ننتهي من قسم التسجيل ونذهب الآن لقسم توليد ارقام التفعيل:
إن برنامج التفعيل يجب أن يتواجد لديك فقط أو للأشخاص الاعتباريين الذي يحق لهم توليد أرقام التفعيل بحسب رغبتك.
لان برنامج التفعيل هو الكيجن لبرنامجك إن صح التعبير
طريقة توليد أرقام التفعيل :
هنا الأمر بسيط جدا لأنه جزء صغير مما سبق
وهو جزء من مشروعنا فهو رقم التسجيل مشوش ومحول لاسكي ومقتص 14 رقم
ننشأ مشروع جديد ونضيف فيه موديول نضع فيه الدوال السابقة كما في التسجيل كالموديول السابق تماماً
وننشأ فورم جديد عليه زر أمر وصندوقي نص ButtonOkTextBoxRegTextBoxUser
كود زر التفعيل :
- الكود:
Public Class Form1
Dim XXX As String
Private Sub ButtonOk_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonOk.Click
'رقم التسجيل
XXX = TextBoxReg.Text
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'تشويش الرقم
XXX = Obfuscate(XXX)
'تحويله الى اسكي
'رقم التفعيل
XXX = Str2Int(XXX)
'اقتصاص 14 رقم
XXX = (XXX.Substring(0, 14))
'استنتاج رقم التفعيل
TextBoxUser.Text = XXX
End Sub
End Class
طبعا لا حاجة للشرح فالأمر واضح مما سبق ومن الكود (فقط بعض التعديلات على رقم التسجيل)
الآن ما عليك إلا الضغط على زر رقم التفعيل بعد إدخال رقم التسجيل وسيظهر في الصندوق الثاني رقم التفعيل لترسله للعميل ويتمكن من تفعيل البرنامج بالشكل الصحيح .
وبذلك نكون قد ناقشنا الموضوع بطريقة مطولة بعض الشيء لذلك معذرة مني إليكم .
وفي الختام:
· الغرض من برنامجنا هو غرض تعليمي.
· إذا كان برنامجك يستحق الحماية فقم بحمايته.
· لا تعرض برنامجك مباشرة و إنما قم بنشر نسخة محدودة المهام أصلا أي البرمجة غير كاملة بمثال عدم وجود البحث أبدا أو الطباعة أو .... وعند الطلب أرسل للعميل فقط نسخة كاملة تحتاج للتفعيل بإحدى الطرق ويفضل أن تتوسع في البحث عن حمايات أقوى مما قدمناه.
· جاهز لأي استفسار حول الموضع في حدود استطاعتي.
· ولكم مني جزيل الشكر لإصغائكم.
- tarik
- عدد المساهمات : 134
تاريخ التسجيل : 08/10/2012
رد: الوافي في حماية البرنامج عبر التسجيل والتفعيل
السبت سبتمبر 28, 2013 8:55 am
سأعطي الآن مثال يوضح السماح بالدخول للبرنامج أو عدم السماح إذا لم يتم التسجيل وسأعتمد طريقة حفظ القيمة في الريجستري من باب التوسع :
طبعا لن نعيد الشرح السابق كاملا فالأمر ما هو إلا تعديل بسيط :
كود الموديل كما هو
كود الفورم سوف نغيره كما يلي:
كود زر التفعيل إلى :
'عملية التحقق من الرقم
' قراءة القيمة من الريج ووضعها في التيكست بوكس
TextBoxUser.Text = My.Computer.Registry.GetValue("HKEY_CURRENT_USER\Software\Nour", "num", "0")
'الان اذا صح سوف يظهر البرنامج مباشرة
If TextBoxUser.Text = Idp1 Then
MAIN.Show()
Me.Close()
'والا ستيقى نافذة التسجيل هي الظاهرة
End If
[/code]حيث سيتم قراءة القيمة المخزنة في الريجستري إذا كانت صحيحة فسوف تظهر لنا شاشة البرنامج الرئيسية وتغلق نافذة التفعيل وغير ذلك ستبقى نافذة التسجيل هي الظاهرة .
طبعا أضفنا فورم رئيسي بمسمى MAIN كتمثيل للنافذة الرئيسية لبرنامجنا.
1
طبعا لن نعيد الشرح السابق كاملا فالأمر ما هو إلا تعديل بسيط :
كود الموديل كما هو
كود الفورم سوف نغيره كما يلي:
- الكود:
Imports System.Management
Public Class Form1
Dim Idp As String
Dim Idp1 As String
Private Sub FrmActiv_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'الرقم التسلسلي للمعالج
Dim Searcher As ManagementObjectSearcher
Searcher = New ManagementObjectSearcher("Select ProcessorId From Win32_Processor")
For Each Device As ManagementObject In Searcher.Get
For Each Prop As PropertyData In Device.Properties
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'استخراج الرقم
Idp = (Prop.Value.ToString)
Next
Next
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'تشويش الرقم
Idp = Obfuscate(Idp)
'تحويله الى اسكي
Idp = Str2Int(Idp)
'رقم التسجيل
TextBoxReg.Text = Idp
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'تشويش الرقم
Idp1 = Obfuscate(Idp)
'تحويله الى اسكي
'رقم التفعيل
Idp1 = Str2Int(Idp1)
'اقتصاص 14 رقم
Idp1 = (Idp1.Substring(0, 14))
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'عملية التحقق من الرقم
' قراءة القيمة من الريج ووضعها في التيكست بوكس
TextBoxUser.Text = My.Computer.Registry.GetValue("HKEY_CURRENT_USER\Software\Nour", "num", "0")
'الان اذا صح سوف يظهر البرنامج مباشرة
If TextBoxUser.Text = Idp1 Then
MAIN.Show()
Me.Close()
'والا ستيقى نافذة التسجيل هي الظاهرة
End If
End Sub
Private Sub ButtonOk_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonOk.Click
If TextBoxUser.Text = Idp1 Then
'اذا كان رقم التفعيل صح سيقوم بحفظه في الريجستري
My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Nour", "num", TextBoxUser.Text)
MsgBox("الرقم صحيح ... رجاء أعد تشغيل البرنامج")
End
End If
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
End
End Sub
End Class
كود زر التفعيل إلى :
- الكود:
Private Sub ButtonOk_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonOk.Click
If TextBoxUser.Text = Idp1 Then
'اذا كان رقم التفعيل صح سيقوم بحفظه في الريجستري
My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Nour", "num", TextBoxUser.Text)
MsgBox("الرقم صحيح ... رجاء أعد تشغيل البرنامج")
End
End If
'عملية التحقق من الرقم
' قراءة القيمة من الريج ووضعها في التيكست بوكس
TextBoxUser.Text = My.Computer.Registry.GetValue("HKEY_CURRENT_USER\Software\Nour", "num", "0")
'الان اذا صح سوف يظهر البرنامج مباشرة
If TextBoxUser.Text = Idp1 Then
MAIN.Show()
Me.Close()
'والا ستيقى نافذة التسجيل هي الظاهرة
End If
[/code]حيث سيتم قراءة القيمة المخزنة في الريجستري إذا كانت صحيحة فسوف تظهر لنا شاشة البرنامج الرئيسية وتغلق نافذة التفعيل وغير ذلك ستبقى نافذة التسجيل هي الظاهرة .
طبعا أضفنا فورم رئيسي بمسمى MAIN كتمثيل للنافذة الرئيسية لبرنامجنا.
1
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى