السلام عليكم
على إختلاف أنواع حماية البرامج ،
هل من الممكن أن نختصر الوقت والجهد (بدل دراسة الخوارزميات) أن نبحث عن القفزة التي تغير مسار البرنامج (و التي تأتي بعد مقارنة CMP) ؟
:rolleyes:
بانتظاركم :D
السلام عليكم
على إختلاف أنواع حماية البرامج ،
هل من الممكن أن نختصر الوقت والجهد (بدل دراسة الخوارزميات) أن نبحث عن القفزة التي تغير مسار البرنامج (و التي تأتي بعد مقارنة CMP) ؟
:rolleyes:
بانتظاركم :D
أخي سوف تبكي عليك العيون * * * وتـسـأل عـنك دمـوع المـئـين
فإن جف دمعي سيبكي الغمام * * * يـرصـع قـبرك بــالـياسـمـيـن
أخـي مـا يـأسـنـا ولـن نيـأسـا * * * وما طال في القلب لبث الأسى
ومـا حـل أفــئــدة الــمــــؤمـن * * * سـوى أمـل في الـجنـان رسـى
أخي فانتظر ولتعش في غـد * * * سـيـنـبـثـق الأمـل الـسـرمـد
فـإن مـزقـتـنـا سني الــحـيـاة * * * فإنـا مع الـنصـر فـي مـوعــد
الخوارزميات الضعيفة هي التي تستخدم مقارنة مثلاً سلسلة حرفية باخري CMP و من ثم JMP ، هناك خوازرميات اقوي تعتمد علي العشوائية ...
BEng , Electronics and communications.
Embedded systems engineer.
Graphics Programmer
عالم الكومبيوتر هو من لديه المعرفة في علوم الكومبيوتر ، الرياضيات ، هندسة الالكترونيات -احمد صالح
نعم هذا صحيح ، لكن
أليس في الأخير سنصل لـ
إقفز أولا تقفز !!!
وعندها أعكس الشرط كي تكسر الحماية !
أخي سوف تبكي عليك العيون * * * وتـسـأل عـنك دمـوع المـئـين
فإن جف دمعي سيبكي الغمام * * * يـرصـع قـبرك بــالـياسـمـيـن
أخـي مـا يـأسـنـا ولـن نيـأسـا * * * وما طال في القلب لبث الأسى
ومـا حـل أفــئــدة الــمــــؤمـن * * * سـوى أمـل في الـجنـان رسـى
أخي فانتظر ولتعش في غـد * * * سـيـنـبـثـق الأمـل الـسـرمـد
فـإن مـزقـتـنـا سني الــحـيـاة * * * فإنـا مع الـنصـر فـي مـوعــد
اليس البحث عن مكان القفز هو اشهر طريقة لعمل الكراك من الأصل؟
عموما اتصور انه احيانا تكون هناك العديد من اوامر القفز و من الصعوبة اكتشافها جميعها.
كما ان دراسة الخوارزميات مفيدة لعمل keygen
السلام عليكم ورحمة الله وبركاته
ربما كان هذا صحيح في البرامج القديمة
أو في بعض البرامج الحالية لمبرمجين هواة أو مبتدئين
لكن هل تعتبر هذه حماية ؟
المشرفين مشرفين :)
أخي / DeltaAziz
حتى لو تكلمنا على حماية الدنجل مثلاً .
أليس هناك نقطة (اختبار وجود الدنجل) وسيكون القرار عندها ، أقفز أو لا تقفز ؟
أخي سوف تبكي عليك العيون * * * وتـسـأل عـنك دمـوع المـئـين
فإن جف دمعي سيبكي الغمام * * * يـرصـع قـبرك بــالـياسـمـيـن
أخـي مـا يـأسـنـا ولـن نيـأسـا * * * وما طال في القلب لبث الأسى
ومـا حـل أفــئــدة الــمــــؤمـن * * * سـوى أمـل في الـجنـان رسـى
أخي فانتظر ولتعش في غـد * * * سـيـنـبـثـق الأمـل الـسـرمـد
فـإن مـزقـتـنـا سني الــحـيـاة * * * فإنـا مع الـنصـر فـي مـوعــد
يمكن لكن يوجد أشياء أخرى
لوكانت الحماية تنحصر فقط بوجود Dongle فاأمر مقضي
وهذا سوء إستخدام هذه الحماية الفيزيائية
أعطيك مثال:
صديق لي له برنامج محمي ب Dongle
في حالة عدم وجوده لا يعمل، أعطاني البرنامج
قمن بتجربته، وبعد حوالي 30 دقيقة عمل البرنامج من دون أي مشكل و بدون Dongle
وكان هذا بسبب الأستخدام السيئ أو غير المجدي...
بعدها تحدثت مع صديقي وتحدثنا قليلا،
بعد أشهر كانت هناك نسخة جديدة أحسن بكثير:
لب المعلومات الأساسية للبرنامج مشفرة بخواريزمية تتغير مع الوقت مفتاحها موجود ب Dongle و بهارات :wacko:
لم أستطع كسرها لأن تحليلها يتطلب وقت طويل و ليس لدي وقت و أهم شيئ لست خبير بالميدان B)
لكن يمكن كسرها و لا علاقة للأمر بتغيير JMP بعد CMP كما ترى في هذا المثال البسيط
أخي MSVS
بكل تأكيد جميع الحمايات تعتمد على المقارنة سواءاً في الخوارزميات القوية أو الضعيفة وسواءاً كانت الحماية برمجية أو صلبة لابد من وجود مقارنة لكن ليس يالضروري عملية القفز...فمثلا يمكنك تجاهل استدعاء دالة او حذف روتين بأكمله :)
لكن نرجع لعملية المقارنة :)
كلامك 100%
تحياتي لك
خالد
كلامك جميل أخي / خالد الصالح
فإذا اتفقنا على ما سبق ، كيف نصل لذلك السطر الذي يتغير فيه مجرى البرنامج ؟
ما هي الخيارات المطروحة للوصول لتلك النقطة ؟
عن نفسي :
1 - اتتبع الشاشة التي تعرض عدم إمكانية استخدام البرنامج بالبحث عن عنوان النافذة أو محتوى الرسالة ، ثم اتابع قراء البرنامج بشكل عكسي و انظر لكل تعليمة مقارنة أو تعليمة قفز .
2 - اتابع الدالة LoadLibraryA و انظر للملفات التي يتم تحميلها وقت التنفيذ ، و أخر ملف تم تحميله هو الذي يحوي (غالباً) على الاختبار .
3 - ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟
هل من الممكن أن تزودوننا بطرق أخرى !
و شكراً لكم ،،
أخي سوف تبكي عليك العيون * * * وتـسـأل عـنك دمـوع المـئـين
فإن جف دمعي سيبكي الغمام * * * يـرصـع قـبرك بــالـياسـمـيـن
أخـي مـا يـأسـنـا ولـن نيـأسـا * * * وما طال في القلب لبث الأسى
ومـا حـل أفــئــدة الــمــــؤمـن * * * سـوى أمـل في الـجنـان رسـى
أخي فانتظر ولتعش في غـد * * * سـيـنـبـثـق الأمـل الـسـرمـد
فـإن مـزقـتـنـا سني الــحـيـاة * * * فإنـا مع الـنصـر فـي مـوعــد
اقتباسLoadLibraryA و انظر للملفات التي يتم تحميلها وقت التنفيذ ، و أخر ملف تم تحميله هو الذي يحوي (غالباً) على الاختبار
ما علاقة هذه الدالة بالحماية ان لم تكن موجودة في ملف dll وتم استدعاؤها مباشرة منه؟
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
أقصد إن كانت الحماية في ملف dll خارج البرنامج ، فاتابع الملفات التي تم تحميلها عبر الدالة LoadLibraryA
أخي سوف تبكي عليك العيون * * * وتـسـأل عـنك دمـوع المـئـين
فإن جف دمعي سيبكي الغمام * * * يـرصـع قـبرك بــالـياسـمـيـن
أخـي مـا يـأسـنـا ولـن نيـأسـا * * * وما طال في القلب لبث الأسى
ومـا حـل أفــئــدة الــمــــؤمـن * * * سـوى أمـل في الـجنـان رسـى
أخي فانتظر ولتعش في غـد * * * سـيـنـبـثـق الأمـل الـسـرمـد
فـإن مـزقـتـنـا سني الــحـيـاة * * * فإنـا مع الـنصـر فـي مـوعــد
كلام جميل ومنطقي لكن ان قمت بالضبط بتحديد الملف المسؤول عن الدالة وعن الدالة المسؤولة عن الحماية لم لا تهاجم الملف المسؤول! قم بالتعديل فيه, اكتب, احذف, عدّل واحصل على حمايتك الخاصة :D
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
:)
"فإذا اتفقنا على ما سبق ، كيف نصل لذلك السطر الذي يتغير فيه مجرى البرنامج ؟"
هذا يعتمد على خبرتك :)
هذا الموضوع حساس وخاصة في منتديات الفريق العربي بلاش تورطنا مع البشوات
ولا يهم تحميل اي مكتبة كما ذكر اخي Xacker
المهم هو تحديد مكان الروتين الخاص بالحماية .وهذا بسيط جدا لو انت متمكن من الشغلة :D
تحياتي لك
تم تعديل هذه المشاركة بواسطة خالد الصالح في 9 يناير 2006 في 00:32
خالد الصالح كتب:هذا الموضوع حساس وخاصة في منتديات الفريق العربي بلاش تورطنا مع البشوات
لا أظنه بهذه الحساسية ، فالعالم قد تغير .
الآن في الأسواق يباع كتاب ( قراصنة البرمج بلا أقنعة ) من إصدارات دار شعاع (على فكرة أنا مفتون بإصداراتها) تجده عند مكتبة جرير .
يشرح لك كيفية كسر البرامج خطوة خطوة بالأمثلة ، بل إن السيدي المرفق معه فيه برامج مثل Olly و IDA و SmartCheck و Hex
إضافة لملفات برامج يطبق عليها الدروس .
أما منتدانا الحبيب فلا أظنه يمانع من تعلم هذه الأمور بدليل بقاء هذا الموضوع ، إنما هو يمنع وضع الكراكات ، وهذه سياسة المضيف .
على العموم ، هل من طرق لتحديد روتين الحماية ؟
خذ هذا المثال :
عندي برنامج بعد أن إنتهت مدته التجريبية يظهر زر تنفيذ البرنامج غير ممكن .
سويت فيها فاهم و حطيت نقطة إيقاف عند الدالة EnableWindow في المكتبة User و بعدين عدلت الباراميتر من False إلى True و عندما أعدت تشغيل البرنامج أصبح الزر ممكناً طبعاً الفرحة ما توصف :D لأنها تلاشت بسرعة بعدما نقرت على الزر فإذا بالبرنامج ينتهي :(
أكتشفت عندها أن البرنامج له أكثر من حماية حتى الآن :
1- عدم تمكين زر تشغيل البرنامج .
2- هناك إجراء يتحقق من الفترة الزمنية .
الحماية الأولي حلها أن نراقب الدالة EnableWindow أو أن نحل الحماية الثانية فتحل هذه المشكلة .
الحماية الثانية ، ما هي الطريقة لحلها ؟
هل نراقب مثلاً دالة القراءة من الرجستري ؟
أو دالة القراءة من القرص الصلب ؟
أو أن هناك طرق أخرى ؟
تم تعديل هذه المشاركة بواسطة MSVS في 9 يناير 2006 في 07:13
أخي سوف تبكي عليك العيون * * * وتـسـأل عـنك دمـوع المـئـين
فإن جف دمعي سيبكي الغمام * * * يـرصـع قـبرك بــالـياسـمـيـن
أخـي مـا يـأسـنـا ولـن نيـأسـا * * * وما طال في القلب لبث الأسى
ومـا حـل أفــئــدة الــمــــؤمـن * * * سـوى أمـل في الـجنـان رسـى
أخي فانتظر ولتعش في غـد * * * سـيـنـبـثـق الأمـل الـسـرمـد
فـإن مـزقـتـنـا سني الــحـيـاة * * * فإنـا مع الـنصـر فـي مـوعــد
وما الذي يجعلك تعتقد ان الحماية الثانية هي في التحقق من وقت تشغيل البرنامج؟
لم لا تكون الحماية تتمثل مثلا في التحقق من تفعيل الزر, او كما ذكرت من وجود قيمة ما مخزنة في الريجستري او على القرص.. استخدم filemon و regmon لتحديد فيما اذا كان هناك شئ ما يتعلق بالريجستري او بالقرص يتم قراءته وقت النقر على الزر...
امثلة الكتاب الذي ذكرت لا باس بها لكن هناك بعض الفصول تعتبر اهم ما فيه ولربما الوحيدة التي تفيد في حالة البحث عن حالة معينة وهي الفصول الاخيرة المتعلقة بامور الـ anti-debug .. باي حال هل الملف الذي تعمل عليه كبير في الحجم؟ ارسلي رابط له ان كان بامكانك تحميله او موجود على الانترنيت وسنرى ما بالامكان عمله (لاغراض تعليمية :rolleyes: )
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
الكتاب الذي ذكرته جيد ..لكن لا يشبع رغبات المهوسون لتعلم طرق كسر الحماية...
بالنسبة لبرنامجك الذي تحاول كسرة فمن الواضح انه يتحقق من القيم عند بداية التشغيل...لذا يجب عليك التأكد اين يتم وضع القيم ؟ إما في الرجستري أو في احد الملفات..استخدم البرامج اللازمة لذلك كما ذكر اخي Xacker
تحياتي لك
خالد الصالح كتب:أخي MSVSبكل تأكيد جميع الحمايات تعتمد على المقارنة سواءاً في الخوارزميات القوية أو الضعيفة وسواءاً كانت الحماية برمجية أو صلبة لابد من وجود مقارنة لكن ليس يالضروري عملية القفز...فمثلا يمكنك تجاهل استدعاء دالة او حذف روتين بأكمله :)
لكن نرجع لعملية المقارنة :)
كلامك 100%
تحياتي لك
خالد
مع إحترامي لك أخي خالد
الأمر ليس صحيح 100%
لا تعتمد المقارنة فقط
رجعت وقلت "لا تعتمد المقارنة فقط "
انت قلت فقط....اذا لابد من وجود مقارنه :D
عزيزي جميع البرمجيات تعمل بـ صفر وواحد (. ،1) حتى الأجهزة وذلك في البوابات المنطقية
اذن يوجد هناك True أو False ما رأيك ؟
هل يوجد الآن مقارنة ؟
ومهما عملت من خوارزميات واستخدام دوال بغية حماية برنامجك ...في النهاية ستستخدم If :)
وما دام لديك حماية لا تعتمد على المقارنة ...ضع لها مثال هنا ..وحتما سنجد مقارنه بمحتواها
تحياتي لك
تم تعديل هذه المشاركة بواسطة خالد الصالح في 9 يناير 2006 في 17:55
بسم الله الرحمن الرحيم
كل عام وانتم بخير ومن العايدين قبل الزحمة
في الحقيقة مناقشة جميلة وجادة لمشكلة فنية عادة ما يختلف فيها وتتباين الأراء.
وتحتاج إلى تفصيل بسيط حتى تتضح بعض نقاط الاختلاف.
بالفعل أغلب الحمايات تعتمد على المقارنة بطريقة واحدة أو متعددة داخل البرنامج وعادة هذه الحمايات بسيطة وغير فاعلة وقد تكون مشهورة.
لاحظ هنا ذكرت كلمة " أغلب " وليس " كل " أي أن هناك حمايات تختلف جزئيا أو كلياً.
نأتي للتفصيل بشكل مبسط.
حمايات تختلف جزئياً:
هو أن تعتمد على تشفير البرنامج باستخدام خوارزميات معينة وتتأكد من صحة "Hash" المفتاح بطريقة المقارنة وهنا حتى لو تم تجاوز المقارنة فلن يتم تجاوز الحماية وقد يتعطل البرنامج بشكل كبير. وهنا لابد من الحصول على المفتاح حتى يتم كسر البرنامج. ولاحظ هنا تم استخدام المقارنة ولكن ليست ذات أهمية ولكن للتأكد من صحة فك تشفير البرنامج "Data Integrity". وهناك طرق اخرى قد تختلف بعض الشي عن هذه الطريقة. وهذه الطريقة اصبحت بشكل كبير تستخدم.
حمايات تختلف كلياً:
وهنا قد لا يتم استخدام المقارنة بالكلية. حيث يتم استخدام تقنيات متقدمة ومنها استخدام التشفير بحيث يتم فك أجزاء من البرنامج عند الحاجة دون استخدام المقارنة نهائيا وتسمى "Code Block Encryption" وتجدها في الحمايات مثل AsProtect وغيرها التي تدعم هذه التقنية وهناك طريقة تسمى الـ "Code Morphing" وهي طريقة جهنمية لإخفاء معالم البرنامج وتحويلة إلى صيغة اخرى يكون فيها شكل المقارنة عمليات حسابية وحينها تكون تتبع المقارنة شبه مستحيلة وغيرها من التقنيات. وتجد تطبيق فعلي لهذا الجزء في حماية LaserLock الجديدة وقد تجده في حمايات أخرى.
إضافة إلى ذلك اصبحت المترجمات "Compilers" بشكل كبير تتجنب المقارنة والقفز ليس لدعم حماية البرنامج ولكن لكي تقلل بشكل كبير "Pipe line hits" داخل المعالج وبالتالي تسريع العمليات الحسابية فهي عصفورين بحجر واحد تقليل المقارنات وبالتالي تعقيد عملية التجاوز وكذلك تسريع البرنامج.
أما فيما يخص طريقة الدنقل فهناك طريقتان لعمل الحماية وقد تجتمع في برنامج واحد وهي:
1) طريقة الغلاف أو الدرع أو المظروف وهي تشفير المنتج بمفاتيح موجودة في الدنقل وهنا استخدام طريقة تجاوز المقارنة لا نفع فيها حيث لن تصل لشيء واشهر هذه الحمايات هي HASP Envelope و Sentinel Shell ولا بد من وجود الدنقل لتجاوزها وقد تستطيع بدونها ولكن تحتاج إلى وقت وجهد وخبرة حتى يتم فك التشفير. ميزة هذه الحماية لا تحتاج تدخل من المبرمج فقط تستخدم أداة من الشركة لتشفير الملف التنفيذي مع وجود الدنقل ويتم انتاج ملف جديد مغلف بالحماية.
2) طريقة المطورين وهي التعامل من الدنقل بشكل مباشر وبرمجي في نفس الوقت وهنا تأتي الخبرة في تفعيل واستخدام طرق التخاطب بحيث لا يتم كسر المنتج بشكل بسيط مثلا تجاوز مقارنة. وهنا إذا تم تفعيل التخاطب وتنويعه بشكل كبير قد يتعذر تجاوز الحماية دون وجود الدنقل بل قد لا تستطيع تجاوزها حتى بوجود الدنقل مالم يتم تحليل البرنامج بشكل كامل وفحصة من وجود تخاطب مع الدنقل مخفي بطريقة فنية بحته لا يتم استخدامها إلا بعد عمل البرنامج بساعة أو عدة تنفيذات أو غيرها من الطرق المعتادة.
هذا والله اعلم
أخوكم
عطية بن زيد
"بالفعل أغلب الحمايات تعتمد على المقارنة بطريقة واحدة أو متعددة داخل البرنامج وعادة هذه الحمايات بسيطة وغير فاعلة وقد تكون مشهورة."
"أغلب"
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
أذكر أحد الإخوة عمل حماية تعتمد على حدوث خطأ في المتغير ، كالتالي :
يعلن عن متغير بحجم بايت .
عند إدخال القيمة يقوم بعمليات حسابية (طرح و جمع و رفع للأس) .
فإذا كانت القيمة المدخلة خاطئة (عدد أكبر من 256 = 1 بايت) يحدث خطأ تحميل زائد للمتغير مما ينقل التنفيذ إلى مصيدة الأخطاء تلقائياً .
أما إن كانت القيمة صحيحة فسيكمل البرنامج عمله .
ما رأيكم :
هل في هذه الحالة اعتمدنا على المقارنة و القفز ، أم لا ؟
أخي سوف تبكي عليك العيون * * * وتـسـأل عـنك دمـوع المـئـين
فإن جف دمعي سيبكي الغمام * * * يـرصـع قـبرك بــالـياسـمـيـن
أخـي مـا يـأسـنـا ولـن نيـأسـا * * * وما طال في القلب لبث الأسى
ومـا حـل أفــئــدة الــمــــؤمـن * * * سـوى أمـل في الـجنـان رسـى
أخي فانتظر ولتعش في غـد * * * سـيـنـبـثـق الأمـل الـسـرمـد
فـإن مـزقـتـنـا سني الــحـيـاة * * * فإنـا مع الـنصـر فـي مـوعــد
نعم استخدمنا مقارنة ...حتى في معرض رسالتك قلت "فإذا كانت القيمة" جملة شرطية
انا إلى هنا توقفت واترك المجال لغيري
تحياتي لكم جميعا
السلام عليكم ورحمة الله وبركاته ...
أكثر من مرة يفتح نقاش حول الحماية ولا اطرح تعليقي حول هذه النقطة - استخدام الجمل الشرطية وعمليات المقارنة في الكشف عن صحة السيريال - كل مرة افكر في طرح مثال وكل مرة أنسى كتابة المثال وانسى الموضوع كله , ولكن بعد هذا التعليق الرائع
كتبت مثال بسيط بالسي++ يوضح الفكرة التي جائت ليعطية بن زيد كتب:حمايات تختلف كلياً:وهنا قد لا يتم استخدام المقارنة بالكلية. حيث يتم استخدام تقنيات متقدمة ومنها استخدام التشفير بحيث يتم فك أجزاء من البرنامج عند الحاجة دون استخدام المقارنة نهائيا وتسمى "Code Block Encryption" وتجدها في الحمايات مثل AsProtect وغيرها التي تدعم هذه التقنية وهناك طريقة تسمى الـ "Code Morphing" وهي طريقة جهنمية لإخفاء معالم البرنامج وتحويلة إلى صيغة اخرى يكون فيها شكل المقارنة عمليات حسابية وحينها تكون تتبع المقارنة شبه مستحيلة وغيرها من التقنيات. وتجد تطبيق فعلي لهذا الجزء في حماية LaserLock الجديدة وقد تجده في حمايات أخرى.
المثال:
#include <iostream>
using namespace std;
typedef void (*MYPROC)(void);
void bad(void) {
cout << "[*] Bad Serial Number.." << endl;
}
void good(void) {
cout << "[*] Good Serial Number.." << endl;
}
void ff(void) {
cout << "[*] Another Function.." << endl;
}
int main(void) {
unsigned long SN;
cout << "[*] Good = " << hex << &good << endl;
cout << "[*] Bad = " << hex << &bad << endl;
cout << "[*] FF = " << hex << &ff << endl;
cout << "[*] Main = " << hex << &main << endl;
MYPROC MyFun = (MYPROC) &bad;
cout << "[*] My Function Point To " << hex << MyFun << endl;
cout << "Enter Your Serial Number: ";
cin >> hex >> SN;
*((unsigned long*) &MyFun) += SN;
cout << "[*] My Function Point To " << hex << MyFun << endl;
MyFun();
return 0;
}كما يتضح , لا توجد أي اختبارات أو جمل شرطية , ومع هذا سيتم تنفيذ البرنامج بصورة صحيحة فقط مع السيريال الصحيح
طبعا هنا المثال مباشر , ولكن يمكن لف ودوران الفكرة ووضع جمل شرطية - للتمويه :P - وعمليات حسابية معقدة على السيريال للحصول على القيمة المطلوبة