تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
طرق حماية البرنامج من الاستنساخ
#1
كاتب الموضوع : FlyToAbd

سنناقش هنا حماية البرامج وهذا الموضوع هو توسعة للموضوع
http://vb4arb.com/vb/showthread.php?970

واول اجراء هو الحماية برقم القرص

كود :
[SIZE=2][color=#0000ff]PublicFunction[/color] HardCode() [color=#0000ff]As[/color][/SIZE][SIZE=2][COLOR=#0000ff]String
[/COLOR][color=#0000ff]Dim[/color] Ret [color=#0000ff]As[/color][/SIZE][SIZE=2][COLOR=#0000ff]String
[/COLOR][color=#0000ff]Dim[/color] DriveLetter [color=#0000ff]As[/color][color=#0000ff]String[/color] = Application.StartupPath.Substring(0, 3)
[color=#0000ff]Dim[/color] obj_FSO [color=#0000ff]As[/color][color=#0000ff]Object[/color], obj_Drive [color=#0000ff]As[/color][/SIZE][SIZE=2][COLOR=#0000ff]Object
[/COLOR]obj_FSO = CreateObject([color=#800000]"Scripting.FileSystemObject"[/color])
obj_Drive = obj_FSO.GetDrive(DriveLetter)
Ret = obj_Drive.SerialNumber
obj_FSO = [/SIZE][SIZE=2][COLOR=#0000ff]Nothing
[/COLOR]obj_Drive = [/SIZE][SIZE=2][COLOR=#0000ff]Nothing
[/COLOR]Ret = [color=#0000ff]New[/color][color=#0000ff]String[/color]([color=#800000]"0"[/color], 8 - Ret.Length) & Ret
[color=#0000ff]Return[/color] Ret
[color=#0000ff]End[/color][/SIZE][SIZE=2][COLOR=#0000ff]Function
[/COLOR][/SIZE]
الفكرة بسيطة جدا واختراقها ابسط منها لكن هى اول مرحلة لك لحماية نظام معين وتعتبر عائق بسيط امام السارق للبرنامج
KD هو رقم القرص الصلب نجده من الدالة
SN هو الرقم الذي يمثل معكوس KD ويمكن حسابه من Not KD هذا هو سر الفكرة مع اعادة جعل عدد مراتبه مساوي لثمانية

نحفظ SN في قاعدة البيانات وعند تشغيل البرنامج نجلب SN من القاعدة ثم نقرأ KD من خلال الدالة اعلاه ونختبر Not SN=KD فاذا كانت النتيجة True فان البرنامج غير مسروق والا فهو اما مسروق او تم تنصيبه لاول مرة فنظهر رسالة للمستخدم تعطيه قيمة KD وتطلب منه تسليمه الى البائع للبرنامج ويطلب منه كتابة الرقم الذي يعطيه البائع والذي هو Not KD فعندما يدخل SN نحفظه في قاعدة البيانات ونفحص Not SN=KD اما يكون صحيح او نعيد عرض الرسالة وامكانية انهاء البرنامج
عيوب الفكرة اعلاه انه لم عملنا Format للقرص او نصبنا Windows عليه من جديد سيتغير رقم القرص وعليه سيضطر المستخدم للاتصال بك لتعطيه مفتاح جديد للبرنامج


كود :
[SIZE=2][color=#0000ff]Public[/color][/SIZE][SIZE=2][color=#0000ff]Shared[/color][/SIZE][SIZE=2][color=#0000ff]Function[/color][/SIZE][SIZE=2] MacAddress() [/SIZE][SIZE=2][color=#0000ff]As[/color][/SIZE][SIZE=2][COLOR=#0000ff]String
[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]Try
[/COLOR][/SIZE][SIZE=2][color=#0000ff]Dim[/color][/SIZE][SIZE=2] Ret [/SIZE][SIZE=2][color=#0000ff]As[/color][/SIZE][SIZE=2][color=#0000ff]String[/color][/SIZE][SIZE=2] = [/SIZE][SIZE=2][COLOR=#800000]""
[/COLOR][/SIZE][SIZE=2][color=#0000ff]Dim[/color][/SIZE][SIZE=2] strMACAddress [/SIZE][SIZE=2][color=#0000ff]As[/color][/SIZE][SIZE=2][color=#0000ff]String[/color][/SIZE][SIZE=2] = [/SIZE][SIZE=2][COLOR=#800000]""
[/COLOR][/SIZE][SIZE=2][color=#0000ff]Dim[/color][/SIZE][SIZE=2] strQuery [/SIZE][SIZE=2][color=#0000ff]As[/color][/SIZE][SIZE=2][color=#0000ff]String[/color][/SIZE][SIZE=2] = [/SIZE][SIZE=2][COLOR=#800000]"SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True"
[/COLOR][/SIZE][SIZE=2][color=#0000ff]Dim[/color][/SIZE][SIZE=2] query [/SIZE][SIZE=2][color=#0000ff]As[/color][/SIZE][SIZE=2] ManagementObjectSearcher = [/SIZE][SIZE=2][color=#0000ff]New[/color][/SIZE][SIZE=2] ManagementObjectSearcher(strQuery)
[/SIZE][SIZE=2][color=#0000ff]Dim[/color][/SIZE][SIZE=2] queryCollection [/SIZE][SIZE=2][color=#0000ff]As[/color][/SIZE][SIZE=2] ManagementObjectCollection = query.Get()
[/SIZE][SIZE=2][color=#0000ff]For[/color][/SIZE][SIZE=2][color=#0000ff]Each[/color][/SIZE][SIZE=2] mo [/SIZE][SIZE=2][color=#0000ff]As[/color][/SIZE][SIZE=2] ManagementObject [/SIZE][SIZE=2][color=#0000ff]In[/color][/SIZE][SIZE=2] queryCollection
strMACAddress = mo([/SIZE][SIZE=2][color=#800000]"MacAddress"[/color][/SIZE][SIZE=2]).ToString().Replace([/SIZE][SIZE=2][color=#800000]":"[/color][/SIZE][SIZE=2], [/SIZE][SIZE=2][color=#800000]""[/color][/SIZE][SIZE=2]) : [/SIZE][SIZE=2][color=#0000ff]Exit[/color][/SIZE][SIZE=2][COLOR=#0000ff]For
[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]Next
[/COLOR][/SIZE][SIZE=2]Ret = strMACAddress
[/SIZE][SIZE=2][color=#0000ff]Return[/color][/SIZE][SIZE=2] Ret
[/SIZE][SIZE=2][COLOR=#008000]' From Command DOS C:\> GetMAC
[/COLOR][/SIZE][SIZE=2][color=#0000ff]Catch[/color][/SIZE][SIZE=2] ex [/SIZE][SIZE=2][color=#0000ff]As[/color][/SIZE][SIZE=2] Exception
[/SIZE][SIZE=2][color=#0000ff]Return[/color][/SIZE][SIZE=2][COLOR=#800000]""
[/COLOR][/SIZE][SIZE=2][color=#0000ff]End[/color][/SIZE][SIZE=2][COLOR=#0000ff]Try
[/COLOR][/SIZE][SIZE=2][color=#0000ff]End[/color][/SIZE][SIZE=2][COLOR=#0000ff]Function
[/COLOR][/SIZE]
هذه الدالة ترجع لك MacAddress وهو رقم موجود لكل بطاقة شبكة (كارت شبكة) وفي الوقت الحالي موجود في كل كومبيوتر تقريبا وهذا الرقم لايتغير نهائيا ويعتبر اقوى من رقم القرص وبذلك يمكن استخدامه للحماية
}}}}
تم الشكر بواسطة:
#2
عملية الحماية باختصار انه لدينا برنامج يتم تنصيبه على جهاز فيجب ان يعمل عليه ولا يعمل البرنامج على اي جهاز اخر (هذا يعني انه تم نسخه الى الجهاز الاخر)

فيجب ان يجد البرنامج معلومة في الجهاز الذي يعمل عليه ولا يجدها في غيره وبذلك سيقرر انه نسخة اصلية ام مستنسخة

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

وبذلك اول خطوة نخطوها الى الامام هي اننا نظهر للمستخدم القيمة ولكن تم تمريرها على فلتر او قناع وبشرط يمكن ارجاع القيمة الاصلية من قبل المبرمج

هنا اصبح لدينا ثلاث مفاتيح علينا تسميتها وتعرفها لكي يمكن التناقش حولها
KeyBase المفتاح الاساسي هذا سيحمل القيمة الموجودة في الجهاز وهي مثلا رقم القرص الصلب او عنوان كارت الشبكة وتكون هذه القيمة يمكن قراءتها من خلال برنامج وهي ليست سرية
KeyUser المفتاح الذي يراه المستخدم وهو يتولد من KeyBase من خلال احد الفلاتر او الاقنعة التي يتم شرح مجموعة منها
KeyCode وهو المفتاح الذي سيعطيه المبرمج للمستخدم لكي يمكنه تشغيل البرنامج ويتولد من Key User ويمكن مقارنته مع KeyBase لمعرفة صلاحية النسخة
}}}}
تم الشكر بواسطة:
#3
اولا ننقل مشاركة الاخ mali الى هنا لمراجعتها من قبل الاخوة المتابعين
هذا الكود يفضل لأنه له مطلق الحرية في الاختيار السيريال للهارد ديسك وحفظه في مكان والتحكم به
Imports System.Management
Imports System.Management.Instrumentation
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*******

Dim HDinformation As New ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia")
Dim HD As ManagementObject
For Each HD In HDinformation.Get()
TextBox1.Text = HD("SerialNumber").ToString()
Next
}}}}
تم الشكر بواسطة:
#4
المثال العملي سيكون مبسطا جدا بحيث فقط ننظم العملية وبذلك سيكون Interface المثال على شكل صندوق ادخال InputBox ونحن نعلم ان شكله غير جيد خاصة اذا استخدمنا الفكرة مع مشروع له واجهة مستخدم جميلة أو حديثة وكذلك سنحفظ المفتاح في ملف نصي بسيط بينما عندما يتم تطبيق هذه الفكرة سيتم حفظ هذا المفتاح في قاعدة البيانات اذا النظام فيه قاعدة بيانات ويتم حفظه في Registry اذا كان النظام بدون قاعدة بيانات وممكن ايضا في Resources (هل تحبون عمل موضوع عن كل طريقة حفظ ومبرراتها؟؟؟؟)


كود :
Public Class Form1
Dim Mask As String = "98765432"
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Not PassSecurity Then End
End Sub
Public Function PassSecurity() As Boolean
Dim BaseKey As String = HardCode()
Dim DataKey As String = LoadCode()
Dim Ret As Boolean = False
Dim ViewedKey As String = Masking_XOR(BaseKey)
If DataKey = ViewedKey Then
MsgBox("Pass")
Ret = True
Else
MsgBox("Fail May be:" & vbCrLf & "1. First Time" & vbCrLf & "2. Copyed Program")
Dim Ans As String = InputBox(ViewedKey, "Security")
If Ans = "" Then
MsgBox("No Answer")
Else
If BaseKey = Ans Then
MsgBox("Valid Code" & vbCrLf & "Pass")
Ret = True
' Saving New Code
Dim FileName As String = Application.StartupPath & "\CodeFile.txt"
Dim FileNum As Integer = FreeFile()
FileOpen(FileNum, FileName, OpenMode.Binary)
FilePut(FileNum, Masking_XOR(Ans))
FileClose()
Else
MsgBox("Invalid Code")
End If
End If
End If
Return Ret
End Function
Public Function HardCode() As String
Dim Ret As String
Dim DriveLetter As String = Application.StartupPath.Substring(0, 3)
Dim obj_FSO As Object
Dim obj_Drive As Object
obj_FSO = CreateObject("Scripting.FileSystemObject")
obj_Drive = obj_FSO.GetDrive(DriveLetter)
Dim SerNum As Integer = obj_Drive.SerialNumber
Ret = Hex(SerNum)
obj_FSO = Nothing
obj_Drive = Nothing
Ret = New String("0", 8 - Ret.Length) & Ret
Return Ret
End Function
Public Function LoadCode() As String
Dim FileName As String = Application.StartupPath & "\CodeFile.txt"
Dim FileNum As Integer = FreeFile()
If Dir(FileName) = "" Then
MsgBox("لايوجد ملف")
FileOpen(FileNum, FileName, OpenMode.Binary)
FilePut(FileNum, "00000000")
FileClose()
End If
Dim Code As New String("0", 8)
FileOpen(FileNum, FileName, OpenMode.Binary)
FileGet(FileNum, Code)
FileClose()
Return Code
End Function
Public Function Masking_Not(ByVal Code As String) As String
Dim Ret As String = ""
Dim Num As Integer = Val("&H" & Code)
Num = Not Num
Ret = Hex(Num)
Ret = New String("0", 8 - Ret.Length) & Ret
Return Ret
End Function
Public Function Masking_XOR(ByVal Code As String) As String
Dim Ret As String = ""
Dim Num_1 As Integer = Val("&H" & Code)
Dim Num_2 As Integer = Val("&H" & Mask)
Dim Num_3 As Integer = Num_1 Xor Num_2
Ret = Hex(Num_3)
Ret = New String("0", 8 - Ret.Length) & Ret
Return Ret
End Function
Public Function Masking_EQV(ByVal Code As String) As String
Dim Ret As String = ""
Dim Num_1 As Integer = Val("&H" & Code)
Dim Num_2 As Integer = Val("&H" & Mask)
Dim Num_3 As Integer = (Not Num_1) Xor Num_2
Ret = Hex(Num_3)
Ret = New String("0", 8 - Ret.Length) & Ret
Return Ret
End Function
End Class
طريقة تجربة البرنامج
شغل البرنامج وأجب على الرسائل بموافق وعند عرض ادخل المفتاح المطلوب وسوف يعطيك مفتاح (جرب ان تجيبه بأي شيء ستجده لا يشغل البرنامج) تاخذه الى الالة الحاسبة وتختار Hex في الالة ثم تلصق المفتاح اللي اخذته من البرنامج وتضغط على XOR ثم 98765432 ثم = سيظهر لك ناتج انسخه ولاحظ انه هو رقم القرص والصقه في البرنامج واجب بموافق تكون فتحت الحماية ... جرب شغل البرنامج لثاني مرة او لثالث مرة تجده مفتوحا
}}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  حماية البرامج ابو ليلى 4 1,009 31-07-16, 01:07 AM
آخر رد: Kian Tech
  [درس فيديو] تشغيل اوامر Run من البرنامج & مثال غلق الويندوز بعد وقت محدد باستخدام VB.net أحمد النجار 1 544 23-12-15, 04:26 AM
آخر رد: الماجيك مسعد
  [كود] عمل DragDrop من البرنامج الى Windows explorer HASAN6.0 5 369 02-12-15, 04:04 PM
آخر رد: hamada558
Brick [مثال] السحب والافلات على ايقونه البرنامج اكثر من مره والافلات على النافذه الطالب 0 366 15-08-15, 09:58 PM
آخر رد: الطالب
  فيديو بالعربي انشاء جملة الاتصال اثناء تشغيل البرنامج أحمد النجار 0 395 13-06-15, 09:40 AM
آخر رد: أحمد النجار
  مقال- مقدمة الي حماية البرامج RaggiTech 0 1,122 05-10-12, 10:52 AM
آخر رد: RaggiTech
  حماية وتفعيل البرامج Magic Lock RaggiTech 0 744 03-10-12, 01:45 PM
آخر رد: RaggiTech
  حماية السورس كود RaggiTech 5 791 03-10-12, 01:43 PM
آخر رد: RaggiTech
  تعلم حماية برنامجك بحيث لا يعمل الا على قرص صلب واحد RaggiTech 0 826 03-10-12, 09:36 AM
آخر رد: RaggiTech
  تخزين ملف ما ضمن Exe البرنامج أثناء التطوير واستعادته أثناء التشغيل RaggiTech 1 445 03-10-12, 08:14 AM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم