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

[ تمت الإجابة ]how to get the module name of process

بدأه soufianosse في 1 ديسمبر 2009 · 19 رد · 1,706 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

عملت برنامج يقوم بجلب النوافد المفتوحة ويقوم ايضا بجلب Process النافدة

اريد طريقة لجلب Module Name و base adress

بشكل اوضح الملفات التي لها علاقة بهدا Process

هل هناك دالة تقوم بالامر ام علينا حقن ملف ما بهدا Process

اتمنى لو اجد جوابا هنا

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

كتوضيح تعطيها المسار c:\windows وتفح الملف

تحياتي

تم تعديل هذه المشاركة بواسطة soufianosse في 1 ديسمبر 2009 في 16:27

#2

السلام عليكم

يبدو ان هدا المنتدى تم هجره :P

بحت في الموضوع فوجدت الجواب ، جربته اشتغل لكن ما الفائدة من العمل بكود اخدته عبر نسخ لصق دون فهم :blush:

الكود موجود في برنامج الاخ GM :wub:

نشاهد الكود اولا :

GetProcessModules			proc	PID:DWORD
	LOCAL hProcess:HANDLE
	LOCAL lpBuffer[260]:BYTE
	LOCAL hMods[1024]:DWORD
	LOCAL cb:DWORD
	LOCAL count:DWORD
	LOCAL n:DWORD

	mov n,0
	m2m mPID,PID
	invoke RtlZeroMemory,addr LVI,sizeof LVI
	mov LVI.imask,LVIF_TEXT
	lea eax,lpBuffer
	mov LVI.pszText,eax
	invoke RtlZeroMemory,addr lpBuffer,260
	invoke RtlZeroMemory,addr hMods,sizeof hMods
	invoke SendMessage,hMList,LVM_DELETEALLITEMS,NULL,NULL

	mov hProcess,FUNC(OpenProcess,PROCESS_QUERY_INFORMATION + PROCESS_VM_READ,FALSE,PID)
	.if (eax)
		invoke EnumProcessModules,hProcess,addr hMods,sizeof hMods,addr cb
		xor edx,edx
		mov ebx,4
		mov eax,cb
		div ebx  
		mov count,eax
		cmp [hMods],0
		jz @F
		xor ecx,ecx
		.while ecx < count
			mov eax,[hMods+ecx*4]
			mov ebx,eax
			mov esi,ecx
			mov edi,esi
			inc esi
			.while esi < count
				mov edx,[hMods+esi*4]
				.if edx < eax
					mov eax,edx
					mov edi,esi
				.endif
				inc esi
			.endw
			mov [hMods+ecx*4],eax
			mov [hMods+edi*4],ebx
			inc ecx
		.endw

		mov esi,cb
		xor edi,edi
		.while (edi < esi)
			mov LVI.iSubItem,0
			invoke wsprintf,addr lpBuffer,CTXT("%08X"),[hMods+edi]
			invoke SendMessage,hMList,LVM_INSERTITEM,NULL,addr LVI


			inc LVI.iSubItem
			invoke GetModuleFileNameEx,hProcess,[hMods+edi],addr lpBuffer,260
			invoke SendMessage,hMList,LVM_SETITEM,NULL,addr LVI


			inc LVI.iItem
			add edi,4
			inc n
		.endw
		invoke CloseHandle,hProcess
	.endif
	@@:
	invoke wsprintf,addr n,CTXT("Modules:%ld"),n
	invoke SendMessage,hStatus,SB_SETTEXT,1,addr n
	invoke ShowTabDlg,hDlgModule,1
	ret
GetProcessModules endp

الدالة الرئيسية لهدا العمل هي EnumProcessModules تقوم بجلب مقبض لكل Module

لكن هدا الكود غير مفهوم ومحتاج تفسير

اضن ان عمله متل عمل الدالة Process32Next بالنسبة للـProcess

