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

smtp code

مغلق
بدأه bitofsoul في 24 فبراير 2007 · 2 رد · 1,943 مشاهدة · في المواضيع المميزة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

لقد تطرقنا سابقا في درس القاعدة 64 الى كيفية تحويل ملف ما الى احرف ابجدية تمكننا من ارساله عبر بريد الكتروني, و في هذه الحصة سنرى كيف نكتب كود لارسال بريد الكتروني مع الغوريتم ا لتحويل لارسال الملف المرفق و ذلك ان شاء الله تعالى

MSVS لكن قبل ذالك ارجوا من القراء الكرام ان يراجعوا دروس البروتوكول الاسمتب عند الاخ

/index.ph...c=58454&hl=

و هنا

/index.ph...c=69519&hl=

:)و هذا الكود مع بعض الشروحات

.486
	.model flat,stdcall
	option casemap:none

	include \masm32\include\windows.inc
	include \masm32\include\user32.inc
	include \masm32\include\kernel32.inc
	include \masm32\include\gdi32.inc
	include \masm32\include\masm32.inc
	include \MASM32\include\Comctl32.inc
	include \MASM32\include\comdlg32.inc
	include \MASM32\include\shell32.inc
	include \MASM32\include\oleaut32.inc
	include \masm32\include\wsock32.inc

   includelib \MASM32\LIB\gdi32.lib
   includelib \MASM32\LIB\Comctl32.lib
   includelib \MASM32\LIB\comdlg32.lib
   includelib \MASM32\LIB\shell32.lib
   includelib \MASM32\LIB\oleaut32.lib 
   includelib \masm32\lib\user32.lib
   includelib \masm32\lib\kernel32.lib
   includelib \masm32\lib\gdi32.lib
   includelib \masm32\lib\masm32.lib
   includelib \masm32\lib\wsock32.lib



		Base64Encode proto	:dword, :dword, :dword
		Mys proto :dword



   .data
   message db 'From: akhi <xyxy@mail.ar>',13,10			 
		   db 'Subject:  MESSAGE',13,10				   
		   db 'To: TEST <xxx@xmail.ar>',13,10				 
		  db'MIME-Version: 1.0',13,10					  
		  db'Content-Type: multipart/mixed;',13,10			  
		  db' boundary="--ct757"',13,10,13,10				   
		  db'----ct757',13,10
		  db'Content-Type: text/plain; charset=Windows-1251',13,10	  
		  db'Content-Transfer-Encoding: 8bit',13,10,13,10		   
		  db'ahlan wa sahlan.',13,10,13,10 
		  db'----ct757',13,10
		  db'Content-Disposition: attachment; filename="file.rar"',13,10 
		  db'Content-Type: application/octet-stream; name="file.rar"',13,10  
		  db'Content-Transfer-Encoding: base64',13,10,13,10,0,0,0,0,0


		hFile   dd 0
	   source$ dd 0
	   dest$   dd 0
	   HeloStr db "HELO smtp",13,10,0,0 
	   FromStr db "MAIL FROM: xyxy@mail.ar",13,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; هنا تكتب بريد الراسل

DataStr db "DATA",13,10,0
QuitStr db "QUIT",13,10,0
EndStr db 13,10,".",13,10,0

RcptStr db "RCPT TO: sadiki@yahoo.com",13,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;هنا تكتب بريد المستقبل

MySmtp db "81.192.53.13",0 ; "التالي "81.192.53.13 IP  سيرفر الاسمتب ,فانا مثلا هنا في المغرب استعمل ال IP 
wsadata WSADATA <;>;socket لمركبات  
sin sockaddr_in <;> 
Port dd 25				 ;  منفذ الاسمتب

pMemory dd 13,0
pContent dd 0
pFileContent dd 0
dwFileSize dd 13,0
hMapFile dd 0
 hFFFile dd 0
DONNEES db "C:\file.rar", 0 ;الملف الذي سوف يتم تشفيره ثم ارساله 
bufer   dd 13, 0 
base64_alphabet		db	"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="



   .data?

	sock dd ?;for socket structur
	buf db 255 dup (?);for the mesagbox buffer

   .code
   start:

invoke WSAStartup,101h,addr wsadata; نخلق السوكي قبل كل شيء
invoke socket,AF_INET,SOCK_STREAM,IPPROTO_IP
mov sock,eax
mov sin.sin_family,AF_INET
invoke htons,Port
mov sin.sin_port,ax
invoke inet_addr, addr MySmtp
mov sin.sin_addr, eax

invoke connect, sock, addr sin ,sizeof sin; ربط الاتصال بالسيرفر
invoke recv, sock, addr buf, sizeof buf, 0; استقبال الرد من السيرفر 
invoke MessageBox,0,addr buf, addr HeloStr, MB_OK 
; ستلاحظون ان عملية عرض ما تم استقباله;من السيرفر ستتكرر عند كل ارسال اوامر جديدة للسيرفر في الاسطر

																   ;  المقبلة   وذلك ليكون الشخص;المبرمج متاكد من صحة الارسال والاستقبال		  

; اهلا يا عزيزي سرفر :)  

invoke Mys, addr HeloStr  ;الى السرفر "HELO smtp" ارسال تحية :)	   
invoke recv, sock, addr buf, sizeof buf, 0  
invoke MessageBox,0,addr buf, addr HeloStr, MB_OK; 

																													 ; الرسالة  من  :
invoke Mys, addr FromStr
invoke recv, sock, addr buf, sizeof buf, 0
invoke MessageBox,0,addr buf, addr FromStr, MB_OK

																													  ; الرسالة الى :
