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

مشروع كتابة AV لحماية الملفات عبر استخدام CRC

مغلقرائج
بدأه Xacker في 30 يناير 2007 · 58 رد · 9,371 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#26

اقترح ان نستخدم Fasm

لانه خفيف في التحميل و اكثر مرونة

اقترح ان نستخدم Fasm

لانه خفيف في التحميل و اكثر مرونة

قطرة الماء تـثـقب الحجر.. لا بالعنف. لكن بتكرار المحاولة

at4re.gif

منتديات الفريق العربي للهندسة العكسية 不喜欢的勿入! www.at4re.com

#27

لم استخدم سوى Masm من قبل..

وقرات فقط شفرات لـ nasm دون الكتابة فيه

Do as I say, not as I do

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

#28

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

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

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

#30

مازلت اقرا في الكود واتفحصه لكن

اعتقد ان هذه التعليمة لا حاجة لنا بها

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

#31

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

بالنسبة لسؤالك أخي 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

#32

اتصور انه من المفيد وضع المشروع بملفاته مع الملف التنفيذي.. لم ارغب بوضعه كي لا يحمله البعض معتقدين انه النسخة "الاخيرة :P " ويرموه الى الرف دون تفحص او ادراك لماهيته..

باي حال, للمهتمين.. مكتوب بـ RadAsm (غيرت رأيي, ملّيت حتى ركز الـ syntax highlight بـ winasm :^) )

السلام عليكم

AT2kAV.rar

Do as I say, not as I do

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

#33

ما رأيكم بعمل بيئة تطوير للاسمبلي شئ شبيه ب Winasm او Radasm

مشروع يكون مفتوح المصدر ويشترك فيه جميع اعضاء النتدي

صحيح انا مش محترف او حتي متوسط ببرمجة الاسمبلي لكن اعدكم ان اساعد في هذا المشروع

#34

الموضوع ليس بالسهل, نستطيع لو أردنا لاحقاُ القيام بمثل هذا المشروع سبر الخبرات من خلال الحالي, هذا رأيي.

والله أعلم

السلام عليكم

Do as I say, not as I do

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

#35

صحيح ليس سهل لكن مع مشروع كهذا يستطيع اعضاء المنتدي تطوير خبراتهم وقدراتهم وفي نفس الوقت تحقيق انجاز كبير

#36

انظر الى اعضاء المنتدى كيف "ينظرون" فقط الى الموضوع.

لن تاخذ سوى الكلام مهما كان المشروع.

وكما قلت, هذا بداية الطريق, وليس اخره

السلام عليكم

Do as I say, not as I do

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

#37

شكرا لاهتمامك ..

ارجوا ان يأتي وقت نستطيع فيه القيام بهذا المشروع وغيره

#38

طالما لا يوجد تفاعل ساقوم بإزالة الموضوع من التثبيت.

السلام عليكم

Do as I say, not as I do

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

#39

اعتقد ان الموضوع في بداية الطريق الذي سلكه كل المشاريع العربي

طريق الزوال و فشل المشروع

و اكرر هذا اعتقاد

من الافضل ان تتخذوا الخطوات الجادة و العلمية في عمل المشروع

اي تحليل المشروع و الخطط التي تسيرون عليها

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

=>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>a very far place

مفيش توقيع

#40
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

#41

اسف اخ Xacker لم استطع المشاركة بسبب انشغالي بمنتديات الفريق العربي للهندسة العكسية AT4RE

سارفع الموضوع عندما اجد فرصة

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

قطرة الماء تـثـقب الحجر.. لا بالعنف. لكن بتكرار المحاولة

at4re.gif

منتديات الفريق العربي للهندسة العكسية 不喜欢的勿入! www.at4re.com

#42

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

كتحديد بداية الانطلاق والاتفاق على تقسيم الاجزاء المختلفة وتحديد الشكل العام بتفصيل أكبر

أنا لما شفت الدخول المباشر في الكود لم أعرف ما هو شكل الاجزاء وترتيبها انا رايي نتكلم بشكل اكبر عنه

يعني مثلا :

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

وهذه الصورة توضيح

post-96784-1196308329_thumb.jpg

حيث تم الاخذ بحالة الroot الاساسي مثل \:C أو \:D والتي ترجعها الدالة GetLogicalDriveStrings مع وجود علامة " \ "

وعندما حاولت اصلاح المشاكل الا ان الكود مترابط مع بعضه فظهرت معي مشاكل اخرى

هذا ما تيسر لي وارجو المعذرة عن اي خطأ فيما سبق وتنبيهي عليه

وأرى ان يتم اعادة كتابة الكود من الصفر وذلك بعد ان نتكلم عن طبيعة واجراءات واجزاء البرنامج بشكل اوضح