xor edx,edx
		mov ebx,4
		mov eax,cb
		div ebx  
		mov count,eax
		cmp [hMods],0
		jz @F
		xor ecx,ecx
		.while ecx < count
			mov eax,[hMods+ecx*4]
			mov ebx,eax
			mov esi,ecx
			mov edi,esi
			inc esi
			.while esi < count
				mov edx,[hMods+esi*4]
				.if edx < eax
					mov eax,edx
					mov edi,esi
				.endif
				inc esi
			.endw
			mov [hMods+ecx*4],eax
			mov [hMods+edi*4],ebx
			inc ecx
		.endw

		mov esi,cb
		xor edi,edi
		.while (edi < esi)

عندما اشاهد متل هده الاكواد وخصوصا هده الاسطر تتبعتر عندي الحسابات :wacko:

mov eax,[hMods+ecx*4]
mov edx,[hMods+esi*4]
mov [hMods+ecx*4],eax

احتاج شرحا للكود فوق من فضلكم :happy:

تم تعديل هذه المشاركة بواسطة soufianosse في 12 ديسمبر 2009 في 17:43

#3

اين الاخوة X , GM .....

اضن ان الامر سهل عليكم تفسيره :lol:

#4
soufianosse كتب:

الدالة الرئيسية لهدا العمل هي EnumProcessModules تقوم بجلب مقبض لكل Module

لكن هدا الكود غير مفهوم ومحتاج تفسير

اضن ان عمله متل عمل الدالة Process32Next بالنسبة للـProcess

هناك اختلاف في الآلية

EnumProcessModules تقوم بجلب مقابض كل Modules التابعة ل Process مرة واحدة وتضعها في مصفوفة اي تستدعيها مرة واحدة وتنتهي منها

Process32Next عليك استدعائها بشكل متكرر حتى نهاية كل ال Processes التي تعمل .

soufianosse كتب:

xor edx,edx
		mov ebx,4
		mov eax,cb
		div ebx  
		mov count,eax
		cmp [hMods],0
		jz @F
		xor ecx,ecx
		.while ecx < count
			mov eax,[hMods+ecx*4]
			mov ebx,eax
			mov esi,ecx
			mov edi,esi
			inc esi
			.while esi < count
				mov edx,[hMods+esi*4]
				.if edx < eax
					mov eax,edx
					mov edi,esi
				.endif
				inc esi
			.endw
			mov [hMods+ecx*4],eax
			mov [hMods+edi*4],ebx
			inc ecx
		.endw

		mov esi,cb
		xor edi,edi
		.while (edi < esi)

هذا الكود وظيفته هو ترتيب ال Modules في المصفوفة التي تم حجزها في الذاكرة (hMods) من العنوان الاصغر الى العنوان الاكبر، اي 7C800000 يضعها قبل 7C900000

حتى يتم عرضها في ال ListView بشكل مرتب

[hMods+ecx*4]

هذه تعني العنوان الموجود عند hMods+ecx*4 والاقواس [] تعني ما بداخل هذا العنوان او ما يؤشر عليه العنوان

كل عنوان هو عبارة عن 4 بايت وكما قلت يتم ارجاع نتيجة الدالة السابقة بجميع المقابض دفعة واحدة فعند الحصول على اول مقبض تكون قيمة ecx = 0 وبالتالي 0x4=0 هنا نحصل على

اول مقبض لModule الموجود في hMods وحتى نحصل على المقبض التالي يجب ان ننتقل 4 بايتات للامام وبذلك نزيد قيمة (inc ecx) لتصبح ecx = 1 وبالتالي 1x4=4 وبالتالي

hMods+4 وهكذا بشكل متكرر مع مضاعفات الرقم 4 حتى نصل الى مقبض الModule الاخير وتم تحديد عدد المقابض بقسمة حجم المصفوفة الناتجة على 4 .

#5

بارك الله فيك اخي AND على التفسير :happy:

فهمت الان مادا تعني hMods+ecx*4 لكن بقي هناك بعض الصعوبات :wacko:

نبدأ من هنا

 xor edx,edx
                mov ebx,4
                mov eax,cb
                div ebx  
                mov count,eax
                cmp [hMods],0
                jz @F
                xor ecx,ecx
                .while ecx < count

هدا الكود على ما اضن ( لم افهمه ) هل لجلب عدد خانات المصفوفة التي تم ملئها ووضعه في متغير count

بعده تبدأ الحلقة

 mov eax,[hMods+ecx*4]
                        mov ebx,eax

هنا جلب اول مقبض ووضعه في ebx لان eax يتغير

اما الباقي فلم افهمه جيدا ، حلقة في حلقة خربقت لي دماغي :wacko:

 mov esi,ecx
                        mov edi,esi
                        inc esi
                        .while esi < count
                                mov edx,[hMods+esi*4]
                                .if edx < eax
                                        mov eax,edx
                                        mov edi,esi
                                .endif
                                inc esi
                        .endw
                        mov [hMods+ecx*4],eax
                        mov [hMods+edi*4],ebx
                        inc ecx
                .endw

                mov esi,cb
                xor edi,edi
                .while (edi < esi)

لو امكن ان تشرح لي الهدف من كل حلقة او اعطائي خوارزمية للكود

اضن ان حلقة واحدة تنفع في اسخراج جميع المقابض وفي كل خطوة نزيد ecx ونقفز الى البداية وبهدا سيتم جلب المقبض التالي

#6

بالنسبة للجزء الذي لم تفهمه، انظر فقط عن أي خوارزمية ترتيب من الأصغر إلى الأكبر.

تكون غالباً مبنية على الأساس التالي:

1. اعتبر أول عنصر هو الأصغر.

2. ابدأ البحث في العناصر التالية له، العنصر التالي أصغر؟ نعم، اعتبر أنه الأصغر بالتبديل بينهما.

3. انتقل إلى العنصر التالي له، (الإزاحة Mods+ESI*4)، هل هو أصغر؟ نعم، اعتبر أنه الأصغر بالتبديل بينهما.

4. وهكذا.

5. انتهت أول حلقة، حصلت على أصغر عنصر في القائمة ووضعته في أول خانة في الجدول. لكن لم يتم ترتيب القائمة كاملة بعد، ابدأ الآن حلقة جديدة (ذات سابقتها) عند العنصر الثاني (لأن الأول أصبح الأصغر وتم الانتهاء منه)، وابدأ البحث عن أصغر عنصر فيها، تابع ذات الخطوات 2-3-4 حتى تحصل على أصغر عنصر فيها وضعه في الخانة الثانية.

6. أعد الأمر مع حلقات جديدة دوماً باعتبار العنصر الأصغر هو أول عنصر في القائمة التالية (التي تكون متناقصة n-1, n-2, ..) حتى تنتهي من المقارنات والتبديل البالغ عددها mimetex.cgi?\frac{n(n-1)}{2}

Do as I say, not as I do

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

#7

السلام عليكم

شكرا اخي Xacker على التوضيح رغم اني لم افهم منه الا القليل :unsure:

اضن ان شرح الكود سيكون افضل :happy:

لنرجع للكود

فهمت الان بعض الامور منه :

invoke EnumProcessModules,hProcess,addr hMods,sizeof hMods,addr cb

بعد استعمال الدالة EnumProcessModules ستقوم بجلب جميع المقابض ووضعها في المصفوفة hMods تم وضع حجم الممصفوفة بعد ملإها في cb

الامر التي الدي سنقوم به هو حساب عدد خانات المصفوفة ودالك بقسمة حجمها المخزن في cb على 4

وهدا ما يقوم به هدا الكود :

xor edx,edx
                mov ebx,4
                mov eax,cb
                div ebx  
                mov count,eax

تم هنا مقارنة المصفوفة مع 0 يعني لم ترجع الدالة EnumProcessModules اي مقابض وبالتالي القفز عن الحلقات وعدم اضهار شيئ

 cmp [hMods],0
                jz @F

الان ندخل في حلقة جلب المقابض واحد تل والاخر

  xor ecx,ecx
                .while ecx < count
                        mov eax,[hMods+ecx*4]
                        mov ebx,eax
                        mov esi,ecx
                        mov edi,esi

السطر الاول تصفير ecx لاستعماله كعداد , المتغير cout يحمل عدد خانات المصفوفة

بما ان ecx اصغر من cout نقوم بجلب اول مقبض يعني اول خانة ( ecx = 0 ) // 0x4

الان اول مقبض تم وضعه في ebx

