بسم الله الرحمن الرحيم
وأفضل الصلاة و أتم التسليم على رسولنا الكريم
السلام عليكم ورحمة الله وبركاته
تحية طيبة وبعد:
سنتناول في هذا الموضوع طريقة تسجيل البرنامج وتفعيله و الذي تم تناوله سابقا في الفيجوال بيسك 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 التالي:
If TextBoxUser.Text = TextBoxAct.Text Then
MsgBox("تم تفعيل البرنامج شكراً لك")
Else
MsgBox("الرقم المدخل خاطئ")
End If
End Sub
Private Sub ButtonOk_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonOk.Click
الآن جرب لترى النتيجة :

نحن اعتمدنا إظهار رسالة للعميل تفيد بأن الرقم صح أو خطا أما بالشكل العملي فالأمر سيكون بتفعيل فتح نوافذ واستخدام إمكانيات كالطباعة مثلا أو فتح البرنامج إذا كان التفعيل يظهر عند إقلاع البرنامج مباشرة لذلك نحن نستعيض بعبارة
MsgBox("تم تفعيل البرنامج شكراً لك")بالإجراء المطلوب تنفيذه عند إدخال القيمة الصحيحة وإلا لن نظهر له شيء لان المهندس العكسي ينصحنا بذلك
MsgBox("تم تفعيل البرنامج شكراً لك")
End If
If TextBoxUser.Text = TextBoxAct.Text Then
ومن نصائحه لنا هي أن لا نستخدم MsgBox ونحن أيضاً سنلتزم بأوامره فكما ذكرت سابقا الرسالة لإيضاح نجاح العملية أما الأصل فهو استخدام الإجراء المناسب كفتح البرنامج أو تفعيل الميزات المحجوبة
ربما يسأل البعض ما دخل المهندس العكسي في الموضع أقول أنه ربما يفكر في الكسر لذلك نحن نريده أن يكسب الجائزة بعرق جبينه وليس بسهولة لذلك سنجعل عملياتنا مخفية عليه بعض الشيء لنكسبه بعض الخبرة ويكون الكسر تم بتعبه وعرق جبينه و إلا فنحن نتحرى الخير في الناس وفي عملائنا أنهم لا يحاولوا كسر برامجنا ويتركونا نتسبب.
نتابع مع بعض النصائح : لا تجعل مكان التفعيل هو نفسه مكان المقارنة وإعطاء الصلاحيات
ما المقصود بذلك ؟
المقصود أحبتي : أننا عند تفعيل برنامجنا بشكله الصحيح فأنه لا يتم تخزين الرقم الخاطئ و يتم تخزين الرقم لأنه صحيح فقط أما تفعيل الميزات فتحتاج لمقارنة أخرى في فورم أخر بعيدا عن مكان التفعيل بشرح بسيط لو أدخل المستخدم رقم التفعيل الصحيح ستظهر رسالة تفيد بذلك وبنفس الوقت نخزن الرقم الصحيح في مكان معين (البرنامج- الريجستري-ملف ) وعند إقلاع البرنامج يتم المقارنة مرة أخرى بنفس الطريقة لان البرنامج ربما يتم تجاوزه من خلال الهندسة العكسية ويتم تدمير قسم المقارنة لذلك المقارنة الأساسية تتم في مكان أخر وواجهة التفعيل هي فقط لتخزين الرقم الصحيح وعند إقلاع البرنامج تتم المقارنة بين رقم التفعيل والرقم المخزن من جديد صح يفعل الميزات وإلا فلا وهكذا نقوم بحشو برنامجنا بعشرة مقارنات ونضع عشرة مقارنات أخرى احتياط مثل بعد التشغيل الخامس للبرنامج في اليوم الأول من كل شهر وبعد شهرين بذلك نضمن أن قفزات الجمل الشرطية مهما حطم منها يبقى شيء مفعوله موجود
الهدف : بهذه الطريقة التمويهية نجعل أمر تجاوز المقارنات صعب بالتالي لن يكسر وطبعا هنا لن نسبية بطريقة القفز وتدمير المقارنات ماذا لو فكر بتدمير جميع المقارنات فالأمر صعب لان برنامجك ربما يحوي مقارنات عادية كالبحث وغيره بالتالي لن يعمل البرنامج بشكل صحيح فليس أمامه في طريقة القفز إلا العمل على البرنامج لمدة سنة كاملة وبعدين يعطينا نسخة مكسورة تعمل بطلاقة .
الطرقة الثانية للمهندس العكسي : هي استنتاج الرقم طبعا سيكون هذا الأمر مجدي له أكثر بخلاف العادة فبمجرد الوصول لأول مقارنة بين رقم التفعيل و الرقم المدخل سيكشفه إذا كان ذكي قليلا حسب معلوماتي المتواضعة عن هذه الأمور.
لكن هذه الطريقة تفتح أمامه مجالين :
الأول : أنه سيكشف الرقم للجهاز الذي يحاول الكسر عليه بالتالي يجب عليه الذهاب لكل جهاز والكسر عليه بهذه الحالة نضمن أن النسخ المكسورة ستكون أقل ما يمكن لأنه مش معقول يحمل العدة ويجوب على المستخدمين ياهو كسر برنامج فلان .
الثاني : هو الخطير لو استطاع كشف المعادلة بالتالي يستطيع عمل مولد أرقام مثل الذي لدينا وهذا سنحاول تجنبه بتعقيد المعادلة المخصصة لاستخراج رقم المعالج وتشفيره بحيث لا يستطيع فك عمليات التشفير على الرقم.
أتوقع كافي نظري حول تجنب الكسر و لا أقول لا أو انه صعب الكسر فالسوق أكبر دليل لكن كان سعيي لتوليد فكرة حول الأمر للجميع حتى يناقشوه في برامجهم ويستخدموه بالشكل الأمثل الذي يناسبهم.




