ما سأقوم بشرحه الان هو الاسلوب الشامل لحماية برنامجك من السرقة في ببيئة الــ dot net
وسيكون الشرح من الصفر الي الاحتراف في التشفير
فلنستعن بالله ولنبدأ الموضوعاولا
مبادئ الحماية
تعرض الكثير منا للسرقة في برامجه ووسائل كسر الحماية تعددت
حتي اني قابلت صديقا لي اشهد له بالاحترف البرمجي قال
"لطالما برامجي تسرق فلن ابرمج مجددا"!!
لكن ما لم نفكر به هو كيف نحمي برامجنا من السرقة
لذا يجب اولا ان نفهم كيف يفكر الكراكر الذي يكسر حماية برامجنا
1- الكراكر ذكي جدا لانه مطلوب منه فهم طريقة تفكيرك في حماية برنامجك بل وكيف يتفوق عليك في كسرها
2- يحاول الكراكر ان يحل معادلة التشفير الخاصة ببرامجك وهي غالبا ما تتلخص في اسلوب تشفير بسيط او كلمة سر خاصة بك
3- ان لم يستطع فسيحاول ان يحاكي ظروف النسخة الاصلية كمثال البرامج
المحمية بــ dongle فكسرها لا يعتمد علي فك تشفير معادلاتها بل بمحاكاة
الــ dongle نفسه والبرنامج اعمي سيجد ان الــ dongle موجودا فيرفع حمايته
4- او البعض يحاول الوصول الي طريقة اكتشاف سرقة البرنامج و يعطلها كمجموعة
الــ photoshop فالكراك الخاص بها اساسه تعطيل وصول البرامج الي النت لكي
لا تكتشف الشركة سرقتها
5- او يحاول (وهذا اضعف الايمان ) ان يطيل مدة النسخة التجريبية لبرنامجك كلما اراد كالمثال المشهور لــ antiarp
وهذه هي الطرق التي يحاول الكراكر اختراق برنامجك بها لذا سنحاول اغلاق هذه
الثغرات واحدة تلو الاخري كي نسطيع القول ان برامجنا محمية بنسبة 90% (ولا
يمكن ان تزيد هذه النسبة لكن لا بأس بها)
ثانيا
ربط البرنامج بمكون من الجهاز
البعض يلجأ الي ربط البرنامج بسيريال من الجاز كالخاص بالبروسيسور او الهارد او حتي اسطوانة البرنامج
وهذه طريقة مثلي للحماية من نقطة الضعف الاولي ولكن كيف؟؟
لقد ابطلت شركة انتل خاصية امداد البرامج بسيريال البروسيسور منذ صدور core 2 due
وبالطبع لا يمكننا الاعتماد علي علي المعالجات القديمة لبيع برامجنا
اما سيريال الاسطوانة الخاصة بالبرنامج فهو اسهل ما يمكن كسرة فالبرامج
متعدده لهذا الغرض مثل virtual cd - demon tools - alcohol وغيرها الكثير
يبقي لنا الهدف الوحيد وهو القرص الصلب hard disk
ولكن تعددت المحاولات لقراءة مسلسل القرص الصلب ولكن معظمها اابي الي الفشل
اما بقراءة انواع معينه كالاقراص الــ ata ولكن لا تستطيع قراءة الــ
sata او قراءة مسلسل الــ partition وهو يتغير مع كل عملية تهيئة format
ولكني اقدم لكم الحل الامثل في صورة مكتبة dll يمكنك من خلالها ان تسترجع
رقم مسلسل القرص الخاص بالمصنع والذي لا يمكن تغييره او محاكاته
اسم المكتبة
Interop.HWINFOCOMLib.dll
سيتوجب علينا قبل إستخدامها تسجيلها في مسجل الويندوز عن طريق نقلها الي
مجلد الــ system32 الخاص بالنسخة وكتابة الامر التي في قائمة run
كود:
regsvr32 %SystemRoot%\System32\Interop.HWINFOCOMLib.dll
ولتسهيل العمل سنقوم ببناء class اسمه protect
في مشروعنا
وسنضع دالة داخل الكلاس لتسترجع لنا مسلسل القرص بناءا عل الدالة الخاصة بنا ولكن لنضيف المكتبة الي مشروعنا عن طريق add reference
كود:
function getserial
Dim harddiskserial As New HWINFOCOMLib.HD
dim ser as string = harddiskserial.serialnumber
return ser
end function
لذا فوارد هذه الدالة هو مسلسل القرص الصلب الخاص بالجهاز
والي هنا قد تفادينا محاولات محاكاة و الهروب من تسجيل البرنامج
ثالثا
ماذا الان ؟
نريد ان نربط البرنامج بهذا المسلسل بحيث انه عند تسجيل البرنامج يتأكد من مسلسل القرص الصلب و يطابقة مع كود التسجيل
فإذا اشتري اي عميل البرنامج يرسل لنا كود التسجيل ونرسل له كود التفعيل المرتبط بمسلسل القرص الخاص به
فإذا اخذه اي عميل اخر سيجد ان البرنامج لا يعمل لديه لان رقم المسلسل غير متطابق
لذا يجب في كل مرة يقلع بها البرنامج ان يتأكد من مطابقة مسلسل القرص الصلب
مع المخزن لديه ( اتركها للمبرمج) ولكن البرنامج مازال عرضه للسرقه فإذا
علم الكراكر اين يخزن مسلسل القرص الصلب فسيقوم بنقل المسلسل الخاص بقرصة
الي مكان التخزين وعنداقلاع البرنامج سيجد الرقمان متطابقان فأين الحل
الحل هنا فيما يسمي بالتشفير ولكن نعقد الموضوع برمته علي الكراكر سنقوم بتشفير المسلسل مرتان
الاولي تكون كود التسجيل والثانية هي كود التفعيل !
فإن اشتري العميل برنامجنا فسيرسل لنا كود التسجيل وببرنامج اخر لدينا يحمل
المعادلة العكسية للتشفير نستخرج رقم المسلسل الخاص بقرصة ثم نشفرة مرة
اخري بالطريقة الثانية ونرسل له كود التفعيل ( الكل اتلخبط صح؟)
علشان اوضح الموضوع اكثر هبسطه
مثلا لو فرضت ان رقم المسلسل كان 123456
وإستخدمت معادلة بسيطة جدا وهي إضافة رقم 5 الي قيمة المسلسل وطريقة اخري بحذف القيمة 6 من الرقم فيكون ناتج التشفير الاول هو
123456+5=123461 وهذا هو كود التسجيل الذي سيظهر للعميل
ويقوم العميل بدوره بإرسال الكود 123461 الينا فنقوم بمعادلة عكسية للتشفير
وهي حذف ال5 المضافة فيظهر لنا رقم المسلسل 123456 ثم بدورنا نحذف القيمة 6
من المسلسل فيصبح 123450 وهو كود التفعيل الذي سيستخدمه العميل لتفعيل
البرنامج
اما في البرنامج فعند كل اقلاع يطابق كود التسجيل مع كود التفعيل فإذا كان
كود التفعيل +6 -5 هو كود التسجيل يكون البرنامج سليما -------- حد فهم
حاجه؟؟
لو فهمتم اكمل
المهم ان طرق التشفير لازم تكون معقده الي اقصي درجة بحيث انه يستحيل علي الكراكر كسرها
وجاء دور المكتبة الثانية
Chilkat
وهي مكتبة تستخدم طرق خطيرة في التشفير وبها مميزات اخري كثيرة جدا جدا سنطرأ اليها لاحقا عندما نحتاجها
ولكن المهم الان هو التشفير
اولا نقوم بتنصيب البرنامج الخاص بها
ثم
هل تتذكرون الــ class التي قمنا بتصميمها؟
سنضيف اليها دالتان للتشفير احداهما لكود التسجيل والاخري لكود التفعيل
اول دالة هتعتمد علي طريقة الــ blowfish وهي طريقة فعالة لتشفير النصوص
كود:
Function cryp2(ByVal inp As String, ByVal i As Integer) As String
Dim crypt As New Chilkat.Crypt2()
Dim success As Boolean
success = crypt.UnlockComponent("Anything for 30-day trial")
crypt.CryptAlgorithm = "blowfish2"
' CipherMode may be "ecb", "cbc", or "cfb"
crypt.CipherMode = "cbc"
' KeyLength (in bits) may be a number between 32 and 448.
' 128-bits is usually sufficient. The KeyLength must be a
' multiple of 8.
crypt.KeyLength = 128
' The padding scheme determines the contents of the bytes
' that are added to pad the result to a multiple of the
' encryption algorithm's block size. Blowfish has a block
' size of 8 bytes, so encrypted output is always
' a multiple of 8.
crypt.PaddingScheme = 0
' EncodingMode specifies the encoding of the output for
' encryption, and the input for decryption.
' It may be "hex", "url", "base64", or "quoted-printable".
crypt.EncodingMode = "hex"
' An initialization vector is required if using CBC or CFB modes.
' ECB mode does not use an IV.
' The length of the IV is equal to the algorithm's block size.
' It is NOT equal to the length of the key.
Dim ivHex As String
ivHex = "0001020304050607"
crypt.SetEncodedIV(ivHex, "hex")
' The secret key must equal the size of the key. For
' 256-bit encryption, the binary secret key is 32 bytes.
' For 128-bit encryption, the binary secret key is 16 bytes.
Dim keyHex As String
keyHex = "000102030405060708090A0B0C0D0E0F"
crypt.SetEncodedKey(keyHex, "hex")
If i = 0 Then
Return (crypt.EncryptStringENC(inp))
Else
Return (crypt.DecryptStringENC(inp))
End If
End Function
فكما نلاحظ ان هذه الدالة تستقبل متغيران احداهما i
وهو كدليل استخدمته لكي اخبر الدالة ان النص القادم لها اما مشفر ويحتاج
لفك التشفير (عندما تكون i ب 1) او ان النص القادم لها حقيقي ويحتاج الي
تشفير (عندما تكون i ب 0)
والمتغير الاخر str هو النص القادم للدالة
اظن اللعبة وضحت؟؟
يبقي في كود البرنامج نفسه كود:
dim c as new protect
dim s as string
s=c.getserial
dim es as string =c.cryp2(s,0)
وبكده يكون النص الناتج في es هو ناتج تشفير رقم مسلسل الهارد
طيب يفضل سؤال -لو كانت طريقة التشفير ثابتة يبقي اي حد هيقرأ الموضوع ده يقدر بكل سهولة يكسره
صح
لكن ركزوا في السطر ده من الدالة cryp2 كود:
keyHex = "000102030405060708090A0B0C0D0E0F"
الرقم ده بال hex ممكن نغيره لاي رقم عاوزينه وهيكون
ده المفتاح الخاص بينا وطبعا وقتها مش ممكن حد يعرف افتراضك للرقم ده ايه
بس المهم ان الرقم ده هو مفتاح سر التشفير
طريقة التشفير الثانية
الدالة
كود:
Function crypt_file(ByVal inp As String, ByVal i As Integer) As String
Dim crypt2 As New Chilkat.Crypt2()
crypt2.UnlockComponent("anything for 30-day trial")
crypt2.CryptAlgorithm = "aes"
crypt2.EncodingMode = "base64"
crypt2.KeyLength = 128
crypt2.SecretKey = crypt2.GenerateSecretKey("jsa2jack1@1!")
If i = 0 Then
Return (crypt2.EncryptStringENC(inp))
Else
Return (crypt2.DecryptStringENC(inp))
End If
End Function
وطبعا مش هشرح كتير لانها مثل السابقة تماما فقط تختلف طريقة التشفير المسمي هنا بــ AES وتستخدم i كدليل للتشفير او فك التشفير
والسطر
crypt2.SecretKey = crypt2.GenerateSecretKey("jsa2jack1@1!")
يمكن تغيير قيمته كما تشاؤون وهو من النوع النصي وسيكون هذا هو ايضا مفتاح الشفرة الثانية
الطريقتان السابقتان تعتمدان علي تقنية الــ salt في التشفير وعدد
المحاولات اللازم لفك هاتان الشفرتان هو قاموس يحتوي علي 85*10^35 كلمة اي
ما يعدل 8 شهور متواصل من العمل علي الحاسب لفك مفتاح
الشفرة!!!!!!!!!!!!!!!!!
والباقي في البرنامج طبعا عليكم
يبقي ملحوظة اخوية اخيرة للمبرمجين
لا تربطوا النسخة التجريبية لبرنامج بساعة الحاسب فهو اسلوب فاشل ولكن ان
اصررتم فهناك طريقة واحدة للحماية وهي ان تجعلوا برنامجكم يسجل كل مرة يغلق
بها وقت وتاريخ الاغلاق لتتأكدوا ان المستخدم لم يعبث في ساعة الحاسب
لإطالة النسخة التجريبية
اما عن رأيي الشخصي فأفضل اللجوء الي الــ timer وتكون النسخة تجريبية ل
مثلا 20 ساعة عمل ويسجل الــ timer كل دقيقة الوقت المستنفذ الحالي
المكتبتان مرفقتان روابط تحميلهما في الموضوع وتابعوني لان الموضوع مازال
كبيرا فمكتبة chilkat بها مميزات لا حصر لها ولكن الي الان اترككم تستمتعوا
بها