ومن هنا بدأت الحسابات تتبعتر بما ان ebx يحمل اول مقبض فلمادا اسعملنا الحلقتين السابقتين :huh:

من المفروض ان يكون الكود هكدا :

 invoke EnumProcessModules,hProcess,addr hMods,sizeof hMods,addr cb
                xor edx,edx
                mov ebx,4
                mov eax,cb
                div ebx  
                mov count,eax
                cmp [hMods],0
                jz @F
                xor ecx,ecx
                Continue:
                cmp ecx,count
                je @F

                        mov eax,[hMods+ecx*4]
                        mov ebx,eax


                        mov LVI.iSubItem,0
                        invoke wsprintf,addr lpBuffer,CTXT("%08X"),ebx
                        invoke SendMessage,hMList,LVM_INSERTITEM,NULL,addr LVI


                        inc LVI.iSubItem
                        invoke GetModuleFileNameEx,hProcess,ebx,addr lpBuffer,260
                        invoke SendMessage,hMList,LVM_SETITEM,NULL,addr LVI


                        inc LVI.iItem
                        inc ecx
                        jmp Continue

في انتضار التفسير وشكرا

تم تعديل هذه المشاركة بواسطة soufianosse في 18 ديسمبر 2009 في 18:11

#8

اخي X ممكن مساعدة ؟ :mellow:

#9

لا يوجد من يشرح لي :mellow:

اليس من حق المبتدأ ان يسأل ؟

#10

أخي سفيان راجع هذا العرض التوضيحي:

http://www.cs.oswego.edu/~mohammad/classes/csc241/samples/sort/Sort2-E.html

الخوارزمية التي تراها في الكود السابق هي خوارزمية Selection Sort وهناك العديد سواها التي هي أسرع منها للقوائم الكبيرة.

بالمناسبة MASM يحوي على عدة خوارزميات sorting مكتوبة ومضمنة معه في مجلد m32lib والـ prototypes في ملف masm32.inc في ذات المجلد.

Do as I say, not as I do

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

#11

جاري المشاهدة اخي Xacker لكن لا تقلي انه انجليزي :wacko:

#12

جيد جدا اخي ساحاول البحت اكتر عن هده الخوارزمية

#13

لا تنسى أن تغيّر الخيار إلى SelectSort في قائمة Sort Kind ثم تشغّل العرض.

Do as I say, not as I do

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

#14

بصراحة اخي شاهدت المقطع عدة مرات لكني ما فهمت هده الخوارزمية

من الناحية النضرية شبه مفهوم :wacko:

سالخص لك ما فهمت

نفترض ان لدينا مصفوفة تتكون من 5 خنات 5،3،8،4،6

نقوم باخد الخانة 1 يعني "3" نقارنها مع التي قبلها يعني سنقارن 3 و 5 نستنتج ان 3 اصغر من 5 يعني نضع 3 مكان 5 و 5 مكان 3

تصبح المصفوفة هكدا 6 4 8 5 3

ونكمل هل 5 اصغر من 8 ، نعم ادن لا شيئ

هل 8 اصغر من 4 نعم ادن نقلبهما فتصبح 6 8 4 5 3

تم نرجع هل 4 اصغر من 5 نعم ادن نقلبهما 6 8 5 4 3 , تم هل 4 اصغر من 3 لا ادن لا شيئ

تم نقارن 5 مع 8 ، 5 اصغر من 8 ادن لا شيئ تم نقارن 8 مع 6 ، 6 اصغر من 8 يعني نقلب مكانهما ونرجع لنقارن 6 مع 5 وهكدا

بالنسبة للكود لما اقرئه اصاب بدوار :wacko:

الخوارزمية هده تحتاج شرحا اكتر اخي Xacker ارجو منك دالك :mellow:

تم تعديل هذه المشاركة بواسطة soufianosse في 20 ديسمبر 2009 في 03:45

#15
soufianosse كتب:

بصراحة اخي شاهدت المقطع عدة مرات لكني ما فهمت هده الخوارزمية

من الناحية النضرية شبه مفهوم لكن التطبيقي على الكود اصاب بدوار :wacko:

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

أخي ما شاهدته هو Bubble sort

