Uncategorized

كيف يتم تهكير التطبيقات المدفوعة؟

أى كود تقوم بكتابته يحتاج إلى أن يتم تحويله إلى لغة الالة حتى يتمكن جهاز الكمبيوتر من تشغيله، هذا التحويل يقوم به الـ Compiler وينتج عنه الشكل التالى

ان ما تراه أمامك هنا هو جزء بسيط من الـ Machine code للعبة Minesweeper فى Windows 7 (أزواج الأرقام والحروف المكتوبة باللون الأخضر فى منتصف الصورة بالأعلى هى فى الواقع جزء من مجموعة الأوامر التى يقوم المعالج بتنفيذها عندما تقوم بتشغيل هذه اللعبة)

ولكن بالتأكيد يصعب كثيرا على البشر التعامل مع كل هذا الكم الهائل من الأرقام، لذلك يتم استخدام ما يسمى بالـ Disassembler وهو برنامج يعمل على تحويل هذه الأرقام إلى لغة الـ Assembly وهى لغة بسيطة جدا تمثل الـ machine code قى شكل أوامر نصية بسيطة حيث لا يمكنك كتابة أكثر من أمر واحد فى كل سطر لكى يسهل على البشر استيعاب معنى هذه الأرقام الكثيرة.
ولكى ترى الفرق بين الـ Machine language والـ Assembly language فهذا هو كود الاسمبلى لنفس مجموعة الأرقام من الصورة السابقة

وبالرغم من الفرق الشاسع بين الاثنين، فإن التعامل مع لغة بسيطة بهذا المنظر لفهم أى برنامج بسيط ليس أمرا سهلا على الاطلاق، لذلك نلجأ إلى تمثيل أجزاء كود الـ Assembly فى شكل Blocks لكى نحصل على ما يسمى بالـ Execution graphs وهى كما ترى فى الصورة التالية تسهل كثيرا من عملية تحليل الكود حيث انها تمثل الـ conditional branching بشكل بصرى يسهل على البشر فهمه بسهولة

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

أو يمكنك أن تقوم فقط بالبحث عن الـ Block التى يتم فيها عمل الـ License check للبرنامج ثم عكس الـ Condition لكى يقوم البرنامج بالعمل فى حالة عدم وجود valid license.

هذا مثلا مثال بسيط على كود لبرنامج يقوم بالتحقق من الـ License قبل أن يبدأ العمل، وإذا لم يجد أى Valid license، فإنه سوف يغلق نفسه ولن يعمل.

عندما نلقى نظرة على الـ Execution graph لهذا البرنامج سوف نجد الشكل التالى

فى أول Block يقوم البرنامج بالتحقق من الـ License عن طريق نداء الـ Function المسماه isLicenseValid ثم التأكد مما اذا كان ناتجها يساوى true فى السطر الأخير من أول Block

حيث ان jnz هو أمر فى لغة الـ Assembly ويعنى Jump If Not Zero و loc_4013D9 هو عنوان الـ Block التى على اليمين. فيكون معنى هذا السطر هو اذا كان الناتج لا يساوى الصفر، فاذهب إلى الـ Block اليمنى. أما اذا لم يتحقق الشرط فان البرنامج سوف يستمر فى طريقه إلى الـ Block التى على اليسار والخروج من البرنامج.

حسنا اذا، بما أن الأمر jnz هو المسؤول عن المسار الذى سوف يتخذه البرنامج بعد الـ License check فبمكننا بكل بساطة أن نفعل شيئا ذكيا للغاية وفى منتهى البساطة فى نفس الوقت.

بما أن معنى jnz هو (jump if not zero) اذا فعكس هذه العملية هو jz (Jump If Zero)

أى أننا اذا قمنا باستبدال الأمر jnz بالأمر jz فإن البرنامج سوف يعمل بالعكس. بمعنى أن البرنامج سوف يعمل إذا لم يجد valid License ولن يعمل إذا وجد Valid License.

أو يمكننا بمنتهى البساطة أن نجعل البرنامج يقوم دائما بالذهاب إلى الـ Block التى على اليمين بغض النظر عن نتيجة الـ License Check عن طريق استبدال الأمر jnz بالأمر jmp

هذه هى الفكرة الأساسية التى يعتمد عليها الهاكرز لعمل الكراكات للبرامج المدفوعة.

طبعا هذه الفكرة ليست الأبسط أو الأسهل، وهناك الكثير من الطرق الأخرى مثل الـ KeyGens حيث يقوم الهاكر بتحليل الطريقة التى يقوم البرنامج بالتأكد منها مما اذا كان الـ Serial number الذى يتم ادخاله صحيحا أو لا، ثم يقوم بعمل برنامج بسيط يقوم بتوليد Serial numbers جديدة.

وهناك طريقة الـ Patching حيث يقوم الكراكر بنسخ الملف أو الـ Registry key الذى يحتفظ فيه البرنامج بمعلومات الـ License إلى جهاز اخر بحيث ينخدع البرنامج ويعتقد انه بالفعل تم عمل Activation له من قبل.

بالتأكيد البرامج والشركات تتفنن فى كيفية تصعيب مهمة الـ Hackers فى تخطى الـ License checks ولكن فى النهاية، مادام البرنامج قد قام بكتابته شخص ما، فيمكن أن يتم عمل Crack له.

تابع ايضا….

افضل 5 تطبيقات اندرويد

تحميل الفيديو من تويتر

مقالات ذات صلة

زر الذهاب إلى الأعلى