شاطر
اذهب الى الأسفل
عدد المساهمات : 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
الآن ضغطتين متتاليتين على زر الأمر لإدخال الكود المناسب لاستخراج رقم المعالج ووضعه في صندوق النص :
وبالأحرى هذا الكود كاملا أولا استيراد لوظائف المكتبة وبعدها كود الزر:

الكود:

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 ونحن أيضاً سنلتزم بأوامره فكما ذكرت سابقا الرسالة لإيضاح نجاح العملية أما الأصل فهو استخدام الإجراء المناسب كفتح البرنامج أو تفعيل الميزات المحجوبة
ربما يسأل البعض ما دخل المهندس العكسي في الموضع أقول أنه ربما يفكر في الكسر لذلك نحن نريده أن يكسب الجائزة بعرق جبينه وليس بسهولة لذلك سنجعل عملياتنا مخفية عليه بعض الشيء لنكسبه بعض الخبرة ويكون الكسر تم بتعبه وعرق جبينه و إلا فنحن نتحرى الخير في الناس وفي عملائنا أنهم لا يحاولوا كسر برامجنا ويتركونا نتسبب.
نتابع مع بعض النصائح : لا تجعل مكان التفعيل هو نفسه مكان المقارنة وإعطاء الصلاحيات
ما المقصود بذلك ؟
المقصود أحبتي : أننا عند تفعيل برنامجنا بشكله الصحيح فأنه لا يتم تخزين الرقم الخاطئ و يتم تخزين الرقم لأنه صحيح فقط أما تفعيل الميزات فتحتاج لمقارنة أخرى في فورم أخر بعيدا عن مكان التفعيل بشرح بسيط لو أدخل المستخدم رقم التفعيل الصحيح ستظهر رسالة تفيد بذلك وبنفس الوقت نخزن الرقم الصحيح في مكان معين (البرنامج- الريجستري-ملف ) وعند إقلاع البرنامج يتم المقارنة مرة أخرى بنفس الطريقة لان البرنامج ربما يتم تجاوزه من خلال الهندسة العكسية ويتم تدمير قسم المقارنة لذلك المقارنة الأساسية تتم في مكان أخر وواجهة التفعيل هي فقط لتخزين الرقم الصحيح وعند إقلاع البرنامج تتم المقارنة بين رقم التفعيل والرقم المخزن من جديد صح يفعل الميزات وإلا فلا وهكذا نقوم بحشو برنامجنا بعشرة مقارنات ونضع عشرة مقارنات أخرى احتياط مثل بعد التشغيل الخامس للبرنامج في اليوم الأول من كل شهر وبعد شهرين بذلك نضمن أن قفزات الجمل الشرطية مهما حطم منها يبقى شيء مفعوله موجود

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

_________________
[img] [/img]
عدد المساهمات : 134
تاريخ التسجيل : 08/10/2012
معاينة صفحة البيانات الشخصي للعضو

رد: الوافي في حماية البرنامج عبر التسجيل والتفعيل

في السبت سبتمبر 28, 2013 8:48 am
نعود لكودنا في الزر طبعا الدالة يمكنك أن ترميها في موديول وتخلص من رؤيتها أمامك لأنها جاهزة ولن نعدل عليها وإنما سنستدعيها فقط لذلك أول شيء قم بقص الدالة و الصقها في الموديل .
الآن سنجعل رقم المعالج يظهر بمجرد فتح الفورم طبعا فقط ننقل الكود من حدث ضغط الزر 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
الآن يسأل السائل إذا قام العميل بالتفعيل فهل سأقول له مبروك فقط أما ماذا يحدث


_________________
[img] [/img]
عدد المساهمات : 134
تاريخ التسجيل : 08/10/2012
معاينة صفحة البيانات الشخصي للعضو

رد: الوافي في حماية البرنامج عبر التسجيل والتفعيل

في السبت سبتمبر 28, 2013 8:53 am
نبدأ من جديد :
عند إدخال الرقم الصحيح سنقوم بتخزينه وأكرر لك الحرية في اختيار موضع التخزين ولا يهم ظهور الرقم لأنه صحيح ونحن من زودناه به لذلك سألجأ إلى 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


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


_________________
[img] [/img]
عدد المساهمات : 134
تاريخ التسجيل : 08/10/2012
معاينة صفحة البيانات الشخصي للعضو

رد: الوافي في حماية البرنامج عبر التسجيل والتفعيل

في السبت سبتمبر 28, 2013 8:55 am
سأعطي الآن مثال يوضح السماح بالدخول للبرنامج أو عدم السماح إذا لم يتم التسجيل وسأعتمد طريقة حفظ القيمة في الريجستري من باب التوسع :

طبعا لن نعيد الشرح السابق كاملا فالأمر ما هو إلا تعديل بسيط :
كود الموديل كما هو

كود الفورم سوف نغيره كما يلي:

الكود:

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


_________________
[img] [/img]
الرجوع الى أعلى الصفحة
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى