TO DONATE : BTC => 1D8Aq4q2jQnvGD1GaK9vbNwKgm1K5zUEWL || PM => U4089661


اهم قوانين :1- منع الردود الباهتة مثل شكرااااا و أخواتها 2- لا يسمح بالمشاحنات الطائفية باآ شكل من الأشكال 3- عدم استعمال الألفاظ التافهة و الكلام البذىء 4- عدم وضع معرفات التواصل الأجتماعى بالردود 5- الأطلاع على كامل القوانين واجب 


العودة   الحماية للأبد -Security 4 Ever > قسم البرمجـــة > أساسيات لغة الأسمبلي

أساسيات لغة الأسمبلي يهتم بلغة الآلة (التجميع) Assembly و طرق بناء بعض أجزاء التطبيقات من خلالها

 
أدوات الموضوع انواع عرض الموضوع
  #1  
قديم 15-06-2019, 01:20 AM
الصورة الرمزية zero-cool
zero-cool
:: عضو خاص ::
 
حـالة التــواجـد : zero-cool غير متواجد حالياً
تاريخ التسجيل: Apr 2016
الجــــنــــــس: ذكـر
المشاركات: 74
شكراً:56
تم شكره 256 مرة في 59 مشاركة
معدل تقييم المستوى: 0
zero-cool بدون تقييم
افتراضي Hello World





السلام عليكم ورحمة الله وبركاته



إن شاء الله تكونوا في تمام الصحة والعافية إخواني



شكل البرنامج في لغة الأسمبلي :

لكتابة برنامج بلغة الأسمبلي نحن محتاجين لمعرفة شكل البرنامج والذي يتكون من مقاطع مختلفة .

.data

هذا المقطع يحتوي على كل البيانات المهيئة لقيم .

لو مثلا نقوم بتعريف سلسلة نصية "Hello World" ... فالتعريف يكون في هذا المقطع .



.bss

هذا المقطع يحتوي على كل البيانات الغير المهيئة بعد .




.text

كل تعليمات البرنامج القابلة للتنفيذ توضع في هذا المقطع .




عندما نكتب تعليمات البرنامج فالأسمبلر محتاج لمعرفة مكان بداية هذه التعليمات وهذا المكان نعبر عليه ب :
_start:

والتي يقابلها في لغة السي main()




.globl _start
نستعملها لإستدعاء الوضائف الخارجية وضروري تعريفها لإستخدام linker




طيب بعدما شفنا شكل البرنامج في الأسمبلي ننتقل إلى :

Linux System Calls

هو الواجهة الأساسية بين تطبيق وlinux kernel

مثل : ()exit() , write والتي نستعملهم كثيرا عند البرمجة بلغة السي .
قائمة System Callsموجودة على هذا المسار :

كود PHP:
/usr/include/unistd.



يتم إستدعاء System Call بإستعمال software interrupt تمثل ب INTx80 وعندها يأخذ kernel كل مايحتاجه من arguments



كيف نقوم بتمرير Arguments إلى System Call؟

عندما نقوم بإستدعاء ال System Call ك exit() مثلا
فنحن محتاجين لتحميل المسجلات التالية EAX , EBX , ECX , EDX , ESI , EDI بال Arguments المناسبة التي يحتاجها System Call .

فيكون تمرير ال arguments بالترتيب كالتالي :

EAX : تحتوي على رقم System Call لتي سنستعملها

EBX : تحتوي على أول argument

ECX : تحتوي على ثاني argument

EDX : تحتوي على ثالث argument

ESI :تحتوي على رابع argument

EDI :تحتوي على خامس argument

قد يحتاج System Callأكثر من 5 arguments فنقوم بتحويل المؤشر إلى التعليمة
التي تحتوي على هذه arguments لكن لتبسيط الأمور حاليا وتجنبا لتعقيدها حنشتغل مع ماذكر فقط.