ثم صياغة ما نتج عن التحدث والمناقشة بشكل أكواد.

وكل شيء يعود لكم في النهاية ^_^

وشكرا لك Junkie على البداية لأن نقطة الانطلاق و افكارها هي الاصعب.

والسلام عليكم.

امتــــــــحـــــــــــــــــــانــــــــــــــــــــــــــــــــــــات

استر يا رب (ادعولنا).

#43

كلام سليم

انفتحت شهيتي انا ايضا, لكن امتحاناتي ما زالت بعيدة نوعا ما :)

لنضع الخطط اللازمة ونبدأ العمل. انا معك.

Do as I say, not as I do

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

#44

اقتراح:

ما رأيكم باستعمال لغة برمجة اخرى C او Delphi للقيام باعمال البحث عن الملفات وما شابه

واستخدام لغة التجميع Assembly في الكود المحقون فقط

بدلا من كتابة المشروع اكمله بلغة التجميع وستهلاك وقت كبير جدا يمكن التركيز على اشياء اهم

d4baa0.gif
#45

لا مانع لدي

شرط ان يكون لدي دور في النهاية :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

#46

جميل جدا

وما راي الاخ capture ؟

-

بالنسبة لي ساتكفل بدلفي كوني احد مشرفي قسم دلفي

ويا حبذا لو هناك من يتكفل ب C او C++

لكي تعم الفائدة الجميع

d4baa0.gif
#47

ممتاز ، موافق

هو بعد رأيكم في رأي ^_^ ؟

أنا نفسي من زمان بتعاون بين أقسام المنتدى المختلفة في المشاريع

نشوف نقاط قوة جديدة والاستفادة من الخبرات الموزعة.

اقتباس
لا مانع لدي

شرط ان يكون لدي دور في النهاية

أكيد لأن بدخول جماعة الدلفي وهم اكتر من الاسمبلي خايف نطلع من المولد بلا حمص. biggrin.gif

امتــــــــحـــــــــــــــــــانــــــــــــــــــــــــــــــــــــات

استر يا رب (ادعولنا).

#48
اقتباس
3) في حال وجود ملف تنفيذي نقوم بالتأكد من وجود crc البرنامج الخاص بنا فيه

فإذا كان موجودا يتم التغاضي عنه , وان لم يكن موجودا نقوم بعمل الcrc الخاص به وحقن الكود الخاص داخل الcaves

(ماذا لو كان على الملف التنفيذي حماية مثل ملفات الكاسبر؟،ماذا لو كان الملف يحتوي على crc خاص به واذا أضفنا له الكود

لم يعمل ألا يجدر عمل نسخة backup1 للملفات التنفيذية قبل التعديل عليها بحال اذا حدث عطب معين نقوم باسترجاع الملف؟ ولكن هذا سيؤدي الا أخذ

مساحة كبيرة من الهارد).

لا تخف من هذه الناحية حيث في حالة لم يعمل اي برنامج بعد حقنه يمكن حذف ما حقن بالبرنامج

اي يجب تصميم خيار ازالة ما حقن والحصول على الملف الاصلي وبالتالي لسنا بحاجة الى BackUp

اقتباس
5)على اي اساس يتم وضع الcrc هل على اساس حجم الملف التنفيذي ككل (الفيروسات التي تقوم بحقن الاكواد داخل الcavesستتخلص من المشكلة)،

أم على أساس طريقة جمع بايتات قسم الكود ووضع ال crc الخاص بالقيمة نتخلص من مشكلة الفيروسات السابقة.

هذه اهم نقطة يجب مناقشتها قبل البدء باي شيئ

على اساس حجم الملف - هناك فيروسات تصيب الملف دون ان تغير الحجم

على اساس جمع بايتات قسم الكود- هذه هو لكن غير كافي

يتم حفظ جزء من بداية البرنامج - اي اول 32 bytes مثلا من الكود- لان بعض الفيروسات تغير بها وتضع قفزة مثلا

يتم حفظ جزء من تروسية البرنامج Header لان بعض الفيروسات تغير في نقطة بداية البرنامج

بحيث في حالة اصابة البرنامج يحاول تصحيح نفسه بنفسه Self Heal

...

أي اقتراحات اخرى ؟

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

لا تخف سيكون هناك حمص وفول وزلابيا وخبز للجميع

ما سيضاف للبرنامج بلغة التجميع وهو لب الموضوع

d4baa0.gif
#49

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

أتمنى الانضمام لكم خاصة في مجال ++C,C

Knowledge Is Power

#50

الافكار الخاصة بالبرنامج المطروحة:

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

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

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…