قم بتغيير الخيار Sort kind إلى Select sort

واقرأ الخوارزمية المكتوبة بالجافا بهدوء:)

Do as I say, not as I do

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

#16

اوكي سأحاول مرة اخرى

هادي يلزمها كاس قهوة :lol:

#17

امممم لقد فهمتها الان بنسبة 70 % :lol:

يبدو ان الوقت متؤخرا غدا بادن الله سحاول فهمها جيدا وتطبيقها على الاسمبلي :blush:

#18
soufianosse كتب:

بصراحة اخي شاهدت المقطع عدة مرات لكني ما فهمت هده الخوارزمية

من الناحية النضرية شبه مفهوم :wacko:

سالخص لك ما فهمت

نفترض ان لدينا مصفوفة تتكون من 5 خنات 5،3،8،4،6

نقوم باخد الخانة 1 يعني "3" نقارنها مع التي قبلها يعني سنقارن 3 و 5 نستنتج ان 3 اصغر من 5 يعني نضع 3 مكان 5 و 5 مكان 3

تصبح المصفوفة هكدا 6 4 8 5 3

ونكمل هل 5 اصغر من 8 ، نعم ادن لا شيئ

هل 8 اصغر من 4 نعم ادن نقلبهما فتصبح 6 8 4 5 3

تم نرجع هل 4 اصغر من 5 نعم ادن نقلبهما 6 8 5 4 3 , تم هل 4 اصغر من 3 لا ادن لا شيئ

تم نقارن 5 مع 8 ، 5 اصغر من 8 ادن لا شيئ تم نقارن 8 مع 6 ، 6 اصغر من 8 يعني نقلب مكانهما ونرجع لنقارن 6 مع 5 وهكدا

بالنسبة للكود لما اقرئه اصاب بدوار :wacko:

الخوارزمية هده تحتاج شرحا اكتر اخي Xacker ارجو منك دالك :mellow:

حاول ألا تحرر مشاركتك وتضيف عليها عندما يكون هناك رد عليها، بالنسبة لي ربما لا ألاحظ إلا صدفة أنك قمت بالتحرير..

المهم، خوارزمية selection sort حسب الأرقام التي وضعتها ستكون بالشكل التالي:

data = 5,3,8,4,6

min = 5

is min > 3 ? yes -> min = 3, min_id = 1

is min > 8 ? no -> check next

is min > 4 ? no -> check next

is min > 6 ? no -> check next

inner loop ended

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

tmp = 5

data[0] = data[min_id] = 3

data[min_id] = 5

data: 3,5,8,4,6

outter loop ended

min = 5

is min > 8 ? no -> check next

is min > 4 ? yes -> min = 4, min_id = 3

is min > 6 ? no -> check next

inner loop ended

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

tmp = 5

data[1] = data[min_id] = 4

data[min_id] = 5

data: 3,4,8,5,6

outter loop ended

min = 8

is min > 5 ? yes -> min = 5, min_id = 3

is min > 6 ? no -> check next

inner loop ended

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

tmp = 8

data[2] = data[min_id] = 5

data[min_id] = 8

data: 3,4,5,8,6

outter loop ended

min = 8

is min > 6 ? yes -> min = 6, min_id = 4

inner loop ended

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

tmp = 8

data[3] = data[min_id] = 6

data[min_id] = 8

data: 3,4,5,6,8

outter loop ended

وأنا أعتذر عن سوء التعبير لكن أتمنى أن تصبح أوضح هذه المرة.

هل تلاحظ وجود حلقتين؟

الأولى للمرور على كامل عناصر المصفوفة من i حتى n-1، والثاني للمرور على كامل عناصر المصفوفة من i+1 حتى n.

تم تعديل هذه المشاركة بواسطة Xacker في 20 ديسمبر 2009 في 06:50 — السبب: إعادة الصياغة

Do as I say, not as I do

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

#19

نعم هدا ما كنت ابحت عنه ، الخوارزمية قبل الكود :P

الان اصبحت واضحة جدا :happy:

بارك الله فيك يا X

#20

جيد جداً، مبروك ^_^

Do as I say, not as I do

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

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