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

مجموعة اسئلة في ال assembly

مغلق
بدأه الاخير زمانه في 31 أغسطس 2006 · 4 رد · 1,259 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

لدي مجموعة اسئلة على كود تكوين نافذة في الاسمبلي 32

اسمحو لي ان اضع اولا الكود كاملا كما مأخوذ من المصدر

.386 
.model flat,stdcall 
option casemap:none 
include \masm32\include\windows.inc 
include \masm32\include\user32.inc 
includelib \masm32\lib\user32.lib		   ; calls to functions in user32.lib and kernel32.lib 
include \masm32\include\kernel32.inc 
includelib \masm32\lib\kernel32.lib 
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD 
.DATA					; initialized data 
ClassName db "SimpleWinClass",0	   ; the name of our window class 
AppName db "Our First Window",0	   ; the name of our window 
.DATA?			   ; Uninitialized data 
hInstance HINSTANCE ?	   ; Instance handle of our program 
CommandLine LPSTR ? 
.CODE			   ; Here begins our code 
start: 
invoke GetModuleHandle, NULL			
mov hInstance,eax 

invoke GetCommandLine							   
mov CommandLine,eax 
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT		
invoke ExitProcess, eax						   
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD 
	LOCAL wc:WNDCLASSEX											
	LOCAL msg:MSG 
	LOCAL hwnd:HWND 
	mov   wc.cbSize,SIZEOF WNDCLASSEX				  
	mov   wc.style, CS_HREDRAW or CS_VREDRAW 
	mov   wc.lpfnWndProc, OFFSET WndProc 
	mov   wc.cbClsExtra,NULL 
	mov   wc.cbWndExtra,NULL 
	push  hInstance 
	pop   wc.hInstance 
	mov   wc.hbrBackground,COLOR_WINDOW+1 
	mov   wc.lpszMenuName,NULL 
	mov   wc.lpszClassName,OFFSET ClassName 
	invoke LoadIcon,NULL,IDI_APPLICATION 
	mov   wc.hIcon,eax 
	mov   wc.hIconSm,eax 
	invoke LoadCursor,NULL,IDC_ARROW 
	mov   wc.hCursor,eax 
	invoke RegisterClassEx, addr wc					  ; register our window class 
	invoke CreateWindowEx,NULL,\ 
				ADDR ClassName,\ 
				ADDR AppName,\ 
				WS_OVERLAPPEDWINDOW,\ 
				CW_USEDEFAULT,\ 
				CW_USEDEFAULT,\ 
				CW_USEDEFAULT,\ 
				CW_USEDEFAULT,\ 
				NULL,\ 
				NULL,\ 
				hInst,\ 
				NULL 
	mov   hwnd,eax 
	invoke ShowWindow, hwnd,CmdShow			  ; display our window on desktop 
	invoke UpdateWindow, hwnd								; refresh the client area 
	.WHILE TRUE														; Enter message loop 
				invoke GetMessage, ADDR msg,NULL,0,0 
				.BREAK .IF (!eax) 
				invoke TranslateMessage, ADDR msg 
				invoke DispatchMessage, ADDR msg 
   .ENDW 
	mov	 eax,msg.wParam										   ; return exit code in eax 
	ret 
WinMain endp 
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM 
	.IF uMsg==WM_DESTROY						  ; if the user closes our window 
		invoke PostQuitMessage,NULL			; quit our application 
	.ELSE 
		invoke DefWindowProc,hWnd,uMsg,wParam,lParam	; Default message processing 
		ret 
	.ENDIF 
	xor eax,eax 
	ret 
WndProc endp 
end start

اولا

هذه الخطوة ،

	mov   wc.lpfnWndProc, OFFSET WndProc

الا يجب ان يعرف ال WndProc مسبقا لكي يتم التعرف عليها ، كما فعل مع WinMain ؟؟

وما معنى OFFSET ؟؟

ثانيا ،

هنا

	push  hInstance 
	pop   wc.hInstance

لماذا لم يستخدم mov ،

الا يصح هكذا ، مباشرة ، أي بدون استخدام hInstance

invoke GetModuleHandle, NULL			
mov wc.hInstance , eax

ثالثا ،

	mov   wc.lpszClassName,OFFSET ClassName

انا قرأت كم مثال يستخدم addr لماذا هنا استخدم OFFSET ؟؟

رابعا ،

هذا الجزء

	.WHILE TRUE														; Enter message loop 
				invoke GetMessage, ADDR msg,NULL,0,0 
				.BREAK .IF (!eax) 
				invoke TranslateMessage, ADDR msg 
				invoke DispatchMessage, ADDR msg 
   .ENDW

لم افهمه بصراحة ،

ما فرق ADDR عن addr ؟

في ال سي مثلا كنا نعمل

while (GetMessage (&msg, NULL, 0, 0))
{
	 TranslateMessage (&msg);
	 DispatchMessage (&msg);
}

هنا ما فائدة هذا السطر وماذا يعني

				.BREAK .IF (!eax)

طبعا هنا احب ان اسأل ،

اين اجد اساسيات هذه اللغة ،

يعني ماهي الكلمات المحجوزة ، وكيفية كتابة الجمل الشرطية وما الى ذلك ؟؟؟

طبعا انا قرأت درس الاخ Xacker بهذا الخصوص

هذا الجزء كان كالآتي في الملف المرفق مع درسه ،

.while	TRUE
	invoke	GetMessage,addr msg,0,0,0
	.break .if (!eax)
	invoke	DispatchMessage,addr msg
.endw

هنا استخدم ، addr يعني هل معنى هذا انها لا تفرق عن ال ADDR

،

ولماذا تم حذف هذا السطر ،

				invoke TranslateMessage, ADDR msg

؟؟؟

واخيرا ،

في ال WndProc استخدم ال IF،

هل من الممكن استخدام ال switch – case

،،،،،،

،،،،

بصراحة بعد لدي اسئلة واستفسارات .. بس خليها شوي شوي ،،

(طبعا اذا وجدت من يجيبني .. )

------------------

استفسار من مشرفي القسم والمتمكنين من هذه اللغة ،

انا على ابواب مشروع في الكلية ،

المشروع على الاكثر سيكون بمجال ال API hook ،

انا قررت ان استخدم هذه اللغة ،

لأن هنا لدينا لم يعمل احد عليها بعد ،، يعني راح يكون شيء جديد ..

سؤالي هل هذا ممكن ؟؟

يعني هل تمكني هذه اللغة من عمل ما اريد مثل لغة سي ،

طبعا انا اعلم ان ال API hook به ايعازات اسمبلي ،

لكن هل من الممكن عمل مشروع متكامل بهذه اللغة ؟؟

جزاكم الله كل خير ...

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#2
اقتباس
اولا

هذه الخطوة ،

	mov   wc.lpfnWndProc, OFFSET WndProc

الا يجب ان يعرف ال WndProc مسبقا لكي يتم التعرف عليها ، كما فعل مع WinMain ؟؟

وما معنى OFFSET ؟؟

معرفة سلفا من قبل النظام, راجع MSDN لبعض المعلومات عنها

بخصوص offset دعني الخص لك مفهوم المتحولات التي لدينا..

لديك نوعين من المتحولات, متحولات محلية ومتحولات عامة

المتحولات المحلية هي المتحولات المستخدمه ضمن وظيفة ما وغير متعلقه في وظيفة اخرى او ضمن كتلة البرنامج الرئيسية..

العامة هي متحولات موجودة سلفا ومعنونة عند تجميع البرنامج, مثلا اسم الـ Class او متحول باسم szTextMsg وخلافه.. هذه يستطيع المجمع ان يقوم بتحديد عنوان لها لذا من الممكن ايجاد قيمة الازاحة الخاصة بها باستخدام offset والتي ستكون الفرق بين عنوان بداية المقطع والمتحول او اللافتة المطلوبة

باختصار, offset يمكن استخدامها فقط مع المتحولات العامة, addr يمكن استخدامها مع الاثنين رغم انها ايضا لا تستطيع ان تعنون متحولات محلية لكن المجمع يقوم بتحويلها الى الشكل:

lea eax, some_var

push eax

لو استخدمتها في عبارة Invoke مثلا.

اقتباس
ثانيا ،

هنا

	push  hInstance 
	pop   wc.hInstance

لماذا لم يستخدم mov ،

الا يصح هكذا ، مباشرة ، أي بدون استخدام hInstance

invoke GetModuleHandle, NULL			
mov wc.hInstance , eax

يجوز الوجهان, لكن push/pop ستاخذ بايتات اقل من mov بالتالي حجم اقل

اقتباس
ثالثا ،

	mov   wc.lpszClassName,OFFSET ClassName

انا قرأت كم مثال يستخدم addr لماذا هنا استخدم OFFSET ؟؟

اتمنى ان تكون اجابتي في الاعلى واضحة.. رغم اني اشك بذلك بنفسي :P

اقتباس
رابعا ،

هذا الجزء

	.WHILE TRUE													   ; Enter message loop 
				invoke GetMessage, ADDR msg,NULL,0,0 
				.BREAK .IF (!eax) 
				invoke TranslateMessage, ADDR msg 
				invoke DispatchMessage, ADDR msg 
   .ENDW

لم افهمه بصراحة ،

ما فرق ADDR عن addr ؟

لا فرق على الاطلاق, ليست الكلمات المحجوزة case sensitive

اقتباس
طبعا هنا احب ان اسأل ،

اين اجد اساسيات هذه اللغة ،

يعني ماهي الكلمات المحجوزة ، وكيفية كتابة الجمل الشرطية وما الى ذلك ؟؟؟

معظم الكلمات المحجوزة ستجدها في windows.inc الخاص بـ masm

اقتباس
ولماذا تم حذف هذا السطر ،

				invoke TranslateMessage, ADDR msg

لاني لا اهتم بنوع الرسالة المعادة, TranslateMessage ستقوم بتحديد نوع الرسائل بالضبط كي لا يحدث خلط بين الرسائل الحاثّة الخاصة بنقرات المفاتيح مثلا (راجعها في MSDN) - في ذلك المقال لم تكن الرسائل تهمنا لانه غير موسع فقط مثال بسيط ان شاء الله.. لذلك كنت امررها عبر dispatch فورا

اقتباس
واخيرا ،

في ال WndProc استخدم ال IF،

هل من الممكن استخدام ال switch – case

ممكن, راجع

x:\masm32\macros\macros.asm

اقتباس
استفسار من مشرفي القسم والمتمكنين من هذه اللغة ،

انا على ابواب مشروع في الكلية ،

المشروع على الاكثر سيكون بمجال ال API hook ،

انا قررت ان استخدم هذه اللغة ،

لأن هنا لدينا لم يعمل احد عليها بعد ،، يعني راح يكون شيء جديد ..

سؤالي هل هذا ممكن ؟؟

يعني هل تمكني هذه اللغة من عمل ما اريد مثل لغة سي ،

طبعا انا اعلم ان ال API hook به ايعازات اسمبلي ،

لكن هل من الممكن عمل مشروع متكامل بهذه اللغة ؟؟

جزاكم الله كل خير ...

ممكن لو كنت على الاقل متقن لمسألة الـ hook عبر C, التحويل الى اسمبلي ليس بالصعب على الاطلاق ان شاء الله

وكنت ارى اهتمامك منصب بالـ API-Hook لذا لا اتصور ستواجهك مشاكل باذن الله..

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#3

السلام عليكم ،

جزاك الله خيرا ،

سأقرء ردك اخي الفاضل ،

واذا كان في شي ،،

راح ارجعلك ،،

وارجو ان يتسع صدرك لي ولأسئلتي

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#4

نسيت ان اقول, بخصوص

.break .if (!eax)

ستقوم بالخروج من الحلقة لو لم يحمل eax قيمة تابعة للـ MSG وهذا يحدث عند انهاء البرنامج.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#5

جزاك الله خيرا اخي الكريم

وما قصرت ،،

والله بديت اخجل اسأل لأن انت ما شاالله شايل القسم على راسك (هاي بلهجتنا ) ;)

أين بقية الاعضاء ؟؟؟؟؟؟؟!!

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

هذا الموضوع مغلق.

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