فكرة | طريقة حماية البرامج تعتمد على التضليل والتشويه لتشتيت كاسري الحماية

هي فكرة خطرت لي منذ مدة ولكن لم أدخلها حيز التنفيذ بعد

والآن قلت أطرحها عليكم من باب معرفة إن كانت نافعة أم لا

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

أو يعتمدون على تتبع دوال الفحص أو القراءة أو أي شيء يكون مخصص لمسألة الحماية

أما الفكرة التي خطرت لي والتي اعتمدت على شيء يتجاوز النقاط السابقة أي شيء يبعد خيوط البداية عن الهاكر

أولا لن يكون هناك أي نافذة خاصة لإشعار المستخدم بأن النسخة غير مرخصة ولكن ستكون مع شاشة البداية للبرنامج عبارة تظهر دائما

سواء كانت مرخصة أم لا حتى نبعد مسألة الشرط والفحص عن يد الهاكر

والرسالة تقول :

إن وجدت ان البرنامج لا يعمل بشكل سليم فاعلم أنها غير مرخصة

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

كيف ستتم الحماية

هي بزرع أكواد فحص عادية موزعة على أجزاء البرنامج و في أكثر الدوال المتكرر بحيث يتم فحص جزء من الرقم التسلسلي

مثلا مع بداية البرنامج نحاول قراءة الرقم الأول ونحتفظ بالنتيجة ونكمل سير العمل وبعد قليل في دالة ثانية نقرأ جزء آخر من الرقم ونحتفظ بالنتيجة

وهكذا بعد عدة عمليات نكون قد كونا نتيجة هل الرقم صحيح أم لا

في حال كان الرقم صحيحا نكمل البرنامج طبيعي

وفي حال اكتشاف أنه خاطيء لا نقوم بأي ردة فعل أي لا رسالة و لا نافذة ولا إغلاق للبرنامج ولا شيء ونبقي سير البرنامج كما هو

الآن وأثناء العمل وعند المرور بدوال تتكرر أو تستخدم بشكل كبير ونحن محتفظين بنتيجة الفحص

كلما دخلنا لدالة وكانت نتيجة الفحص أنه غير مرخص نحاول تشويه النتائج

فمثلا نحن نقوم بعملية حسابية سواء برنامج محاسبة أو رسوم أو ألعاب نحاول تشويه النتيجة بأن نضرب او نقسم أو نجمع أعداد عشوائية

ونجعل هذا الأمر في كثير من المراحل مما يجعل البرنامج غير المرخص عديم الفائدة

ويستحيل على الهاكر معرفة جميع الأكواد المزروعة سواء للفحص أو التشويه لأنه مشابهة وموزعة مع الأكواد العادية

وبهذا نكون قد حمينا البرنامج بتعطيل منفعته

هذا هو أساس الفكرة وقد طرحته لنستأنس بالأراء المختلفة وإمكانية التطبيق وهل يوجد إيجابيات أو سلبيات وما هي المخاطر التي تنتج عن هذه الطريقة

وهل حقا يمكن كسرها وجعل البرنامج صالح.


التعليق السابق

صحيح ، ومن هذا المنطلق أتت الفكرة ولهذا ذكرت في العنوان عبارة - لتشتيت وليس لمنع - أي أني مقر أنه لن يكون هناك حماية مطلقة ولكن الفكرة تكمن في المراوغة والتمويه والتشتيت تماما كما تفعل الحرباء أي نحاول جعل أكواد الفحص و من ثم استخدامها موزعة بشكل طبيعي وبأكواد عادية لا تثير الشبهة

وتكون مقسمة وموزعة ولا تعتمد على سيناريو ثابت أو تسلسل متكرر بنفس الطريقة

فمثلا أحاول مرة وضع جزء الفحص في بداية الدالة ومرة في وسطها ومرة في النهاية

ولا أجعلها تفحص في كل مرة يدخل الدالة وإنما أربطها بشيء متغير إما رقم عشوائي أو مثلا حسب النتيجة

سأضرب مثالا :

لنفرض لدي دالة تحضر قيمة فاتورة فأجعل بعدها عملية فحص لهذه القيمة إن كانت مثلا أكبر من 1000 استدعي دالة الفحص وإلا لا أستدعي

أو مثلا أفحص باقي القسمة على 100 من هذه القيمة فإن كانت أكبر من 50 أفحص وإلا أتجاهل

وطبعا دالة الفحص يجب أن تذهب وكأنها تحضر معلومة خاصة لاستكمال اجراء الفاتورة فتحضر جزء من الرقم التسلسلي وتحتفظ به من أجل عملية الفحص التالية

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

كما أننا نحاول الاحتفاظ بطريقة الفحص ضمن تدفق النتائج وليس في بارمتر مستقل

كمثال أريد أن أحضر قيمة حسابية ما فقبل الفحص اجمع لها رقم ما وليكن س ثم بعد عملية الفحص اجمع النتيجة إلى المجموع السابق

وبعد المرور بعدة عمليات وقبل أن استخدم الناتج من العملية الحسابية أقوم بإنقاص العدد س فإن كان الناتج مطابق للناتج الأصلي إذا قيمة الفحص 0 وإلا فهي 1

وهكذا

هذه الطريقة قد تؤثر بشكل كبير على نظافة الكود البرمجي, و قد تصعب كثيراً من عملية ال Debug في حال كان هناك فعلاً مشكلة في البرنامج, و إيضاً ماذا تفعل للزبائن الذين يريدون اختبار برنامجك و تقييمه؟ كما ذكر الاخ MaGiC44

في حال سنعتمد هذه الطريقة فالتجريب لن يكون بنسخة كاملة مع مؤقت زمني وإنما بنسخة مسحوب منها بعض العمليات العملية كالطباعة مثلا .

أو يجب التفكير بفكرة أخرى لمسألة التجريب

أما بالنسبة للكود والتنقيح فلا شك أن برنامج يحتاج إلى حماية يجب أن يكون هناك تضحية في مسألة الكود والتتبع

في هذه الحالة يقوم المخترق "بتشريت" دالة الفحص بجعلها تبدأ ب return true; هكذا

def is_valid():
   return true;
   real_check();

وهذا من السهل جدا عمله