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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

في برامج الدوت نت, يمكن الحصول على الكود بسهولة باستخدام ال .NET Reflector, و حتى بعد عمل تشويش للكود باستخدام Dotfuscator على سبيل المثال يمكن كسر البرنامج بسهولة.

طبعاً هناك الكثير من الخدع لمنع فتح البرنامج ب Reflector و هناك خدع مضادة لتجاوز ذلك, يعني هي لعبة القط و الفأر.

طبعاً الكراكر ليس جميعهم بنفس الخبرة, لذلك مهمتي كمبرمج أن أمنع كسر برنامجي على الأقل من الكراكر المبتدأ.

في حال كان البرنامج Win32 اي ليس MSIL سوف يكون كسره أصعب من برامج الدوت نت, ولكن في النهاية كل شيئ يمكن كسره, هناك صديق قديم قال لي بهذا الخصوص: قطرة الماء تثقب الحجر لا بالعنف ولكن بتكرار المحاولة.

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

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

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

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

سأضرب مثالا :

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

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

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

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

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

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

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

وهكذا

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

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

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

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

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

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

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