invoke Mys, addr RcptStr
invoke recv, sock, addr buf, sizeof buf, 0
invoke MessageBox,0,addr buf, addr RcptStr, MB_OK

																													; "DATA"ارسال علامة البيانات  :
invoke Mys, addr DataStr;
invoke recv, sock, addr buf, sizeof buf, 0;
invoke MessageBox,0,addr buf, addr DataStr, MB_OK;
																												  ; البرنامج يحمل الملف :
invoke CreateFile, addr DONNEES, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
mov hFile, eax
invoke GetFileSize, hFile, NULL   ; نحسب عدد بيتاته
mov dwFileSize, eax
invoke CreateFileMapping, hFile, NULL, PAGE_READONLY, 0, 0, NULL
mov hMapFile, eax
invoke MapViewOfFile, hMapFile, FILE_MAP_READ, 0, 0, 0
mov pMemory, eax   ; نذخل بيانات الملف الى ذاكرة الذخل للتحويل
invoke LocalAlloc, LPTR, 10000000
mov bufer, eax						 ; نعد ذاكرة الخرج
																			   ; ويبذا بتشفير الملف بالا رغوريتم القاعدة 64

invoke Base64Encode, pMemory, bufer, ebx 
;(ebx)ثم عدد بيتات الملف , (buffer)ذاكرة الخرج, (pmemory)  دالة التحويل وتظم 3 عناصر :ذاكرة الذخل

																		  

invoke Mys, addr message;					  ( "message"	ارسا ل  البيانات الاولية الخاصة بالاميل (انظر  في فقرة  داتا اعلاه		   




invoke Mys, bufer				   ; ارسال الملف الذي تم تحويله  الى رموز القاعدة 64

invoke Mys, addr EndStr		   ; ارسال اوامر النهاية وهي  النقطة في بروتوكل سمتب

invoke recv, sock, addr buf, sizeof buf, 0
invoke MessageBox,0,addr buf, addr EndStr, MB_OK
; QUIT
invoke Mys, addr QuitStr							 ;ارسال علامة الخروج 
invoke recv, sock, addr buf, sizeof buf, 0
invoke MessageBox,0,addr buf, addr QuitStr, MB_OK


invoke closesocket,sock			; socketاقفال ال 


invoke ExitProcess,eax  ; 

; -------------------------------------------------------
;التفاصيل الخاصة بال سوكي-ارسال يلجا اليها البرنامج كلما اراد ارسال بيانات
;--------------------------------------------------------
Mys proc SendStr : dword

mov edi, SendStr

.while TRUE

.break .if (byte ptr [edi] == 0 )

invoke send, sock, edi, 1, 0

inc edi
.endw
ret
Mys endp
;--------------------------------
; الغوريثم التشفير لمبذا قاعدة 64   
;--------------------------------
Base64Encode	proc	uses ebx edi esi source:dword, destination:dword, sourcelen:dword
   ;LOCAL	sourcelen:DWORD

	mov ebx, dwFileSize
	mov  esi, source
	mov  edi, destination
@@base64loop:
	xor eax, eax
	.if dwFileSize == 1
		lodsb					   ;source ptr + 1
		mov ecx, 2				   ;bytes to output = 2
		mov edx, 03D3Dh			   ;padding = 2 byte
		dec dwFileSize			   ;length - 1
	.elseif dwFileSize == 2
		lodsw					   ;source ptr + 2
		mov ecx, 3				   ;bytes to output = 3
		mov edx, 03Dh			   ;padding = 1 byte
		sub dwFileSize, 2		   ;length - 2
	.else
		lodsd
		mov ecx, 4				   ;bytes to output = 4
		xor edx, edx			   ;padding = 0 byte
		dec esi					   ;source ptr + 3 (+4-1)
		sub dwFileSize, 3			 ;length - 3 
	.endif

	xchg al,ah					   ;flip eax completely
	rol  eax, 16				   ;can this be done faster
	xchg al,ah

	@@:
	push  eax
	and   eax, 0FC000000h		   ;get the last 6 high bits
	rol   eax, 6				   ;rotate them into al
	mov   al,  byte ptr [offset base64_alphabet + eax]	   ;get encode character
	stosb						   ;write to destination
	pop   eax
	shl   eax, 6				   ;shift left 6 bits
	dec   ecx
	jnz   @B					   ;loop

	cmp   dwFileSize, 0
	jnz   @@base64loop			   ;main loop

	mov   eax, edx				   ;add padding and null terminate
	stosd

	ret
Base64Encode	endp

 end start

:) olly و اليكم ما يحدث باختصار عند تنفيذ الملف على يد

731312730.jpg

731329922.jpg

731338900.jpg

731341582.jpg

731343902.jpg

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

731345213.jpg

انتبهوا , فليس كل ما ستستقبلونه من السيرفر سيكون مشابها كما هو مبين في الصورة , فذلك يختلف من سيرفر لاخر.

و تضغطون على اوك عند كل استقبال رد من السيرفر.

:) اتمنى ان يكون هذا الكود مفيذا

واتمنى كذلك الا اكون قد اخطات في كتابة كود ما.

على العموم ننتظر الاسئلة ,لكن ساجيب عنها ان شاء الله بعد 34 ساعة انطلاقا من ساعة نشر هذا الكود :) والله ولي التوفيق.

تم تعديل هذه المشاركة بواسطة محمدعبد العزيز في 24 فبراير 2007 في 11:15

#2

اعتذر عن عدم وضع بدايات الكود انطلاقا من اليسار, :) فلقد ركزت كتيرا على عدم ارتكاب اخطاء في كتابة الكود ونسيت امر البدايات :).

#3

نظرا لبعض المشاكل التي اواجهها عند النشر ,وضعت ما شرحته سابقا في ملف مرفق

smtp00.rar

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

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