مضى على الشبكة و يوم من العطاء.

[ شرح ] اساسيات لغة C | المصفوفات والسلاسل النصية 0x07

N0Tb1t

./عضو جديد

firefox
linux

السمعة:

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

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

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;
}


الجدول التالي يوضح الفرق بين المصفوفات والسلاسل النصية:
WhatsApp Image 2025-06-08 at 3.50.34 AM.webp




ما هي أهمية المصفوفات والسلاسل النصية في الهندسة العكسية:
1. إدراة الذاكرة:
• المصفوفات والسلاسل النصية يتم تخزينها في الذاكرة العشوائية RAM، مما يجعل من السهل اكتشافها في البرامج الثنائية أثناء التحليل.
• معرفة العناوين Addresses يمكن أن يساعد في تحليل التدفق بين المتغيرات والوظائف.

2. الثغرات الأمنية:
• ثغرات مثل Buffer Overflow تحدث عندما يتم تجاوز حجم المصفوفة أو السلسلة النصية (في الهندسة العكسية، هذه الثغرات تُعتبر نقاط دخول لاستغلال البرنامج).

3. التعليمات الثنائية (Assembly Instructions):
• يتم التعامل مع المصفوفات والسلاسل النصية كعناوين ذاكرة (أدوات مثل IDA Pro وGhidra يمكنها تحليل هذه العناوين لتحديد المصفوفات أو النصوص المخزنة).

images.webp

هيك بيكون عنوان الذاكرة طبعا بيتم التعبير عنو بنظام الهيكس لسهولة القراءة والتعامل
 
  • Love
التفاعلات: STORM

آخر المشاركات

عودة
أعلى