طيب إخواني تعالوا الآن نأخذ مثال ونشوف كيف يتم إستدعاء System Call في لغة الأسمبلي

أولا : حنستعمل write () system call لكتابة السلسلة النصية "Hello World"

ثانيا : حنستعمل exit() system call لمغادرة البرنامج .

أولا يجب أن نعرف Syntax تبع system call write()وهو كالآتي :

كود:
 ssize_t sys_write(unsigned int fd, const char * buf, size_t count)
أولا نكتب system call number تبع write() ورقمه 4

يعني حنقوم بتحميل المسجل EAX بالرقم 4 بكتابة التعليمة التالية :

كود PHP:
mov eax ,
ثم كم نحتاج من arguments ؟

نحتاج إلى ثلاثة arguments وهم كالتالي :

fd : وهي file deاستبدال scriptor




مصدر الصورة: جوجل

طيب من الأنواع الثلاثة الموضحة في الصورة نحن نريد عرض شيء من البرنامج إلى الترمينال
يعني حنستعمل القناة المسماة standard output ورقم file deاستبدال scriptor تبعها هو 1

يعني لدينا أول argument يساوي 1 فيعني أننا سنحمل المسجل EBX بالرقم 1 بكتابة التعليمة التالية :

كود PHP:
mov ebx 

buf : يمثل المؤشر أو المتغير الذي يشير إلى مكان السلسلة النصية "Hello World" في الذاكرة
نكتبه كما نريد نقول مثلا إسمه String ويعني ذلك أنه سيكون في المسجل ECX





size_t : هذا يمثل طول السلسلة النصية Hello World
ويعني ذلك أننا سنحمل المسجل EDX بال طول hello world



ثم قلنا سنستعمل system call exit وذلك لمغادرة البرنامج .

يعني في النهاية البرنامج لكتابة "Hello World" :

كود PHP:
global _start

section 
.data
     string
db "Hello World",0xa
     len equ 
$- string

section 
.text

_start
:

     
mov eax,4       ;system call number
     mov ebx
,1       ;first arg
     mov ecx
,string  ;second arg
     mov edx
,len     ;third arg
     int 0x80        
;software interupt


     
;exit the program
     mov eax
1
     mov ebx
1
     int 0x80 
بالنسبة لمقطع .data قلنا نعرف فيه البيانات المهيئة لقيم ونوع البيانات التي إستعملناها هي السلسلة النصية "Hello World"
فكتبنا String وهو يمثل المؤشر أو إسم المتغير الذي يشير إلى مكان هذه السلسلة في الذاكرة .



نقوم الآن بعملية Compile ثم تنفيذ البرنامج
كما في الصورة التالية :







في أمان الله




 
الصور المرفقة
نوع الملف: jpg dd4m0.jpg‏ (9.2 كيلوبايت, المشاهدات 0)
نوع الملف: jpg 2i096ah.jpg‏ (12.6 كيلوبايت, المشاهدات 0)

 

 

مايفعله الهكرز هو معرفة التكنولوجيا وتجربتها بطرق لايمكن ان يتخيلها الكثير من الناس .
ولديهم رغبة قوية في مشاركة هذه المعلومات مع الآخرين
وتوضيحها للاشخاص الذي قد تكون مؤهلاتهم الوحيدة الرغبة في التعلم.

[email protected]
رد مع اقتباس
4 أعضاء قالوا شكراً لـ zero-cool على المشاركة المفيدة:

الكلمات الدلالية (Tags)
world


الذين يشاهدون محتوى الموضوع الآن : 1 ( الأعضاء 0 والزوار 1)
 
أدوات الموضوع
انواع عرض الموضوع

تعليمات المشاركة
لا تستطيع إضافة مواضيع جديدة
لا تستطيع الرد على المواضيع
لا تستطيع إرفاق ملفات
لا تستطيع تعديل مشاركاتك

BB code is متاحة
كود [IMG] متاحة
كود HTML معطلة

الانتقال السريع


الساعة الآن 12:44 AM