اقترح ان نستخدم Fasm
لانه خفيف في التحميل و اكثر مرونة
اقترح ان نستخدم Fasm
لانه خفيف في التحميل و اكثر مرونة
قطرة الماء تـثـقب الحجر.. لا بالعنف. لكن بتكرار المحاولة
منتديات الفريق العربي للهندسة العكسية 不喜欢的勿入! www.at4re.com
اقترح ان نستخدم Fasm
لانه خفيف في التحميل و اكثر مرونة
اقترح ان نستخدم Fasm
لانه خفيف في التحميل و اكثر مرونة
قطرة الماء تـثـقب الحجر.. لا بالعنف. لكن بتكرار المحاولة
منتديات الفريق العربي للهندسة العكسية 不喜欢的勿入! www.at4re.com
لم استخدم سوى Masm من قبل..
وقرات فقط شفرات لـ nasm دون الكتابة فيه
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
بدأت منذ قليل وعذرا على التأخير في الموضوع فقد كنت في حالة سفر كثيرة في هذا الاسبوع وعدت الان الى الاستقرار في المنزل
الان استطيع ان اكتب متى اردت وما اردت فكافة المراجع والملفات التي احتاجها لدي
start: invoke GetModuleHandle, NULL mov hInstance, eax invoke GlobalAlloc, GMEM_FIXED, 1 mov Drives, eax invoke GetLogicalDriveStrings, NULL, Drives mov nDSize, ax push eax push eax invoke GlobalFree, Drives pop eax invoke GlobalAlloc, GMEM_FIXED, eax mov Drives, eax pop eax invoke GetLogicalDriveStrings, eax, Drives mov edi, Drives xor esi, esi sub esi, 4 @@: add esi, 4 cmp si, nDSize ja @F add edi, esi invoke GetDriveType, edi cmp eax, 3 jne @B invoke SetCurrentDirectory, edi invoke FindFirstFile, addr any, addr hFile cmp eax, -1 je _Err_nofile lea eax, hFile add eax, 11*4 invoke CreateFile, eax, GENERIC_READ + GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL mov hCurFile, eax invoke CreateFileMapping, eax, NULL, PAGE_READWRITE, NULL, NULL, NULL mov hMap, eax invoke MapViewOfFile, eax, FILE_MAP_READ + FILE_MAP_WRITE, NULL, NULL, NULL mov fMap, eax push eax mov ax, word ptr [eax] cmp ax, "ZM" ; rest of code goes here _Err_nofile: jmp @B @@:
include windows.inc include kernel32.inc include user32.inc includelib kernel32.lib includelib user32.lib DlgProc PROTO :HWND,:UINT,:WPARAM,:LPARAM .const IDD_DIALOG1 equ 101 ;######################################################################### .data? hInstance dd ? Drives dd ? nDSize dw ? hFile dd 13 dup(?) hCurFile dd ? hMap dd ? fSize dd ? fMap dd ? ;######################################################################### .data any db "*.exe",0
بدات بتحديد السواقات الموجودة واختيار السواقات الصلبة منها لنبدا عملية مسح المجلدات الرئيسية والفرعية للبحث على كافة الملفات التنفيذية لنبدا عملية فحصها لو كانت محمية سلفا او ليس بعد لحساب قيمة الـ CRC ووضعها في مكان نحدده في الملف.
الشفرة قصيرة.. لكنها نتاج النصف ساعة الاخيرة بعد ان وصلت المنزل
ساتابع الموضوع لاحقا ان شاء الله
تم تعديل هذه المشاركة بواسطة Xacker في 6 فبراير 2007 في 00:01
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
مازلت اقرا في الكود واتفحصه لكن
اعتقد ان هذه التعليمة لا حاجة لنا بها
add edi, esi
لانه في تلك المرحلة تكون قيمة esi صفرا.
...
من بعد اذن x سالقوم بوضع بعض التعليقات لشرح الكود اكثر.
start: invoke GetModuleHandle, NULL; نريد الحصول على مقبض للـمودل التي نعمل عليها حاليا mov hInstance, eax; ننقل المقبض الى متغير ما invoke GlobalAlloc, GMEM_FIXED, 1 هنا نقوم بحجز واحد بايت من الذاكرة الـ"ثابتة" والقيمة المرجعة هي مقبض لمتغيرالذاكرة المجوز mov Drives, eax; يتم نقل المقبص الى المسجل invoke GetLogicalDriveStrings, NULL, Drives; هذه الدالة تقوم بوضع "سترنج" في بافر نحدده من خلال البارامتر الثاني وهذه السترنج تكون بالشكل التالي مثلا c:\<null>d:\<null><null> mov nDSize, ax; القيمة المرجعة هي طول السترنج push eax push eax invoke GlobalFree, Drives pop eax invoke GlobalAlloc, GMEM_FIXED, eax; مرة اخرى نحجز جزء من الذاكرة حجمه هو حجم تلك السترنج mov Drives, eax; القيمة المرجعة هي مقبض لهذا المتغير من الذاكرة pop eax invoke GetLogicalDriveStrings, eax, Drives; mov edi, Drives xor esi, esi sub esi, 4 @@: add esi, 4 cmp si, nDSize ja @F add edi, esi invoke GetDriveType, edi; هنا نود معرفة نوع الدرايف هل ه قرص صلب او مرن او او او cmp eax, 3; هل هو قرص صلب؟ jne @B invoke SetCurrentDirectory, edi; هنا نقوم بتغيير الدايركتوري الحالية invoke FindFirstFile, addr any, addr hFile; سنبحث عن ملف اسمه مخزن في البارامتر الاول والمعلومات المرجعة ستخزن في البارامتر الثاني cmp eax, -1; هل وجد الملف ام لا؟ je _Err_nofile lea eax, hFile add eax, 11*4 invoke CreateFile, eax, GENERIC_READ + GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL mov hCurFile, eax; مقبض للملف الذي عثرنا عليه ******************** invoke CreateFileMapping, eax, NULL, PAGE_READWRITE, NULL, NULL, NULL mov hMap, eax invoke MapViewOfFile, eax, FILE_MAP_READ + FILE_MAP_WRITE, NULL, NULL, NULL mov fMap, eax push eax mov ax, word ptr [eax] cmp ax, "ZM" ; rest of code goes here _Err_nofile: jmp @B @@:
كل ما يلي علامة الـ ********* لم افهمه
امر اخر..دالة
GetLogicalDriveStrings
حين استخدمناها للمرة الثانية فلا اعرف لماذا استخدمناها
يعني في الرمة الاولى استدعيناها وكان البارامتر الاول الذي هو طول السترنج المرجعة ، كان null
وفي الحالة الثانية كان يساوي طول السترج المرجعة....ممممم....ما الغرض من ذلك؟؟
تم تعديل هذه المشاركة بواسطة allko في 7 فبراير 2007 في 04:42
السلام عليكم ورحمة الله وبركاته, كنت أتوقع أن أرى أيدي أكثر مرتفعه للعمل.. بأي حال
بالنسبة لسؤالك أخي allko, في المرة الأولى استخدمتها لتحديد حجم الـ buffer فقط التي ساحتاجها لوضع محارف السواقات فيها
في المرة الثانية قمت بتحديد عنوان تلك الـ buffer ونفذت الدالة كي استعيد المحارف المطلوبة.
خلال الفترة التي تغيبت فيها كتبت المزيد وعدلت بعض ما كتبت سابقا
لم اضع كامل التعليقات لانشغالي مؤخرا
ما يلي كتبته على 3 ايام بشكل متقطع ثم انقطعت من تاريخ 9 - شباط عن الموضوع
.586 .model flat, stdcall option casemap :none include AT2kAV.inc .code start: invoke GetModuleHandle, NULL mov hInstance, eax ; locate drives strings invoke GlobalAlloc, GMEM_FIXED, 1; allocate 1 byte of memory to use it as a NULL to ; define the number of the drives mov Drives, eax invoke GetLogicalDriveStrings, NULL, Drives; the return is the length of the lpBuffer that we need mov nDSize, ax push eax; \ save it to use it later push eax; / invoke GlobalFree, Drives; free the small lpBuffer pop eax; restore the lpBuffer length to EAX invoke GlobalAlloc, GMEM_FIXED, eax; allocate the required buffer mov Drives, eax; save the address pop eax; restore lpBuffer length to EAX invoke GetLogicalDriveStrings, eax, Drives; return the drives strings mov edi, Drives sub dLeft, 4 _checkfixed: add dLeft, 4 mov ax, dLeft mov cx, nDSize cmp ax, cx ja _nomore_drives add di, dLeft invoke GetDriveType, edi; get mapped drive letter type cmp eax, 3 ; not fixed drive? (HDD drives > 3, Removable drives > 2, Media drives > 5) ; reverse engineering your game can be quite usefull :) jne _checkfixed; return if not fixed _fetch: invoke SetCurrentDirectory, edi; set mapped drive as lpPathName, the start point for the search .if (mGlobal != 0); a check to deallocate some mapped memory that is no longer needed invoke GlobalFree, mGlobal .endif invoke FindFirstFile, addr exec, addr hFile; search for an executable in the current directory (lpPathName) cmp eax, -1; no single file found!? je _nofile; ok go search for a directory mov hSearchF, eax lea eax, hFile call check_sign; check if the file is signed already @@: invoke FindNextFile, hSearchF, addr hFile; search for another test eax, eax; no more files? je _nofile; ok go search for a directory ; check if it's a file or directory lea eax, hFile call check_sign; check if the file is signed already jmp @B; return to search for other executables in the current directory _nofile: ; search another directory invoke FindClose, hSearchF invoke FindFirstFile, addr all, addr hDir; search for all files and directories "*.*" cmp eax, -1 je _nofile mov hSearchD, eax lea eax, hDir call check_sign _fetch_another: invoke FindNextFile, hSearchD, addr hDir; search for next test eax, eax je _nomore lea eax, hDir; load EAX with hFile address cmp byte ptr [eax], 10h; and check if the found is a directory je @F ; true > directory lea eax, hDir call check_sign; otherwise, check if it's an executable and if it's signed jmp _fetch_another; return to search for other files and directories @@: add eax, 11*4; EAX still holds hFile address ; hFile holds information about the file/directory found ; at (11*4) offset of hFile resides the name of the file/directory cmp byte ptr [eax], "."; check if it's the r00t directory "\.." or current directory prefix "\." je _fetch_another; g0t r00t? fetch next! invoke GetCurrentDirectory, NULL, NULL; get current directory string length (when params are NULL) mov esi, eax push esi; save the length lea ecx, hDir add ecx, 11*4 invoke lstrlen, ecx; return the file/directory found length add eax, esi; all together need..? mov esi, eax invoke GlobalAlloc, GMEM_FIXED, eax; allocate enough memory mov mGlobal, eax; store the memory address push eax invoke GetCurrentDirectory, esi, eax; return the current directory path pop edi pop ecx push edi add edi, ecx dec edi lea esi, hDir add esi, 11*4 invoke lstrlen, esi mov ecx, eax rep movsb byte ptr [edi], byte ptr [esi]; and append the found file/folder to that path mov byte ptr [edi], 0; null terminate it pop edi jmp _fetch; return to fish other fish! _nomore: invoke GetCurrentDirectory, NULL, NULL push eax add eax, 2 invoke GlobalAlloc, GMEM_FIXED, eax mov mGlobal, eax pop esi push eax invoke GetCurrentDirectory, esi, eax pop eax add eax, esi dec eax mov word ptr [eax], ".." mov word ptr [eax+2], 0 jmp _fetch_another _nomore_drives: invoke GlobalFree, Drives invoke FindClose, hSearchD invoke ExitProcess, 0 check_sign proc near add eax, 11*4 push eax invoke lstrlen, eax sub eax, 4 pop edx push edx add edx, eax mov esi, dword ptr [edx] pop eax lea edi, exe mov edi, dword ptr [edi] cmp esi, edi je _not_signed lea edi, EXE mov edi, dword ptr [edi] cmp esi, edi jne _signed _not_signed: invoke GetCurrentDirectory, NULL, NULL mov esi, eax push esi lea ecx, hFile add ecx, 11*4 invoke lstrlen, ecx add eax, esi inc eax mov esi, eax invoke GlobalAlloc, GMEM_FIXED, eax mov mGlobal, eax push eax invoke GetCurrentDirectory, esi, eax pop edi pop ecx mov byte ptr [edi+ecx-1], "\" push edi add edi, ecx lea esi, hFile add esi, 11*4 invoke lstrlen, esi mov ecx, eax rep movsb byte ptr [edi], byte ptr [esi] mov byte ptr [edi], 0 pop edi invoke CreateFile, edi, GENERIC_READ + GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL mov hCurFile, eax invoke CreateFileMapping, eax, NULL, PAGE_READWRITE, NULL, NULL, NULL mov hMap, eax invoke MapViewOfFile, eax, FILE_MAP_READ + FILE_MAP_WRITE, NULL, NULL, NULL mov fMap, eax invoke GetFileSize, hCurFile, NULL mov fSize, eax sub eax, 8 mov ecx, fMap add eax, ecx cmp word ptr [eax], "TA"; reversed "AT == ArabTeam" je _signed add eax, 6 cmp word ptr [eax], "K2"; reversed "2K == 2000" je _signed ; time to sign call sign _signed: invoke GlobalFree, mGlobal ret check_sign endp sign proc near invoke CRC32, fSize, fMap mov crc32sign, eax mov eax, fSize add eax, 8 invoke SetFilePointer, hCurFile, eax, NULL, FILE_BEGIN invoke UnmapViewOfFile, fMap invoke CloseHandle, hMap invoke SetEndOfFile, hCurFile invoke CreateFileMapping, hCurFile, NULL, PAGE_READWRITE, NULL, NULL, NULL mov hMap, eax invoke MapViewOfFile, eax, FILE_MAP_READ + FILE_MAP_WRITE, NULL, NULL, NULL mov fMap, eax invoke GetFileSize, hCurFile, NULL mov fSize, eax mov eax, fMap add eax, fSize sub eax, 8 mov word ptr [eax], "TA" add eax, 2 mov ecx, crc32sign bswap ecx mov dword ptr [eax], ecx add eax, 4 mov word ptr [eax], "K2" invoke CloseHandle, hMap invoke SetFilePointer, hCurFile, 0, NULL, FILE_BEGIN mov eax, fSize invoke WriteFile, hCurFile, fMap, eax, addr nSize, NULL invoke UnmapViewOfFile, fMap invoke CloseHandle, hCurFile ret sign endp CRC32 proc lData:DWORD, ptrData:DWORD push esi push ecx push edx mov esi, ptrData xor edx, edx or eax, -1 mov ecx, lData CRC32_loop: mov dl, byte ptr [esi] xor dl, al shr eax, 8 xor eax, dword ptr [crc32_table + 4*edx] inc esi dec ecx jnz CRC32_loop not eax pop edx pop ecx pop esi ret CRC32 endp end start
include windows.inc include kernel32.inc include user32.inc include dbghelp.inc includelib kernel32.lib includelib user32.lib includelib dbghelp.lib DlgProc PROTO :HWND,:UINT,:WPARAM,:LPARAM CRC32 PROTO :DWORD, :DWORD .const IDD_DIALOG1 equ 101 .data? hInstance dd ? Drives dd ? nDSize dw ? hFile dd 13 dup(?) hDir dd 13 dup(?) hCurFile dd ? hMap dd ? fSize dd ? nSize dd ? fMap dd ? crc32sign dd ? hSearchF dd ? hSearchD dd ? mGlobal dd ? dLeft dw ? .data exec db "*.exe",0 exe db ".exe",0 EXE db ".EXE",0 all db "*.*",0 ; initialization seeds by WiteG crc32_table dd 000000000h, 077073096h, 0EE0E612Ch, 0990951BAh, 0076DC419h, 0706AF48Fh, 0E963A535h, 09E6495A3h, 00EDB8832h, 079DCB8A4h dd 0E0D5E91Eh, 097D2D988h, 009B64C2Bh, 07EB17CBDh, 0E7B82D07h, 090BF1D91h, 01DB71064h, 06AB020F2h, 0F3B97148h, 084BE41DEh dd 01ADAD47Dh, 06DDDE4EBh, 0F4D4B551h, 083D385C7h, 0136C9856h, 0646BA8C0h, 0FD62F97Ah, 08A65C9ECh, 014015C4Fh, 063066CD9h dd 0FA0F3D63h, 08D080DF5h, 03B6E20C8h, 04C69105Eh, 0D56041E4h, 0A2677172h, 03C03E4D1h, 04B04D447h, 0D20D85FDh, 0A50AB56Bh dd 035B5A8FAh, 042B2986Ch, 0DBBBC9D6h, 0ACBCF940h, 032D86CE3h, 045DF5C75h, 0DCD60DCFh, 0ABD13D59h, 026D930ACh, 051DE003Ah dd 0C8D75180h, 0BFD06116h, 021B4F4B5h, 056B3C423h, 0CFBA9599h, 0B8BDA50Fh, 02802B89Eh, 05F058808h, 0C60CD9B2h, 0B10BE924h dd 02F6F7C87h, 058684C11h, 0C1611DABh, 0B6662D3Dh, 076DC4190h, 001DB7106h, 098D220BCh, 0EFD5102Ah, 071B18589h, 006B6B51Fh dd 09FBFE4A5h, 0E8B8D433h, 07807C9A2h, 00F00F934h, 09609A88Eh, 0E10E9818h, 07F6A0DBBh, 0086D3D2Dh, 091646C97h, 0E6635C01h dd 06B6B51F4h, 01C6C6162h, 0856530D8h, 0F262004Eh, 06C0695EDh, 01B01A57Bh, 08208F4C1h, 0F50FC457h, 065B0D9C6h, 012B7E950h dd 08BBEB8EAh, 0FCB9887Ch, 062DD1DDFh, 015DA2D49h, 08CD37CF3h, 0FBD44C65h, 04DB26158h, 03AB551CEh, 0A3BC0074h, 0D4BB30E2h dd 04ADFA541h, 03DD895D7h, 0A4D1C46Dh, 0D3D6F4FBh, 04369E96Ah, 0346ED9FCh, 0AD678846h, 0DA60B8D0h, 044042D73h, 033031DE5h dd 0AA0A4C5Fh, 0DD0D7CC9h, 05005713Ch, 0270241AAh, 0BE0B1010h, 0C90C2086h, 05768B525h, 0206F85B3h, 0B966D409h, 0CE61E49Fh dd 05EDEF90Eh, 029D9C998h, 0B0D09822h, 0C7D7A8B4h, 059B33D17h, 02EB40D81h, 0B7BD5C3Bh, 0C0BA6CADh, 0EDB88320h, 09ABFB3B6h dd 003B6E20Ch, 074B1D29Ah, 0EAD54739h, 09DD277AFh, 004DB2615h, 073DC1683h, 0E3630B12h, 094643B84h, 00D6D6A3Eh, 07A6A5AA8h dd 0E40ECF0Bh, 09309FF9Dh, 00A00AE27h, 07D079EB1h, 0F00F9344h, 08708A3D2h, 01E01F268h, 06906C2FEh, 0F762575Dh, 0806567CBh dd 0196C3671h, 06E6B06E7h, 0FED41B76h, 089D32BE0h, 010DA7A5Ah, 067DD4ACCh, 0F9B9DF6Fh, 08EBEEFF9h, 017B7BE43h, 060B08ED5h dd 0D6D6A3E8h, 0A1D1937Eh, 038D8C2C4h, 04FDFF252h, 0D1BB67F1h, 0A6BC5767h, 03FB506DDh, 048B2364Bh, 0D80D2BDAh, 0AF0A1B4Ch dd 036034AF6h, 041047A60h, 0DF60EFC3h, 0A867DF55h, 0316E8EEFh, 04669BE79h, 0CB61B38Ch, 0BC66831Ah, 0256FD2A0h, 05268E236h dd 0CC0C7795h, 0BB0B4703h, 0220216B9h, 05505262Fh, 0C5BA3BBEh, 0B2BD0B28h, 02BB45A92h, 05CB36A04h, 0C2D7FFA7h, 0B5D0CF31h dd 02CD99E8Bh, 05BDEAE1Dh, 09B64C2B0h, 0EC63F226h, 0756AA39Ch, 0026D930Ah, 09C0906A9h, 0EB0E363Fh, 072076785h, 005005713h dd 095BF4A82h, 0E2B87A14h, 07BB12BAEh, 00CB61B38h, 092D28E9Bh, 0E5D5BE0Dh, 07CDCEFB7h, 00BDBDF21h, 086D3D2D4h, 0F1D4E242h dd 068DDB3F8h, 01FDA836Eh, 081BE16CDh, 0F6B9265Bh, 06FB077E1h, 018B74777h, 088085AE6h, 0FF0F6A70h, 066063BCAh, 011010B5Ch dd 08F659EFFh, 0F862AE69h, 0616BFFD3h, 0166CCF45h, 0A00AE278h, 0D70DD2EEh, 04E048354h, 03903B3C2h, 0A7672661h, 0D06016F7h dd 04969474Dh, 03E6E77DBh, 0AED16A4Ah, 0D9D65ADCh, 040DF0B66h, 037D83BF0h, 0A9BCAE53h, 0DEBB9EC5h, 047B2CF7Fh, 030B5FFE9h dd 0BDBDF21Ch, 0CABAC28Ah, 053B39330h, 024B4A3A6h, 0BAD03605h, 0CDD70693h, 054DE5729h, 023D967BFh, 0B3667A2Eh, 0C4614AB8h dd 05D681B02h, 02A6F2B94h, 0B40BBE37h, 0C30C8EA1h, 05A05DF1Bh, 02D02EF8Dh
history :P
+ History: ========== Feb/05/07: started, 25 lines of code before I leave the city, problems? some, expected problems? alot! --------------------------- Feb/06/07: code increased, now hitting 200 lines, problems? solved, expected problems? alot! --------------------------- Feb/07/07: code hits 225, it's 8:38am in the morning, just return from a meeting! *cough* 8:40am > problems? not at the moment, in the horizon? oh yes, it's easy to locate subdirectories, and to search them for executables but how am I supposed to ease the process of "getting out" !? :/ 8:41am > right now? calling my girlfriend.. sshhhhhhhhhh :x (she will know what to do;) 8:45am > ZZzzzZZZZzzzzzzzZz, huh? :L 10:11am > something went wrong, FindNextFile is causing an unexpected exception.. falling on some FEEFEFFE page read error.. where did that came from? :/ I need to investigate more .. after another warm cup of Nescafe to light me up 276 lines of code reached.
لكن هناك مشكلة في FindNextFile عند استخدامها بعد عدة مرات
أخي dj-siba لو وجدت مكان الخلل أخبرني لأني أمضيت يومها النهار بطوله أحاول تفاديه ولم أستطع إيجاده.
السلام عليكم
لنا عودة لاحقاُ
تم تعديل هذه المشاركة بواسطة Xacker في 13 فبراير 2007 في 17:54
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
اتصور انه من المفيد وضع المشروع بملفاته مع الملف التنفيذي.. لم ارغب بوضعه كي لا يحمله البعض معتقدين انه النسخة "الاخيرة :P " ويرموه الى الرف دون تفحص او ادراك لماهيته..
باي حال, للمهتمين.. مكتوب بـ RadAsm (غيرت رأيي, ملّيت حتى ركز الـ syntax highlight بـ winasm :^) )
السلام عليكم
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
ما رأيكم بعمل بيئة تطوير للاسمبلي شئ شبيه ب Winasm او Radasm
مشروع يكون مفتوح المصدر ويشترك فيه جميع اعضاء النتدي
صحيح انا مش محترف او حتي متوسط ببرمجة الاسمبلي لكن اعدكم ان اساعد في هذا المشروع
الموضوع ليس بالسهل, نستطيع لو أردنا لاحقاُ القيام بمثل هذا المشروع سبر الخبرات من خلال الحالي, هذا رأيي.
والله أعلم
السلام عليكم
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
صحيح ليس سهل لكن مع مشروع كهذا يستطيع اعضاء المنتدي تطوير خبراتهم وقدراتهم وفي نفس الوقت تحقيق انجاز كبير
انظر الى اعضاء المنتدى كيف "ينظرون" فقط الى الموضوع.
لن تاخذ سوى الكلام مهما كان المشروع.
وكما قلت, هذا بداية الطريق, وليس اخره
السلام عليكم
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
شكرا لاهتمامك ..
ارجوا ان يأتي وقت نستطيع فيه القيام بهذا المشروع وغيره
طالما لا يوجد تفاعل ساقوم بإزالة الموضوع من التثبيت.
السلام عليكم
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
اعتقد ان الموضوع في بداية الطريق الذي سلكه كل المشاريع العربي
طريق الزوال و فشل المشروع
و اكرر هذا اعتقاد
من الافضل ان تتخذوا الخطوات الجادة و العلمية في عمل المشروع
اي تحليل المشروع و الخطط التي تسيرون عليها
اذا كان بدون خطوات محددة فالطريق معروف
=>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>a very far place
مفيش توقيع
MAE كتب:اعتقد ان الموضوع في بداية الطريق الذي سلكه كل المشاريع العربيطريق الزوال و فشل المشروع
و اكرر هذا اعتقاد
من الافضل ان تتخذوا الخطوات الجادة و العلمية في عمل المشروع
اي تحليل المشروع و الخطط التي تسيرون عليها
اذا كان بدون خطوات محددة فالطريق معروف
=>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>a very far place
المشاريع العربية تذهب الى a very far place لان لا أحد يفهم ما معنى مشروع, والكل ينظر من زاويته إلى الأمر
"حسنا, كتبنا AV, ماذا استفيد"
والامر مجرد وقت حتى تذهب كل الطاقات العربية "المتبقية" الى another, very far place
السلام عليكم
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
اسف اخ Xacker لم استطع المشاركة بسبب انشغالي بمنتديات الفريق العربي للهندسة العكسية AT4RE
سارفع الموضوع عندما اجد فرصة
والسلام عليكم ورحمة الله وبركاته
قطرة الماء تـثـقب الحجر.. لا بالعنف. لكن بتكرار المحاولة
منتديات الفريق العربي للهندسة العكسية 不喜欢的勿入! www.at4re.com
أنا أرى قبل البدء بالمشروع أن يتم الحديث بإسهاب أكثر عليه والاتفاق على الصيغة الخوارزمية
كتحديد بداية الانطلاق والاتفاق على تقسيم الاجزاء المختلفة وتحديد الشكل العام بتفصيل أكبر
أنا لما شفت الدخول المباشر في الكود لم أعرف ما هو شكل الاجزاء وترتيبها انا رايي نتكلم بشكل اكبر عنه
يعني مثلا :
1)البحث عن الاقراص الصلبة في الجهاز.
2)البحث عن الملفات التنفيذية داخل القرص والمجلدات الموجودة (أي نوع ملف تنفيذي يهدف له المشروع exe,dll,ocx ).
3) في حال وجود ملف تنفيذي نقوم بالتأكد من وجود crc البرنامج الخاص بنا فيه
فإذا كان موجودا يتم التغاضي عنه , وان لم يكن موجودا نقوم بعمل الcrc الخاص به وحقن الكود الخاص داخل الcaves
(ماذا لو كان على الملف التنفيذي حماية مثل ملفات الكاسبر؟،ماذا لو كان الملف يحتوي على crc خاص به واذا أضفنا له الكود
لم يعمل ألا يجدر عمل نسخة backup1 للملفات التنفيذية قبل التعديل عليها بحال اذا حدث عطب معين نقوم باسترجاع الملف؟ ولكن هذا سيؤدي الا أخذ
مساحة كبيرة من الهارد).
4)بعد عمل crc يجب وضع backup2 للملف بصيغته الجديدة بعد المرور بالخطوات السابقة بنجاح بحال اذا تعرض لتعديل معين نقوم باسترجاع نسخة من الملف
وايضا هنا مساحة اخرى ستؤخذ.
5)على اي اساس يتم وضع الcrc هل على اساس حجم الملف التنفيذي ككل (الفيروسات التي تقوم بحقن الاكواد داخل الcavesستتخلص من المشكلة)،
أم على أساس طريقة جمع بايتات قسم الكود ووضع ال crc الخاص بالقيمة نتخلص من مشكلة الفيروسات السابقة.
وكلام من هذا القبيل
بحيث ان نكتب البرنامج بصيغة كتابية ثم نصوغ هذه الكتابة او الخوارزمية ال أكواد
بحيث انها تكون مرجع وقانون يمكن تغييره باتفاق أطراف المشروع ويتم التناقش (هذا إذا حدث تناقش أصلا^_^)
حول اسلوب التكويد مثل ماهي الAPI الأفضل هذه ام تلك وما هو الاجراء الاقوى والاحسن
*هذا رأي وقابل للنقد *
أنا لا أعلم لماذا تنفتح شهيتي على البرمجة عند قرب موعد الامتحانات
يمكن هروب من الواقع
================================================================================
================================================================================
ما شاء الله أخي Junkie همة ونشاط في كتابة الكود
نعم ظهرت عندي الاخطاء في الكود( لكن مش مشكلة الاخطاء يكفي شرف المحاولة^_^ وعدم وجود متابع )
الخطأ بعد التنقيح ظهر معي كالتالي:
1) عند استدعاء دالة البحث الاولى والتي تبحث عن كل exe. ماذا لو كان هناك مجلد نهاية اسمه exe.
سوف يتعامل معه كأنه ملف ويستدعي اجرائية check_sign ويحدث exception غير مقوم (أقصد بغير مقوم أي يحدث خطأ ويستدعي
ZwRaiseException )
ويحدث الخطأ عند
cmp word ptr [eax], "TA"; reversed "AT == ArabTeam"
هذه حالة نادرة ومنكوشة من تحت^_^ بس قلنا ناخذ كل الاحتياطات.
(يمكننا التخلص من هذه المشكلة بوضع مقارنة للتأكد من ناتج البحث اذا كان مجلد أو ملف)
================================================================================
2)أيضا في دالة البحث الاولى اذا لم يجد في مجلد ملف exe فطبيعي لن يرجع hsearch ثم يقوم بالقفز
الى دالة FindClose وهنا يحدث exception مقوم يعني لا مشكلة لكن ان تم القفز الى دالة البحث الثاني الخاصة بالمجلدات يعفينا من الاستثناء.
_nofile: ; search another directory invoke FindClose, hSearchF invoke FindFirstFile, addr all, addr hDir; search for all files and directories "*.*"
(يمكن حل هذا باستدعاء FindFirstFile, addr all, addr hDir مباشرة بدون المرور على FindClose)
================================================================================
3) في دالة البحث الثانية FindFirstFile, addr all, addr hDir لم يتم وضع مقارنة للتأكد من ان القيمة المرجعة ملف او مجلد
بحيث اذا كانت مجلد يتم مقارنة نهاية المجلد مع exe. ثم ينتقل الى FindNextFile, hSearchD, addr hDir دون التاكد من وجود ملفات تنفيذية
داخل هذا المجلد وبالتالي عدم استفادة الملفات التنفيذية داخل هذا المجلد بخدمات البرنامج.
(وضع مقارنة للتاكد ما اذا كان ملف او مجلد يحل المشكلة)
================================================================================
4)في دالة FindNextFile, hSearchD, addr hDir هناك مقارنة
cmp byte ptr [eax], 10h; and check if the found is a directory
وهي تاخذ بعين الاعتبار فقط المجلدات ذات خاصية القراءة فقط (ماذا لو كان الجلد مخفي او ارشيف او نظام اويحمل اكثر من
خاصية اويحمل الخواص كلها)
(الحل دائما المجلد يكون في حالة للقراءة فقط ولا يمكن نزعها منه وبالتالي نحسب الاحتمالات الواردة للمجلدات
read-only(default)=10
في حالة system نضيف 4
في حالة Hidden نضيف 2
في حالة Archive نضيف 20
ومن حساب الاحتمالات نتج معي التالي
10 r
12 r+h
14 r+s
16 r+h+s
30 r+a
32 r+a+h
34 r+a+s
36 r+a+h+s
وبدل الصيغة السابقة في المقارنة نستخدم:
cmp byte ptr [eax], 10h; and check if the found is a directory je @F ; true > directory cmp byte ptr [eax], 12h; and check if the found is a directory je @F ; true > directory cmp byte ptr [eax], 14h; and check if the found is a directory je @F ; true > directory cmp byte ptr [eax], 16h; and check if the found is a directory je @F ; true > directory cmp byte ptr [eax], 30h; and check if the found is a directory je @F ; true > directory cmp byte ptr [eax], 32h; and check if the found is a directory je @F ; true > directory cmp byte ptr [eax], 34h; and check if the found is a directory je @F ; true > directory cmp byte ptr [eax], 36h; and check if the found is a directory je @F ; true > directory
ملا حظة : لم أخذ في الحالات البقة احتمال كون المجلد compressed أو encrypted لأني لا اعرف قيمهم)
================================================================================
5)عند المقارنة هنا
cmp byte ptr [eax], "."; check if it's the r00t directory "\.." or current directory prefix "\." je _fetch_another; g0t r00t? fetch next!
ماذا يحدث اذا كان اسم المجلد يبدأ ب " . " مثل مجلد اسمه 123. أو 123......
( الحل ان تكون القارنة بهذا الشكل
cmp byte ptr [eax], 2eh jne xxxx cmp byte ptr [eax+1], 00h je _fetch_another cmp byte ptr [eax+1], 2eh jne xxxx cmp byte ptr [eax+2], 00h je _fetch_another
)
================================================================================
6) وهي المشكلة الكبيرة وسبب المعضلة وتعمل استثناء غير مقوم
وهي عند عمل وصل append لمجلد مع مجلد آخر حيث لم يتم الاخذ بالحسبان فصلهم بعلامة " \ "
وذلك عن طريق :
rep movsb byte ptr [edi], byte ptr [esi]; and append the found file/folder to that path
وهذه الصورة توضيح
حيث تم الاخذ بحالة الroot الاساسي مثل \:C أو \:D والتي ترجعها الدالة GetLogicalDriveStrings مع وجود علامة " \ "
وعندما حاولت اصلاح المشاكل الا ان الكود مترابط مع بعضه فظهرت معي مشاكل اخرى
هذا ما تيسر لي وارجو المعذرة عن اي خطأ فيما سبق وتنبيهي عليه
وأرى ان يتم اعادة كتابة الكود من الصفر وذلك بعد ان نتكلم عن طبيعة واجراءات واجزاء البرنامج بشكل اوضح
ثم صياغة ما نتج عن التحدث والمناقشة بشكل أكواد.
وكل شيء يعود لكم في النهاية ^_^
وشكرا لك Junkie على البداية لأن نقطة الانطلاق و افكارها هي الاصعب.
والسلام عليكم.
امتــــــــحـــــــــــــــــــانــــــــــــــــــــــــــــــــــــات
استر يا رب (ادعولنا).
كلام سليم
انفتحت شهيتي انا ايضا, لكن امتحاناتي ما زالت بعيدة نوعا ما :)
لنضع الخطط اللازمة ونبدأ العمل. انا معك.
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
اقتراح:
ما رأيكم باستعمال لغة برمجة اخرى C او Delphi للقيام باعمال البحث عن الملفات وما شابه
واستخدام لغة التجميع Assembly في الكود المحقون فقط
بدلا من كتابة المشروع اكمله بلغة التجميع وستهلاك وقت كبير جدا يمكن التركيز على اشياء اهم
لا مانع لدي
شرط ان يكون لدي دور في النهاية :D
تم تعديل هذه المشاركة بواسطة Junkie في 29 نوفمبر 2007 في 12:44
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
جميل جدا
وما راي الاخ capture ؟
-
بالنسبة لي ساتكفل بدلفي كوني احد مشرفي قسم دلفي
ويا حبذا لو هناك من يتكفل ب C او C++
لكي تعم الفائدة الجميع
ممتاز ، موافق
هو بعد رأيكم في رأي ^_^ ؟
أنا نفسي من زمان بتعاون بين أقسام المنتدى المختلفة في المشاريع
نشوف نقاط قوة جديدة والاستفادة من الخبرات الموزعة.
اقتباسلا مانع لديشرط ان يكون لدي دور في النهاية
أكيد لأن بدخول جماعة الدلفي وهم اكتر من الاسمبلي خايف نطلع من المولد بلا حمص. ![]()
امتــــــــحـــــــــــــــــــانــــــــــــــــــــــــــــــــــــات
استر يا رب (ادعولنا).
اقتباس3) في حال وجود ملف تنفيذي نقوم بالتأكد من وجود crc البرنامج الخاص بنا فيهفإذا كان موجودا يتم التغاضي عنه , وان لم يكن موجودا نقوم بعمل الcrc الخاص به وحقن الكود الخاص داخل الcaves
(ماذا لو كان على الملف التنفيذي حماية مثل ملفات الكاسبر؟،ماذا لو كان الملف يحتوي على crc خاص به واذا أضفنا له الكود
لم يعمل ألا يجدر عمل نسخة backup1 للملفات التنفيذية قبل التعديل عليها بحال اذا حدث عطب معين نقوم باسترجاع الملف؟ ولكن هذا سيؤدي الا أخذ
مساحة كبيرة من الهارد).
لا تخف من هذه الناحية حيث في حالة لم يعمل اي برنامج بعد حقنه يمكن حذف ما حقن بالبرنامج
اي يجب تصميم خيار ازالة ما حقن والحصول على الملف الاصلي وبالتالي لسنا بحاجة الى BackUp
اقتباس5)على اي اساس يتم وضع الcrc هل على اساس حجم الملف التنفيذي ككل (الفيروسات التي تقوم بحقن الاكواد داخل الcavesستتخلص من المشكلة)،أم على أساس طريقة جمع بايتات قسم الكود ووضع ال crc الخاص بالقيمة نتخلص من مشكلة الفيروسات السابقة.
هذه اهم نقطة يجب مناقشتها قبل البدء باي شيئ
على اساس حجم الملف - هناك فيروسات تصيب الملف دون ان تغير الحجم
على اساس جمع بايتات قسم الكود- هذه هو لكن غير كافي
يتم حفظ جزء من بداية البرنامج - اي اول 32 bytes مثلا من الكود- لان بعض الفيروسات تغير بها وتضع قفزة مثلا
يتم حفظ جزء من تروسية البرنامج Header لان بعض الفيروسات تغير في نقطة بداية البرنامج
بحيث في حالة اصابة البرنامج يحاول تصحيح نفسه بنفسه Self Heal
...
أي اقتراحات اخرى ؟
اقتباسبدخول جماعة الدلفي وهم اكتر من الاسمبلي خايف نطلع من المولد بلا حمص
لا تخف سيكون هناك حمص وفول وزلابيا وخبز للجميع
ما سيضاف للبرنامج بلغة التجميع وهو لب الموضوع
الافكار الخاصة بالبرنامج المطروحة:
1- الواجهة المرئية بلغات مثل C او دلفي
2- اجزاء البرنامج البسيطة بلغات مثل C و دلفي والشئ الذي يحتاج الى تعمق وسرعة في التنفيذ يكتب بالاسمبلي
3- ما لدينا مكافح فيروسات في البداية لنقل يقوم بفحص ال executable modules
اي (exe,dll,ocx,..) يمكننا العمل على exe في البداية وتحسينه بالتدريج (أفضل)
4- برنامج المكافحة سيقوم بحقن كود ضمن البرنامج يتم تنفيذه في البداية لكي يتأكد فيما اذا تم التعديل عليه
- ماذا لو تم عطب الجزء المحقون وجزء من البرنامج الاصلي, كيف نقوم باستعادة الملف الاصلي بعد الاصابة؟
- ماذا لو قمنا وفق خوارزمية معينة بسحب جميع بيانات اقسام البرنامج ووضعناها في قسم بين قسمين, القسم الاول يحوي على الجزء المحقون, الجزء الاخير يحوي على قيم ال crc بحيث لو حاولت الفيروسات التعديل في بداية او نهاية الملف دون عطبه تم الاحتفاظ بالجزء السليم لكي يتم اعادته عند الحاجة
- في حال تم عطب ملف, كيف نقوم باستعادة الملف الاصلي, برنامج المكافحة الاساسي يجب ان يحوي على طريقة تسمح له اما بكشف الملفات التي تمت اصابتها واستعادتها بشكل اوتوماتيكي او ان يتم تحديد مجموعة ملفات من المستخدم لا تعمل لكي يتم فحص فيما اذا كانت محمية وتم عطبها ويريد المستخدم استرجاعها, من خلال اسم القسم مثلا نستطيع معرفة فيما اذا كان محمي سلفا او من خلال مجموعة بايتات ضمن القسم الثاني الذي يحوي على الاجزاء الاساسية للبرنامج.
- الانتباه الى طريقة اعادة الاقسام المجموعة مع بعضها البعض في الذاكرة كي يتم تنفيذ البرنامج الاساسي وبالتالي نتجاوز مشكلة ال crc لو وجدت في البرنامج الاساسي, صح؟
- امممممممممم.. ToDo :P
الان آلية العمل
5- عندما يتم تثبيت البرنامج سيقوم بفحص السواقات الصلبة (هل نقوم بفحص الاجهزة الملحقة flash/external hdds الخ؟)
6- نبدأ بالجذر الرئيسي للسواقة C على سبيل المثال, نبحث عن الملفات التنفيذية
يجب الاهتمام بالنقاط التي ذكرتها اخي capture بخصوص الخلط مع المجلدات. (هل نبحث عن اي ملف باي امتداد ونقوم بفحص ما اذا كان توقيع MZ موجود في بدايته لربما هو backup مثلا ونقوم بحمايته ايضا؟)
7- تم ايجاد ملف, يتم فحصه بالاعتماد على الاقسام وسلسلة البايتات التي تشير الى انه محمي
- ان كان محمي يتم تجاهله
- ان لم يكن محمي (ماذا لو كان بالاصل معطوب؟ مشكلة المستخدم الغبي :P) نقوم بحساب ال crc وتشكيل الاقسام وتجميع الاصلية وحفظها في القسم الثاني وحقن الكود المطلوب بالاضافة الى ال crc (هل نقوم بتشكيل قاعدة بيانات في البرنامج الاصلي يتم اضافة بيانات الملف وال crc(s) التي قمنا بحسابها اليها للرجوع اليها عند الضرورة؟)
8- تم الانتهاء من الملف, يتم الانتقال الى الملف التالي ويتم التعامل معه بنفس الطريقة
9- تم الانتهاء من الجذر الرئيسي يتم الانتقال الى اول مجلد فرعي مع الاشارة اليه بصورة ما و repeat 7
10- وصلنا الى آخر دليل فرعي في اول مسار سلكناه من الجذر الرئيسي, يجب ان نجد طريقة جيدة جدا لتحديد المسارات التي تم الوصول اليها بصورة ذكية لا تستهلك الموارد وتكون مفهومة برمجيا.
تم فحص السواقة C ننتقل الى بقية السواقات بنفس الطريقة..
11- To be continued..
"سكّر مخي هون لانه مشغول ب suspended thread >_<"
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
هذا الموضوع مغلق.
المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية
جارٍ التحقق من المتواجدين…