N0Tb1t
./عضو جديد



السمعة:
بسم الله
في هذا المقال سنتعرف على المصفوات والسلاسل النصية واستخدامتها واهميتها في الهندسة العكسية.
من هذا المقال سنتوسع بالشرح لأن المقالات المتبقية هي من أهم المقالات التي تفيدنا في الهندسة بالعكسية ويجب اتقان التعامل معها.
المصفوفات والسلاسل النصية هما من أهم أنواع البيانات التي يتم استخدامها لتخزين البيانات ومعالجتها. ومع ذلك، هما يختلفان في الاستخدام والهيكلية. ففهم كيفية عمل المصفوفات والسلاسل النصية يعتبر أساسيًا لتحليل البرامج التنفيذية، خصوصًا فيما يتعلق بكيفية التعامل مع البيانات في الذاكرة والكشف عن الثغرات.
1. المصفوفات(Arrays):
ما هي المصفوفة؟
المصفوفة هي مجموعة من العناصر المتشابهة (أي من نفس نوع البيانات) يتم تخزينها في مواقع ذاكرة متجاورة. كل عنصر يمكن الوصول إليه باستخدام فهرس (Index).
صيغة تعريف المصفوفة(syntax):
أمثلة على تعريف المصفوفات:
تهيئة المصفوفة (Array Initialization):
يمكنك تعيين القيم عند تعريف المصفوفة:
و تعيين بعض القيم فقط:
ويمكنك الوصول إلى العناصر وتعديلها:
الوصول إلى عنصر معين:
تعديل عنصر:
ملاحظة هامة جدا: أول عنصر بالمصفوفة يكون الفهرس الخاص به أو الindex = 0
مثال:
وهناك نوع ثاني من المصفوفات وهو مصفوفات متعددة الأبعاد (Multi-dimensional Arrays):
مصفوفة ثنائية الأبعاد: تكون مصفوفة مؤلفة من اسطر و اعمدة.
مثال:
لا تختلف عن الممصفوفة الاحادية كثيرا
ويتم الوصول إلى العنصر بالشكل التالي :
2. السلاسل النصية (Strings):
ما هي السلسلة النصية؟
السلاسل النصية هي مصفوفات من الأحرف (characters) تُنهيها لغة C بـ رمز إنهاء السلسلة النصية '\0'.
صيغة تعريف السلسلة النصية(syntax):
تهيئة السلاسل النصية:
1. تعريف السلسلة النصية يدوياً:
2. تعريفها كالنصوص المباشرة:
كيف يتم الوصول إلى الأحرف داخل السلسلة النصية؟
مثال:
يوجد دوال مهمة داخل السلاسل النصية وعلينا اتقانها وهي:
1. strlen: تستخدم لمعرفة طول النص.
2. strcpy: تستخدم لنسخ نص إلى آخر.
3. strcat: تستخدم لدمج نصين.
4. strcmp: تستخدم لمقارنة نصين.
مثال:
الجدول التالي يوضح الفرق بين المصفوفات والسلاسل النصية:
ما هي أهمية المصفوفات والسلاسل النصية في الهندسة العكسية:
1. إدراة الذاكرة:
• المصفوفات والسلاسل النصية يتم تخزينها في الذاكرة العشوائية RAM، مما يجعل من السهل اكتشافها في البرامج الثنائية أثناء التحليل.
• معرفة العناوين Addresses يمكن أن يساعد في تحليل التدفق بين المتغيرات والوظائف.
2. الثغرات الأمنية:
• ثغرات مثل Buffer Overflow تحدث عندما يتم تجاوز حجم المصفوفة أو السلسلة النصية (في الهندسة العكسية، هذه الثغرات تُعتبر نقاط دخول لاستغلال البرنامج).
3. التعليمات الثنائية (Assembly Instructions):
• يتم التعامل مع المصفوفات والسلاسل النصية كعناوين ذاكرة (أدوات مثل IDA Pro وGhidra يمكنها تحليل هذه العناوين لتحديد المصفوفات أو النصوص المخزنة).
هيك بيكون عنوان الذاكرة طبعا بيتم التعبير عنو بنظام الهيكس لسهولة القراءة والتعامل
في هذا المقال سنتعرف على المصفوات والسلاسل النصية واستخدامتها واهميتها في الهندسة العكسية.
من هذا المقال سنتوسع بالشرح لأن المقالات المتبقية هي من أهم المقالات التي تفيدنا في الهندسة بالعكسية ويجب اتقان التعامل معها.
المصفوفات والسلاسل النصية هما من أهم أنواع البيانات التي يتم استخدامها لتخزين البيانات ومعالجتها. ومع ذلك، هما يختلفان في الاستخدام والهيكلية. ففهم كيفية عمل المصفوفات والسلاسل النصية يعتبر أساسيًا لتحليل البرامج التنفيذية، خصوصًا فيما يتعلق بكيفية التعامل مع البيانات في الذاكرة والكشف عن الثغرات.
1. المصفوفات(Arrays):
ما هي المصفوفة؟
المصفوفة هي مجموعة من العناصر المتشابهة (أي من نفس نوع البيانات) يتم تخزينها في مواقع ذاكرة متجاورة. كل عنصر يمكن الوصول إليه باستخدام فهرس (Index).
صيغة تعريف المصفوفة(syntax):
C:
data_type array_name[size];
// data_type: نوع البيانات (مثل int، char، float).
// array_name: اسم المصفوفة.
// size: عدد العناصر التي يمكن تخزينها.
أمثلة على تعريف المصفوفات:
C:
int numbers[5]; // مصفوفة لخمسة أعداد صحيحة
float prices[10]; // مصفوفة لعشرة أعداد عشرية
char letters[3]; // مصفوفة لثلاثة حروف
تهيئة المصفوفة (Array Initialization):
يمكنك تعيين القيم عند تعريف المصفوفة:
C:
int numbers[5] = {1, 2, 3, 4, 5};
و تعيين بعض القيم فقط:
C:
int numbers[5] = {1, 2}; // الباقي يتم تعيينه إلى 0
ويمكنك الوصول إلى العناصر وتعديلها:
الوصول إلى عنصر معين:
كود:
int x = numbers[2]; // الحصول على العنصر الثالث
تعديل عنصر:
C:
numbers[0] = 10; // تعديل العنصر الأول
ملاحظة هامة جدا: أول عنصر بالمصفوفة يكون الفهرس الخاص به أو الindex = 0
مثال:
C:
#include <stdio.h>
int main() {
int numbers[5] = {10, 20, 30, 40, 50};
// طباعة العناصر
for (int i = 0; i < 5; i++) {
printf("numbers[%d] = %d\n", i, numbers[i]);
}
return 0;
}
وهناك نوع ثاني من المصفوفات وهو مصفوفات متعددة الأبعاد (Multi-dimensional Arrays):
مصفوفة ثنائية الأبعاد: تكون مصفوفة مؤلفة من اسطر و اعمدة.
مثال:
C:
int matrix[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
لا تختلف عن الممصفوفة الاحادية كثيرا
ويتم الوصول إلى العنصر بالشكل التالي :
C:
int x = matrix[1][2]; // العنصر في السطر الثاني والعمود الثالث
2. السلاسل النصية (Strings):
ما هي السلسلة النصية؟
السلاسل النصية هي مصفوفات من الأحرف (characters) تُنهيها لغة C بـ رمز إنهاء السلسلة النصية '\0'.
صيغة تعريف السلسلة النصية(syntax):
C:
char string_name[size];
// char: نوع البيانات المخصص للأحرف.
// string_name: اسم السلسلة.
// size: عدد الأحرف التي يمكن تخزينها.
تهيئة السلاسل النصية:
1. تعريف السلسلة النصية يدوياً:
C:
char name[6] = {'A', 'l', 'i', '\0'};
2. تعريفها كالنصوص المباشرة:
C:
char name[] = "Ali"; // في هذه الحالة تضاف /0 تلقائياً
كيف يتم الوصول إلى الأحرف داخل السلسلة النصية؟
C:
char first_char = name[0]; // الحرف الأول
name[1] = 'e'; // تعديل الحرف الثاني
مثال:
C:
#include <stdio.h>
int main() {
char name[] = "Ahmed";
printf("Name: %s\n", name);
// طباعة كل حرف في السلسلة
for (int i = 0; name[i] != '\0'; i++) {
printf("Character %d: %c\n", i, name[i]);
}
return 0;
}
يوجد دوال مهمة داخل السلاسل النصية وعلينا اتقانها وهي:
1. strlen: تستخدم لمعرفة طول النص.
C:
#include <string.h> // المكتبة التي تحوي دوال التعامل مع السلاسل النصية
int length = strlen(name);
2. strcpy: تستخدم لنسخ نص إلى آخر.
C:
strcpy(destination, source);
3. strcat: تستخدم لدمج نصين.
C:
strcat(string1, string2);
4. strcmp: تستخدم لمقارنة نصين.
C:
if (strcmp(string1, string2) == 0) {
printf("Strings are equal.\n");
}
مثال:
C:
#include <stdio.h>
#include <string.h>
int main() {
char str1[20] = "Hello";
char str2[20] = "World";
// دمج النصوص
strcat(str1, " ");
strcat(str1, str2);
printf("Concatenated String: %s\n", str1);
// مقارنة النصوص
if (strcmp(str1, "Hello World") == 0) {
printf("Strings are equal.\n");
} else {
printf("Strings are not equal.\n");
}
// طول النص
printf("Length of str1: %lu\n", strlen(str1));
return 0;
}
الجدول التالي يوضح الفرق بين المصفوفات والسلاسل النصية:
ما هي أهمية المصفوفات والسلاسل النصية في الهندسة العكسية:
1. إدراة الذاكرة:
• المصفوفات والسلاسل النصية يتم تخزينها في الذاكرة العشوائية RAM، مما يجعل من السهل اكتشافها في البرامج الثنائية أثناء التحليل.
• معرفة العناوين Addresses يمكن أن يساعد في تحليل التدفق بين المتغيرات والوظائف.
2. الثغرات الأمنية:
• ثغرات مثل Buffer Overflow تحدث عندما يتم تجاوز حجم المصفوفة أو السلسلة النصية (في الهندسة العكسية، هذه الثغرات تُعتبر نقاط دخول لاستغلال البرنامج).
3. التعليمات الثنائية (Assembly Instructions):
• يتم التعامل مع المصفوفات والسلاسل النصية كعناوين ذاكرة (أدوات مثل IDA Pro وGhidra يمكنها تحليل هذه العناوين لتحديد المصفوفات أو النصوص المخزنة).
هيك بيكون عنوان الذاكرة طبعا بيتم التعبير عنو بنظام الهيكس لسهولة القراءة والتعامل