السلام عليكم و رحمة الله و بركاته
لقد تطرقنا سابقا في درس القاعدة 64 الى كيفية تحويل ملف ما الى احرف ابجدية تمكننا من ارساله عبر بريد الكتروني, و في هذه الحصة سنرى كيف نكتب كود لارسال بريد الكتروني مع الغوريتم ا لتحويل لارسال الملف المرفق و ذلك ان شاء الله تعالى
MSVS لكن قبل ذالك ارجوا من القراء الكرام ان يراجعوا دروس البروتوكول الاسمتب عند الاخ
و هنا
:)و هذا الكود مع بعض الشروحات
.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 و اليكم ما يحدث باختصار عند تنفيذ الملف على يد





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

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