almohammdih منتديات المحمدية
عدد المساهمات : 922 نقاط : 2354 تاريخ التسجيل : 14/01/2010
| موضوع: الهندسة العكسية للمبتدئين = الدرس الأول = Reversing for Newbies الأحد مارس 14, 2010 6:51 pm | |
| دروس في مباديء الهندسة العكسية
تعلم الهندسة العكسية في البداية لا يحتاج إلا لقدر من المعرفة ليس بكثير عن جهاز الكمبيوتر بشكل عام ولغات البرمجة سواء عالية أو منخفضة المستوي خاصة لغة التجميع Assembly Language والتي هي نهاية أي لغة برمجة .
فحتي أكون كراكر محترف يجب أن يكون لدي معرفة بمعظم لغات البرمجة بالطبع ليس أن أكون خبيرا ولكن علي الأقل أكون علي دراية بأساسيات كل لغة .
و لإني كما قلت سأبدأ من الصفر فيجب أن تتأكد أن تقرأ علي الأقل المعلومات البسيطة التي سيتم توضيحها في الأجزاء التالية .
لغة التجميع Assembly Language تصنف علي إنها من اللغات منخفضة المستوي Low-level Languages حيث إنها تتعامل مع مكونات الكمبيوتر المادية مباشرة .
قبل الدخول في الحديث عن لغة التجميع سأورد نبذة عن أنظمة العد وعلاقتها بالكمبيوتر .
جهاز الكمبيوتر لا يفهم أي رقم أو أي حرف يكتب له لإنه مكون من مجموعة من الدوائر الكهربية وبالتالي فهو لا يفهم إلا لغة الدوائر الكهربية وهي حالتين حالة وجود تيار كهربي وحالة عدم وجود تيار كهربي , الحالة الأولي حالة وجود تيار كهربي تأخذ الرقم (1) وحالة عدم وجود تيار كهربي و تأخذ الرقم (0) وهو ما يسمي بالنظام الثنائي Binary وهو اللغة الأم لجهاز الكمبيوتر . إذن فالنظام الثنائي يتكون من رقمين فقط هم الصفر والواحد .
وبعد النظام الثنائي يأتي النظام السداسي العشري Hexadecimal وهو نظام مكون من ستة عشر رمز من 0 إلي 9 ومن A إلي F أي 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F .
بعد ذلك يأتي النظام الثماني Octal وهو يتكون من ثمانية رموز من 0 إلي 7 أي 0,1,2,3,4,5,6,7 .
و أخيرا يأتي النظام العشري Decimal وهو يتكون من عشرة رموز تبدأ بالصفر وتنتهي ب 9 أي 0,1,2,3,4,5,6,7,8,9 وهو النظام المستخدم في الحياة العادية .
و لم يتم التطرق إلي العمليات الرياضية و عمليات التحويل من نظام إلي آخر وهي عملية مهمة جدا لكن للتسهيل لن يتم التطرق إليها الآن وبمكن الرجوع إليها في وقت آخر حيث توجد برامج جاهزة تستطيع القيام بهذه المهمة .
سنعود إلي النظام الثنائي فكما قلنا هو اللغة الأم لجهاز الكمبيوتر وهذه المرة سنتحدث عن الوحدات المستخدمة في جهاز الكمبيوتر و سنبدأ بما يسمي البت Bit وهو أصغر وحدة وهو يساوي إما صفر أو واحد و بعد ذلك يأتي النيبل Nibble وهو عبارة عن 4 بت ثم البايت وهو عبارة عن 8 بت ثم الوورد Word وهو عبارة عن 16 بت ثم الدبل وورد Double Word وهو عبارة عن 32 بت ثم الكيلو بايت وهو عبارة عن 1024 بايت ثم الميجابايت وهو عبارة عن 1,048,578 بايت أي 1024×1024 .
The Registers
هي عبارة عن مسجلات للبيانات موجودة بذاكرة المعالج وهناك أكثر من نوع منها
المسجلات عامة الغرض Purpose Registers General
وهي 8 مسجلات في معالجات 8086 32بت وهي :
EAX: Extended Accumulator Register
EBX: Extended Base Register
ECX: Extended Counter Register
EDX: Extended Data Register
ESI: Extended Source Index
EDI: Extended Destination Index
EBP: Extended Base Pointer
ESP: Extended Stack Pointer
EIP: Extended Instruction Pointer
كل مسجل حجمه 32 بت أي 4 بايت ويمكنه تخزين بيانات من 0 إلي FFFFFFFF و المسجلات الأربعة الأولي تنقسم إلي أجزاء 16 بت و 8 بت كما يوضح الجدول التالي :
لاحظ أن EAX هي مسجل حجمه 32 بت و أن AX تسمي Low Word of EAX و تساوي 16 بت و AL/AH تسمي Low Part و High Part من AX تساوي 8 بت .
وهذه هي تقسيمات المسجلات Registers حسب الحجم : Byte-size registers: هي مسجلات حجمها 1 بايت أي 8 بت مثل AH, AL و BH, BL و CH, CL و DH, DL. word-size registers : وهي عبارة عن مسجلات حجمها 1 وورد أي 16 بت أي 2 بايت مثل AX و BX و CX و DX مع ملاحظة ان AX=AH AL وهذا يعني أن أي تغير في AH أو AL يؤدي إلي تغير AX وبالتالي يؤدي إلي تغير EAX . Double word-size registers : وهي مسجلات حجمها 32 بت أي 2 ووردأي 4 بايت مثل EAX و EBX .......
The Flags هي عبارة عن أماكن في الذاكرة لتخزين البيانات وفي معالجات 32 بت يوجد 32 flag لكن ما يهمنا منها هو ثلاثة فقط وهم : Z-Flag (Zero Flag): وهي الأكثر إستخداما في عملية الكراكنج وهي إما صفر أو واحد و تستخدم غالبا في أوامر المقارنة و القفز كما سيتم شرحه لاحقا. O-Flag (Overflow Flag): تأخذ 1 إذا كانت النتيجة أكبر من المكان المخصص لحفظها وإلا تأخذ صفر. C-Flag (Carry flag): تأخذ 1 إذا أعطت البت الأخيرة عن اليسار 1 إلى الخارج أو أخذت 1 من الخارج وإلا تأخذ صفر.
Segments and Offsets Segments هي أماكن في الذاكرة يتم حفظ التعليمات بها وهي تقسم إلي offset حيث يمكن إعتبار أن segment هي صفجة في كتاب و offset هي سطر في هذه الصفحة.
The Stack هي أجزاء في الذاكرة و يتم حفظ البيانات والتعليمات بها حتي يتم إستخدامها لاحقا مع ملاحظة إن آخر ما يتم تخزينه هو أول ما سيتم إستخدامه و يستخدم الأمر PUSH لحفظ البيانات و الأمر POP لإخراج البيانات لإستخدامها .
تعليمات و أوامر لغة التجميع الجداول التالية بها معظم أوامر لغة التجميع OPcodesولا تسألني عن ترجمتها بالعربية لإنك لن تجدها بالبرنامج باللغة العربية
ميزة مهمة بالنسبة لنا في لغة التجميع وهي عدم وجود طرق كثيرة للوصول إلي الهدف فنفس الأوامر ستجدها مكررة وبالخبرة ستعلم الجزء المراد من الكود وفي كل مرة ستتوجه عليه وفي كل مرة ستتوجه إليه مباشرة دون مجهود وستجد أن لغة التجميع هي من اسهل اللغات في تعلمها و إستخدامها . هناك ثلاث من أنواع من البرامج تتعامل مع الويندوز النوع الأول يستخدم تقنية تسمي SDI أي Single Document Interface و أقرب مثال علي هذا النوع هو Notepad فاو نظرت إلي البرنامج ستجده بسيط جدا في تكوينه عبارة عن شريط العنوان وشريط الأدوات و هذا النوع من البرامج لا يمكنه فتح أكثرمن ملف في نفس الوقت حيث يجب غلق الملف المفتوح أولا قبل فتح الآخر والمقصود هو فتح ملفين في نفس فحة البرنامج وليس فتح صفحة أخري للبرنامج . النوع الثاني يستخدم تقنية تسمي MDI أي Multiple Document Interface وهي أكثر البرامج تعقيدا مثل الفوتوشوب وبرامج الأوفيس و هذا النوع من البرامج يحتوي علي كثير من الأدوات ويمكنه أداء العديد من المهام في نفس الوقت . النوع الثالث يستخدم تقنية تسمي DPI أي Dialog Based Application وهو أسهل الأنواع في كتابتها و الأسهل في إستخدامها من حيث الأدوات المسنخدمة والواجهة التي يتعامل بها مع المستخدم . لاحظ أن لا علاقة بين هذه الأنواع و نوع لغة البرمجة التي تم برمجة بها أيا كانت C أو VB أو .NET أو Delphi أو أي لغة برمجة أخري . الهدف من معرفة أنواع البرامج هو أن كل نوع من البرامج له طريقة معينة في هندسته حيث لا يهمنا في عملية الهندسة العكسية دراسة كود البرنامج لكن ما يهمنا هو جزء معين من الكود هو الذي يجب أن نركز عليه .
مع تحيات (مدير المنتدى) أتمني أن أكون وفقت في توصيل المعلومة
| |
|