الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

في دروس JAAS .. كيف حدد عنوان البرنامج ولماذا!

بدأه Adban في 29 أكتوبر 2012 · 2 رد · 1,248 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

في أحد دروس jaas بعنوان : أساليب البرمجة المتقدمة للملفات التنفيذ على هذا الرايط

/index.php?showtopic=62641

يقول jaas:

اقتباس

كيف سنعرف مكان وعنوان تنفيذ برنامجنا بداخل أي عملية

لكي نبدأ بتكوين بيئة للملف التنفيذي , الحل بسيط عن طريق قانون أبسط

قانون تعليمة JMP و CALL

أنا متأكد أن أغلبكم تتبع وراقب طريقة عمل فايروس أو shellcode

وقد تستغرب من أن هذا الشل كود يبدأ بعشرات JMP و Call دون أي تنفيذ ودون سبب واضح؟!

وللمعلومة : فايروس ساسر يبدأ ب 20 تعليمة jmp .. تقريباً

هذة الطريقة لتحديد عناوين الكود بداخل أي عملية .... كيف ؟

أولاً : تعليمة JMP و Call لهما نفس العمل وقد لايكون هنالك إختلاف , إلى في العمل الإضافي للمعالج

عندما ينفذ المعالج تعليمة jmp فإنة ينقل التنفيذ فقط , ولكن عندما ينفذ تعليمة call

فإن المعالج ينقل التنفيذ + يقوم بتخزين عنوان الرجوع للتعليمة التالية , وهنا وجد الحل

الآن نريد تحديد أي عنوان بالبايت داخل برنامجنا , نبدأ بتعليمة jmp وننقل التنفيذ

إلى العنوان الذي نريد معرفته , بعد ذلك ننفذ تعليمة call , مباشرة يقوم المعالج بشكل

تلقائي بدفع عنوان العودة إلى المكدس بواسطة الأمر push

نحن نقوم بكل بساطة بسحب عنوان العودة بتعليمة pop إلى أي مسجل وبهذا نكون قد حددنا موقعنا

0012FE1C:    JMP SHORT 0012FE1F
0012FE1E:    NOP
0012FE1F:    CALL 0012FE62
xxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxx
0012FE62:   POP EDI

الحقيقة أني لم أفهم لماذا يريد تحديد العنوان!! ثم عنوان أي برنامج يقصد هل البرنامج الضحية أم البرنامج الذي يكتبه!

#2

الـshellcode ليس برنامج مستقل لوحده. بل تعليمات تحقنها في عمليه أخرى, فلا يوجد هناك الا برنامج واحد.

إذا أردت من الشل أن يطبع رسالة بإستخدام الدالة MessageBoxA مثلاً, فستحتاج لتحديد عنوان النص الذي تريد تمريره للدالة. لكن مع الأسف أنت لاتعرف أين يوجد هذا النصّ. يُمكنك إستغلال فكرة أن التعليمة call تخزن عنوان العودة هكذا:

.386
.model flat, stdcall
option casemap :none

include windows.inc
include kernel32.inc
include user32.inc

includelib kernel32.lib
includelib user32.lib

.data

.code

start:

	jmp TEXT_LABEL
GOBACK:
	pop ecx ; سيحمل المسجل الآن عنوان النص الذي نريد إظهاره
	invoke MessageBox, NULL, ecx, NULL, MB_OK
	invoke ExitProcess, 0

TEXT_LABEL:
	call GOBACK ; سيُخزن عنوان العودة في المُكدس وفي حالتنا هو نفسه عنوان النص الذي بعد هذا السطر
	db "Hey", 0

end start

تحت المنقح :

post-231926-057718800 1351614998_thumb.p

حصلنا على عنوان النصّ Hey.

Example.zip

المرفقات
1.png
1
#3

شكرا لك أخي فهمت الأمر، ولكن بقي عندي بعض الأشياء الغامضة ومن ضمنها:

كيف لي أن أكتب تعليمات الـ jmp و call داخل برنامج مجمع مسبقا؟

لدي أسألة أخرى غير هذا في الموضوع نفسه، لكن التدرج سياسة مفيدة :) .

مواضيع مشابهة