Отправить письмо получается, а вложить файл не получается! Вот полный код программы: Код (Text): .386 .model flat,stdcall option casemap:none WinMain proto :DWORD,:DWORD,:DWORD,:DWORD include E:\masm32\include\windows.inc include E:\masm32\include\kernel32.inc include E:\masm32\include\user32.inc include E:\masm32\include\advapi32.inc include E:\masm32\include\gdi32.inc include E:\masm32\include\ws2_32.inc includelib E:\masm32\lib\kernel32.lib includelib E:\masm32\lib\user32.lib includelib E:\masm32\lib\advapi32.lib includelib E:\masm32\lib\gdi32.lib includelib E:\masm32\lib\ws2_32.lib include E:\masm32\macros\Strings.mac IN_ADDR struct s_addr dd ? IN_ADDR ends SOCKADDR_IN struct sin_family dw ? sin_port dw ? sin_addr IN_ADDR <?> sin_zero db 8h dup(?) SOCKADDR_IN ends HOSTENT struct h_name dd ? h_aliases dd ? h_addrtype dw ? h_length dw ? h_addr dd ? HOSTENT ends .DATA ClassName db "SimpleWinClass",0 AppName db "Our First Window",0 OurText db "Win32 assembly is great and easy!",0 .DATA? hInstance HINSTANCE ? CommandLine LPSTR ? .CODE start: invoke GetModuleHandle, NULL mov hInstance,eax invoke GetCommandLine mov CommandLine,eax invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT invoke ExitProcess,eax WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD LOCAL wc:WNDCLASSEX LOCAL msg:MSG LOCAL hwnd:HWND mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, OFFSET WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL push hInst pop wc.hInstance mov wc.hbrBackground,COLOR_WINDOW+1 mov wc.lpszMenuName,NULL mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon,NULL,IDI_APPLICATION mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx, addr wc invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\ WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\ CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\ hInst,NULL mov hwnd,eax invoke ShowWindow, hwnd,SW_SHOWNORMAL invoke UpdateWindow, hwnd ;invoke CreateThread,0h,0h,offset Some,0h,0h,offset ThreadId .WHILE TRUE invoke GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax) invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg .ENDW mov eax,msg.wParam ret WinMain endp .data? controls dd 100h dup(?) wsadata WSADATA <> .code encodeBase64 proc xor esi,esi ; encodeBase64 by Bumblebee. All rights reserved ;) call over_enc_table db "ABCDEFGHIJKLMNOPQRSTUVWXYZ" db "abcdefghijklmnopqrstuvwxyz" db "0123456789+/" over_enc_table: pop edi push ebp xor ebp,ebp baseLoop: movzx ebx,byte ptr [eax] shr bl,2 and bl,00111111b mov bh,byte ptr [edi+ebx] mov byte ptr [edx+esi],bh inc esi mov bx,word ptr [eax] xchg bl,bh shr bx,4 mov bh,0 and bl,00111111b mov bh,byte ptr [edi+ebx] mov byte ptr [edx+esi],bh inc esi inc eax mov bx,word ptr [eax] xchg bl,bh shr bx,6 xor bh,bh and bl,00111111b mov bh,byte ptr [edi+ebx] mov byte ptr [edx+esi],bh inc esi inc eax xor ebx,ebx movzx ebx,byte ptr [eax] and bl,00111111b mov bh,byte ptr [edi+ebx] mov byte ptr [edx+esi],bh inc esi inc eax inc ebp cmp ebp,24 jna DontAddEndOfLine xor ebp,ebp ; Добавляем новую линию mov word ptr [edx+esi],0A0Dh inc esi inc esi test al,00h ; Оптимизиpовано org $-1 DontAddEndOfLine: inc ebp sub ecx,3 or ecx,ecx jne baseLoop mov ecx,esi add edx,esi pop ebp ret encodeBase64 endp myconnect PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD .data helo_mes db "HELO",0h mail_from db "MAIL FROM:<",0h rcpt_mes db "RCPT TO:<",0h datames db "DATA",0Dh,0Ah,0h subj_mes db "SUBJECT: ",0h my_message db "Hello World!!!",0Dh,0Ah,0Dh,0Ah,".",0Dh,0Ah,0h quit_mes db "QUIT",0Dh,0Ah,0h .code recvy PROTO :DWORD,:DWORD recvy proc memheap:DWORD,s:DWORD mov eax,memheap add eax,1000h push eax invoke lstrlen,eax pop edx add eax,edx invoke recv,s,eax,100h,0h ret recvy endp clear PROTO :DWORD clear proc memheap:DWORD mov edi,memheap mov ecx,200h xor eax,eax rep stosb ret clear endp myconnect proc hWnd,hMemo,hEdit,hEdit2,hEdit3,hEdit4,hMemo2 LOCAL s:SOCKET LOCAL memheap:DWORD LOCAL procheap:DWORD LOCAL sin:SOCKADDR_IN LOCAL memory:DWORD ;jmp endy invoke GetProcessHeap mov procheap,eax invoke HeapAlloc,eax,HEAP_ZERO_MEMORY,4000h mov memheap,eax invoke WSAStartup,101h,offset wsadata invoke socket,AF_INET,SOCK_STREAM,0h mov s,eax mov eax,memheap add eax,5h invoke SendMessage,hEdit,WM_GETTEXT,50h,eax mov eax,memheap add eax,5h invoke gethostbyname,eax assume eax:ptr HOSTENT mov eax,[eax].h_addr assume eax:nothing mov eax,[eax] mov eax,[eax] MOV sin.sin_addr.s_addr,eax MOV sin.sin_port,1900h MOV sin.sin_family,AF_INET invoke connect,s,addr sin,sizeof(sockaddr_in) ;xor eax,eax .if eax==0h mov eax,memheap add eax,1000h invoke recv,s,eax,100h,0h invoke lstrcpy,memheap,offset helo_mes add eax,sizeof helo_mes-1h mov byte ptr [eax],20h inc eax push eax invoke SendMessage,hEdit,WM_GETTEXT,50h,eax pop edx mov dword ptr [eax][edx],0A0Dh invoke lstrlen,memheap invoke send,s,memheap,eax,0h mov eax,memheap add eax,1000h invoke recv,s,eax,100h,0h invoke clear,memheap invoke lstrcpy,memheap,offset mail_from add eax,sizeof mail_from-1h push eax invoke SendMessage,hEdit2,WM_GETTEXT,50h,eax pop edx mov dword ptr [eax][edx],'>' or 0A0D00h add eax,3h invoke lstrlen,memheap invoke send,s,memheap,eax,0h invoke recvy,memheap,s invoke clear,memheap invoke lstrcpy,memheap,offset rcpt_mes add eax,sizeof rcpt_mes-1h push eax invoke SendMessage,hEdit3,WM_GETTEXT,50h,eax pop edx mov dword ptr [eax][edx],'>' or 0A0D00h add eax,3h invoke lstrlen,memheap invoke send,s,memheap,eax,0h mov eax,memheap add eax,1000h push eax invoke lstrlen,eax pop edx add eax,edx invoke recv,s,eax,100h,0h invoke clear,memheap invoke lstrcpy,memheap,offset datames mov eax,sizeof datames-1h invoke send,s,memheap,eax,0h invoke recvy,memheap,s invoke clear,memheap invoke VirtualAlloc,0h,100000h,MEM_COMMIT,PAGE_READWRITE mov memory,eax invoke lstrcpy,memory,offset subj_mes add eax,sizeof subj_mes-1h push eax invoke SendMessage,hEdit4,WM_GETTEXT,50h,eax pop edx mov word ptr [eax][edx],0A0Dh add eax,2h mov word ptr [eax][edx],0A0Dh add eax,2h add eax,edx invoke SendMessage,hMemo2,WM_GETTEXT,400h,eax .data comment @ MyFile db "MIME-Version: 1.0",0Ah,0Dh db "Content-Type: multipart/mixed;",0Ah,0Dh db 'boundary="----=_NextPart_000_0005_01BDE2FC.8B286C00"',0Ah,0Dh db "X-Priority: 3",0Ah,0Dh db "X-MSMail-Priority: Normal",0Ah,0Dh db "X-Unsent: 1",0Ah,0Dh db "X-MimeOLE: Produced By Microsoft MimeOLE V4.72.3110.3",0Ah,0Dh db 0Ah,0Dh db "------=_NextPart_000_0005_01BDE2EC.8B286C00",0Ah,0Dh db "Content-Type: text/plain; charset=iso-8859-1" db "Content-Transfer-Encoding: quoted-printable" db 0Ah,0Dh db "Put here whatever you want",0Ah,0Dh db 0Ah,0Dh db "------=_NextPart_000_0005_01BDE2EC.8B286C00",0Ah,0Dh db "Content-Type: application/octet-stream; name=filename.exe",0Ah,0Dh db "Content-Transfer-Encoding: base64",0Ah,0Dh db 'Content-Disposition: attachment; filename="filename.exe"',0Ah,0Dh db 0Ah,0Dh ;db "Here would come BASE64 encoded file.",0Ah,0Dh,0h @ MyFile db "MIME-Version: 1.0" db "Content-Type: multipart/mixed;" db 'boundary="----=_NextPart_000_0005_01BDE2FC.8B286C00"' db "X-Priority: 3" db "X-MSMail-Priority: Normal" db "X-Unsent: 1" db "X-MimeOLE: Produced By Microsoft MimeOLE V4.72.3110.3" db "------=_NextPart_000_0005_01BDE2EC.8B286C00" db "Content-Type: text/plain; charset=iso-8859-1" db "Content-Transfer-Encoding: quoted-printable" db "Put here whatever you want" db "------=_NextPart_000_0005_01BDE2EC.8B286C00" db "Content-Type: application/octet-stream; name=filename.exe" db "Content-Transfer-Encoding: base64" db 'Content-Disposition: attachment; filename="filename.exe"' db 36h,63h,23h comment @ MyFile db 'Content-Type: application/octet-stream; name="file.bin"' db 'Content-Disposition: attachment; filename="file.bin"' db "Content-Transfer-Encoding: base64" db 36h,63h,23h db 0h @ .code invoke lstrlen,memory mov edx,memory mov word ptr [eax][edx],0A0Dh add eax,2h mov word ptr [eax][edx],0A0Dh add eax,2h add eax,memory invoke lstrcpy,eax,offset MyFile invoke lstrlen,memory mov edx,memory mov dword ptr [eax][edx],0A0Dh inc eax inc eax mov dword ptr [eax][edx],2E0A0Dh add eax,3h mov dword ptr [eax][edx],0A0Dh inc eax inc eax invoke lstrlen,memory invoke send,s,memory,eax,0h invoke VirtualFree,memory,100000h,MEM_DECOMMIT invoke recvy,memheap,s invoke clear,memheap invoke lstrcpy,memheap,offset quit_mes mov eax,sizeof quit_mes-1h invoke send,s,memheap,eax,0h mov eax,memheap add eax,1000h push eax push eax invoke lstrlen,eax pop edx add eax,edx invoke recv,s,eax,100h,0h add edx,eax pop eax invoke SendMessage,hMemo,WM_SETTEXT,edx,eax .endif invoke closesocket,s invoke WSACleanup invoke HeapFree,procheap,0h,memheap endy: ret myconnect endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM CONTSTR STRUCT button dd ? edit dd ? edit2 dd ? edit3 dd ? edit4 dd ? memo dd ? memo2 dd ? CONTSTR ENDS mov esi,offset controls assume esi:ptr CONTSTR .if uMsg==WM_CREATE invoke CreateWindowEx,0h,$CTA0("BUTTON"),$CTA0("Send"),WS_VISIBLE or WS_CHILD or BS_DEFPUSHBUTTON,160,20,80,20,hWnd,0,hInstance,0 mov [esi].button,eax invoke CreateWindowEx,0h,$CTA0("EDIT"),$CTA0("www.mail.ru"),WS_VISIBLE or WS_CHILD or WS_BORDER or ES_AUTOHSCROLL,270,50,200,20,hWnd,0,hInstance,0 ;invoke CreateWindowEx,0h,$CTA0("EDIT"),$CTA0("User-91396ed1f7"),WS_VISIBLE or WS_CHILD or WS_BORDER or ES_AUTOHSCROLL,270,50,200,20,hWnd,0,hInstance,0 mov [esi].edit,eax invoke CreateWindowEx,0h,$CTA0("EDIT"),$CTA0("xxx@rambler.ru"),WS_VISIBLE or WS_CHILD or WS_BORDER or ES_AUTOHSCROLL,490,50,200,20,hWnd,0,hInstance,0 mov [esi].edit2,eax invoke CreateWindowEx,0h,$CTA0("EDIT"),$CTA0("xxx@rambler.ru"),WS_VISIBLE or WS_CHILD or WS_BORDER or ES_AUTOHSCROLL,490,80,200,20,hWnd,0,hInstance,0 mov [esi].edit3,eax invoke CreateWindowEx,0h,$CTA0("EDIT"),$CTA0("Hello"),WS_VISIBLE or WS_CHILD or WS_BORDER or ES_AUTOHSCROLL,490,110,200,20,hWnd,0,hInstance,0 mov [esi].edit4,eax invoke CreateWindowEx,0h,$CTA0("EDIT"),$CTA0(""),WS_VISIBLE or WS_CHILD or WS_BORDER or WS_VSCROLL or ES_MULTILINE,10,50,250,250,hWnd,0,hInstance,0 mov [esi].memo,eax invoke CreateWindowEx,0h,$CTA0("EDIT"),$CTA0("Hello "),WS_VISIBLE or WS_CHILD or WS_BORDER or WS_VSCROLL or ES_MULTILINE,270,80,200,220,hWnd,0,hInstance,0 mov [esi].memo2,eax ;invoke SendMessage,hWnd,WM_PAINT,0h,0h .endif .if uMsg==WM_COMMAND mov eax,dword ptr [esi].button .if lParam==eax invoke myconnect,hWnd,[esi].memo,[esi].edit,[esi].edit2,[esi].edit3,[esi].edit4,[esi].memo2 .endif .endif .if uMsg==WM_PAINT .endif assume esi:nothing .if uMsg==WM_DESTROY invoke PostQuitMessage,NULL .else invoke DefWindowProc,hWnd,uMsg,wParam,lParam ; xor eax, eax .endif ret WndProc endp end start Вот так, например, не получается! Код (Text): MyFile db "MIME-Version: 1.0",0Ah,0Dh db "Content-Type: multipart/mixed;",0Ah,0Dh db 'boundary="----=_NextPart_000_0005_01BDE2FC.8B286C00"',0Ah,0Dh db "X-Priority: 3",0Ah,0Dh db "X-MSMail-Priority: Normal",0Ah,0Dh db "X-Unsent: 1",0Ah,0Dh db "X-MimeOLE: Produced By Microsoft MimeOLE V4.72.3110.3",0Ah,0Dh db 0Ah,0Dh db "------=_NextPart_000_0005_01BDE2EC.8B286C00",0Ah,0Dh db "Content-Type: text/plain; charset=iso-8859-1" db "Content-Transfer-Encoding: quoted-printable" db 0Ah,0Dh db "Put here whatever you want",0Ah,0Dh db 0Ah,0Dh db "------=_NextPart_000_0005_01BDE2EC.8B286C00",0Ah,0Dh db "Content-Type: application/octet-stream; name=filename.exe",0Ah,0Dh db "Content-Transfer-Encoding: base64",0Ah,0Dh db 'Content-Disposition: attachment; filename="filename.exe"',0Ah,0Dh db 0Ah,0Dh
Да! Очень любопытная статейка, но помоему, я делаю тоже самое! Мне надо файл вложить! А там написано: Ну, я так и делаю а в письме написано: Тема: Hello77 Hello 77 Content-Type: application/octet-stream; name="file.bin" Content-Disposition: attachment; filename="file.bin" Content-Transfer-Encoding: base64 NmMjiFci То есть это попадает не во вложение, а сообщение!!! И почему???
Вот такое сообщение в письме - вкладок нет: Тема: Hello 22 Hello Content-Type: application/octet-stream; name="file.bin" Content-Disposition: attachment; filename="file.bin" Content-Transfer-Encoding: base64 NmMjiFci------=_NextPart_000_0005_01BDE2EC.8B286C00-- 0Ah,0Dh заменил на 0Dh,0Ah - всё равно не прёт... Вместо www.mail.ru попробывал с www.yandex.ru - та же фигня... Вот такие дела... Код (Text): MyFile db 'Content-Type: application/octet-stream; name="file.bin"',0Dh,0Ah db 'Content-Disposition: attachment; filename="file.bin"',0Dh,0Ah db 'Content-Transfer-Encoding: base64',0Dh,0Ah,0h coding_data db 36h,63h,23h,88h,57h,22h end_of_File db "------=_NextPart_000_0005_01BDE2EC.8B286C00--",0Dh,0Ah,0h
Выкладываю: Из Ethereal'а: Код (Text): DATA 354 Enter mail, end with "." on a line by itself SUBJECT: Hello Hello 876.876. Content-Type: application/octet-stream; name="file.bin" Content-Disposition: attachment; filename="file.bin" Content-Transfer-Encoding: base64 NmMjiFci------=_NextPart_000_0005_01BDE2EC.8B286C00-- . 250 2.0.0 lB5HgQ3M009713 Message accepted for delivery QUIT Код (Text): 0000 00 50 56 ed 54 a0 00 0c 29 d9 c1 6f 08 00 45 00 .PV.T...)..o..E. 0010 01 1c 05 c1 40 00 80 06 b9 8f c0 a8 17 80 4d 58 ....@.........MX 0020 15 0b 04 7e 00 19 e4 c0 69 3f 6e 0e 23 86 50 18 ...~....i?n.#.P. 0030 f9 ca 73 aa 00 00 53 55 42 4a 45 43 54 3a 20 48 ..s...SUBJECT: H 0040 65 6c 6c 6f 0d 0a 0d 0a 48 65 6c 6c 6f 20 38 37 ello....Hello 87 0050 36 e5 38 37 36 e5 0d 0a 0d 0a 43 6f 6e 74 65 6e 6.876.....Conten 0060 74 2d 54 79 70 65 3a 20 61 70 70 6c 69 63 61 74 t-Type: applicat 0070 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d ion/octet-stream 0080 3b 20 6e 61 6d 65 3d 22 66 69 6c 65 2e 62 69 6e ; name="file.bin 0090 22 0d 0a 43 6f 6e 74 65 6e 74 2d 44 69 73 70 6f "..Content-Dispo 00a0 73 69 74 69 6f 6e 3a 20 61 74 74 61 63 68 6d 65 sition: attachme 00b0 6e 74 3b 20 66 69 6c 65 6e 61 6d 65 3d 22 66 69 nt; filename="fi 00c0 6c 65 2e 62 69 6e 22 0d 0a 43 6f 6e 74 65 6e 74 le.bin"..Content 00d0 2d 54 72 61 6e 73 66 65 72 2d 45 6e 63 6f 64 69 -Transfer-Encodi 00e0 6e 67 3a 20 62 61 73 65 36 34 0d 0a 4e 6d 4d 6a ng: base64..NmMj 00f0 69 46 63 69 2d 2d 2d 2d 2d 2d 3d 5f 4e 65 78 74 iFci------=_Next 0100 50 61 72 74 5f 30 30 30 5f 30 30 30 35 5f 30 31 Part_000_0005_01 0110 42 44 45 32 45 43 2e 38 42 32 38 36 43 30 30 2d BDE2EC.8B286C00- 0120 2d 0d 0a 0d 0a 0d 0a 2e 0d 0a -......... Исходник: Код (Text): .386 .model flat,stdcall option casemap:none WinMain proto :DWORD,:DWORD,:DWORD,:DWORD include E:\masm32\include\windows.inc include E:\masm32\include\kernel32.inc include E:\masm32\include\user32.inc include E:\masm32\include\advapi32.inc include E:\masm32\include\gdi32.inc include E:\masm32\include\ws2_32.inc includelib E:\masm32\lib\kernel32.lib includelib E:\masm32\lib\user32.lib includelib E:\masm32\lib\advapi32.lib includelib E:\masm32\lib\gdi32.lib includelib E:\masm32\lib\ws2_32.lib include E:\masm32\macros\Strings.mac IN_ADDR struct s_addr dd ? IN_ADDR ends SOCKADDR_IN struct sin_family dw ? sin_port dw ? sin_addr IN_ADDR <?> sin_zero db 8h dup(?) SOCKADDR_IN ends HOSTENT struct h_name dd ? h_aliases dd ? h_addrtype dw ? h_length dw ? h_addr dd ? HOSTENT ends .DATA ClassName db "SimpleWinClass",0 AppName db "Our First Window",0 OurText db "Win32 assembly is great and easy!",0 .DATA? hInstance HINSTANCE ? CommandLine LPSTR ? .CODE start: invoke GetModuleHandle, NULL mov hInstance,eax invoke GetCommandLine mov CommandLine,eax invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT invoke ExitProcess,eax WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD LOCAL wc:WNDCLASSEX LOCAL msg:MSG LOCAL hwnd:HWND mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, OFFSET WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL push hInst pop wc.hInstance mov wc.hbrBackground,COLOR_WINDOW+1 mov wc.lpszMenuName,NULL mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon,NULL,IDI_APPLICATION mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx, addr wc invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\ WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\ CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\ hInst,NULL mov hwnd,eax invoke ShowWindow, hwnd,SW_SHOWNORMAL invoke UpdateWindow, hwnd ;invoke CreateThread,0h,0h,offset Some,0h,0h,offset ThreadId .WHILE TRUE invoke GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax) invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg .ENDW mov eax,msg.wParam ret WinMain endp .data? controls dd 100h dup(?) wsadata WSADATA <> .code encodeBase64 proc xor esi,esi ; encodeBase64 by Bumblebee. All rights reserved ;) call over_enc_table db "ABCDEFGHIJKLMNOPQRSTUVWXYZ" db "abcdefghijklmnopqrstuvwxyz" db "0123456789+/" over_enc_table: pop edi push ebp xor ebp,ebp baseLoop: movzx ebx,byte ptr [eax] shr bl,2 and bl,00111111b mov bh,byte ptr [edi+ebx] mov byte ptr [edx+esi],bh inc esi mov bx,word ptr [eax] xchg bl,bh shr bx,4 mov bh,0 and bl,00111111b mov bh,byte ptr [edi+ebx] mov byte ptr [edx+esi],bh inc esi inc eax mov bx,word ptr [eax] xchg bl,bh shr bx,6 xor bh,bh and bl,00111111b mov bh,byte ptr [edi+ebx] mov byte ptr [edx+esi],bh inc esi inc eax xor ebx,ebx movzx ebx,byte ptr [eax] and bl,00111111b mov bh,byte ptr [edi+ebx] mov byte ptr [edx+esi],bh inc esi inc eax inc ebp cmp ebp,24 jna DontAddEndOfLine xor ebp,ebp ; Добавляем новую линию mov word ptr [edx+esi],0A0Dh inc esi inc esi test al,00h ; Оптимизиpовано org $-1 DontAddEndOfLine: inc ebp sub ecx,3 or ecx,ecx jne baseLoop mov ecx,esi add edx,esi pop ebp ret encodeBase64 endp myconnect PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD .data helo_mes db "HELO",0h mail_from db "MAIL FROM:<",0h rcpt_mes db "RCPT TO:<",0h datames db "DATA",0Dh,0Ah,0h subj_mes db "SUBJECT: ",0h my_message db "Hello World!!!",0Dh,0Ah,0Dh,0Ah,".",0Dh,0Ah,0h quit_mes db "QUIT",0Dh,0Ah,0h .code recvy PROTO :DWORD,:DWORD recvy proc memheap:DWORD,s:DWORD mov eax,memheap add eax,1000h push eax invoke lstrlen,eax pop edx add eax,edx invoke recv,s,eax,100h,0h ret recvy endp clear PROTO :DWORD clear proc memheap:DWORD mov edi,memheap mov ecx,200h xor eax,eax rep stosb ret clear endp myconnect proc hWnd,hMemo,hEdit,hEdit2,hEdit3,hEdit4,hMemo2 LOCAL s:SOCKET LOCAL memheap:DWORD LOCAL procheap:DWORD LOCAL sin:SOCKADDR_IN LOCAL memory:DWORD ;jmp endy invoke GetProcessHeap mov procheap,eax invoke HeapAlloc,eax,HEAP_ZERO_MEMORY,4000h mov memheap,eax invoke WSAStartup,101h,offset wsadata invoke socket,AF_INET,SOCK_STREAM,0h mov s,eax mov eax,memheap add eax,5h invoke SendMessage,hEdit,WM_GETTEXT,50h,eax mov eax,memheap add eax,5h invoke gethostbyname,eax assume eax:ptr HOSTENT mov eax,[eax].h_addr assume eax:nothing mov eax,[eax] mov eax,[eax] MOV sin.sin_addr.s_addr,eax MOV sin.sin_port,1900h MOV sin.sin_family,AF_INET invoke connect,s,addr sin,sizeof(sockaddr_in) ;xor eax,eax .if eax==0h mov eax,memheap add eax,1000h invoke recv,s,eax,100h,0h invoke lstrcpy,memheap,offset helo_mes add eax,sizeof helo_mes-1h mov byte ptr [eax],20h inc eax push eax invoke SendMessage,hEdit,WM_GETTEXT,50h,eax pop edx mov dword ptr [eax][edx],0A0Dh invoke lstrlen,memheap invoke send,s,memheap,eax,0h mov eax,memheap add eax,1000h invoke recv,s,eax,100h,0h invoke clear,memheap invoke lstrcpy,memheap,offset mail_from add eax,sizeof mail_from-1h push eax invoke SendMessage,hEdit2,WM_GETTEXT,50h,eax pop edx mov dword ptr [eax][edx],'>' or 0A0D00h add eax,3h invoke lstrlen,memheap invoke send,s,memheap,eax,0h invoke recvy,memheap,s invoke clear,memheap invoke lstrcpy,memheap,offset rcpt_mes add eax,sizeof rcpt_mes-1h push eax invoke SendMessage,hEdit3,WM_GETTEXT,50h,eax pop edx mov dword ptr [eax][edx],'>' or 0A0D00h add eax,3h invoke lstrlen,memheap invoke send,s,memheap,eax,0h mov eax,memheap add eax,1000h push eax invoke lstrlen,eax pop edx add eax,edx invoke recv,s,eax,100h,0h invoke clear,memheap invoke lstrcpy,memheap,offset datames mov eax,sizeof datames-1h invoke send,s,memheap,eax,0h invoke recvy,memheap,s invoke clear,memheap invoke VirtualAlloc,0h,100000h,MEM_COMMIT,PAGE_READWRITE mov memory,eax invoke lstrcpy,memory,offset subj_mes add eax,sizeof subj_mes-1h push eax invoke SendMessage,hEdit4,WM_GETTEXT,50h,eax pop edx mov word ptr [eax][edx],0A0Dh add eax,2h mov word ptr [eax][edx],0A0Dh add eax,2h add eax,edx invoke SendMessage,hMemo2,WM_GETTEXT,400h,eax .data comment @ MyFile db "MIME-Version: 1.0",0Ah,0Dh db "Content-Type: multipart/mixed;",0Ah,0Dh db 'boundary="----=_NextPart_000_0005_01BDE2FC.8B286C00"',0Ah,0Dh db "X-Priority: 3",0Ah,0Dh db "X-MSMail-Priority: Normal",0Ah,0Dh db "X-Unsent: 1",0Ah,0Dh db "X-MimeOLE: Produced By Microsoft MimeOLE V4.72.3110.3",0Ah,0Dh db 0Ah,0Dh db "------=_NextPart_000_0005_01BDE2EC.8B286C00",0Ah,0Dh db "Content-Type: text/plain; charset=iso-8859-1" db "Content-Transfer-Encoding: quoted-printable" db 0Ah,0Dh db "Put here whatever you want",0Ah,0Dh db 0Ah,0Dh db "------=_NextPart_000_0005_01BDE2EC.8B286C00",0Ah,0Dh db "Content-Type: application/octet-stream; name=filename.exe",0Ah,0Dh db "Content-Transfer-Encoding: base64",0Ah,0Dh db 'Content-Disposition: attachment; filename="filename.exe"',0Ah,0Dh db 0Ah,0Dh ;db "Here would come BASE64 encoded file.",0Ah,0Dh,0h @ comment @ MyFile db "MIME-Version: 1.0" db "Content-Type: multipart/mixed;" db 'boundary="----=_NextPart_000_0005_01BDE2FC.8B286C00"' db "X-Priority: 3" db "X-MSMail-Priority: Normal" db "X-Unsent: 1" db "X-MimeOLE: Produced By Microsoft MimeOLE V4.72.3110.3" db "------=_NextPart_000_0005_01BDE2EC.8B286C00" db "Content-Type: text/plain; charset=iso-8859-1" db "Content-Transfer-Encoding: quoted-printable" db "Put here whatever you want" db "------=_NextPart_000_0005_01BDE2EC.8B286C00" db "Content-Type: application/octet-stream; name=filename.exe" db "Content-Transfer-Encoding: base64" db 'Content-Disposition: attachment; filename="filename.exe"' db 36h,63h,23h @ comment @ MyFile db 'Content-Type: application/octet-stream; name="file.bin"' db 'Content-Disposition: attachment; filename="file.bin"' db "Content-Transfer-Encoding: base64" db 36h,63h,23h db 0h @ [b] MyFile db 'Content-Type: application/octet-stream; name="file.bin"',0Dh,0Ah db 'Content-Disposition: attachment; filename="file.bin"',0Dh,0Ah db 'Content-Transfer-Encoding: base64',0Dh,0Ah,0h coding_data db 36h,63h,23h,88h,57h,22h end_of_File db "------=_NextPart_000_0005_01BDE2EC.8B286C00--",0Dh,0Ah,0h [/b] .code invoke lstrlen,memory mov edx,memory mov word ptr [eax][edx],0A0Dh add eax,2h mov word ptr [eax][edx],0A0Dh add eax,2h add eax,memory invoke lstrcpy,eax,offset MyFile invoke lstrlen,memory mov edx,eax add edx,memory mov eax,offset coding_data mov ecx,sizeof coding_data call encodeBase64 invoke lstrlen,memory add eax,memory invoke lstrcpy,eax,offset end_of_File invoke lstrlen,memory mov edx,memory mov dword ptr [eax][edx],0A0Dh inc eax inc eax mov dword ptr [eax][edx],2E0A0Dh add eax,3h mov dword ptr [eax][edx],0A0Dh inc eax inc eax invoke lstrlen,memory invoke send,s,memory,eax,0h invoke VirtualFree,memory,100000h,MEM_DECOMMIT invoke recvy,memheap,s invoke clear,memheap invoke lstrcpy,memheap,offset quit_mes mov eax,sizeof quit_mes-1h invoke send,s,memheap,eax,0h mov eax,memheap add eax,1000h push eax push eax invoke lstrlen,eax pop edx add eax,edx invoke recv,s,eax,100h,0h add edx,eax pop eax invoke SendMessage,hMemo,WM_SETTEXT,edx,eax .endif invoke closesocket,s invoke WSACleanup invoke HeapFree,procheap,0h,memheap endy: ret myconnect endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM CONTSTR STRUCT button dd ? edit dd ? edit2 dd ? edit3 dd ? edit4 dd ? memo dd ? memo2 dd ? CONTSTR ENDS mov esi,offset controls assume esi:ptr CONTSTR .if uMsg==WM_CREATE invoke CreateWindowEx,0h,$CTA0("BUTTON"),$CTA0("Send"),WS_VISIBLE or WS_CHILD or BS_DEFPUSHBUTTON,160,20,80,20,hWnd,0,hInstance,0 mov [esi].button,eax invoke CreateWindowEx,0h,$CTA0("EDIT"),$CTA0("www.yandex.ru"),WS_VISIBLE or WS_CHILD or WS_BORDER or ES_AUTOHSCROLL,270,50,200,20,hWnd,0,hInstance,0 mov [esi].edit,eax invoke CreateWindowEx,0h,$CTA0("EDIT"),$CTA0("xxx@rambler.ru"),WS_VISIBLE or WS_CHILD or WS_BORDER or ES_AUTOHSCROLL,490,50,200,20,hWnd,0,hInstance,0 mov [esi].edit2,eax invoke CreateWindowEx,0h,$CTA0("EDIT"),$CTA0("xxx@rambler.ru"),WS_VISIBLE or WS_CHILD or WS_BORDER or ES_AUTOHSCROLL,490,80,200,20,hWnd,0,hInstance,0 mov [esi].edit3,eax invoke CreateWindowEx,0h,$CTA0("EDIT"),$CTA0("Hello"),WS_VISIBLE or WS_CHILD or WS_BORDER or ES_AUTOHSCROLL,490,110,200,20,hWnd,0,hInstance,0 mov [esi].edit4,eax invoke CreateWindowEx,0h,$CTA0("EDIT"),$CTA0(""),WS_VISIBLE or WS_CHILD or WS_BORDER or WS_VSCROLL or ES_MULTILINE,10,50,250,250,hWnd,0,hInstance,0 mov [esi].memo,eax invoke CreateWindowEx,0h,$CTA0("EDIT"),$CTA0("Hello "),WS_VISIBLE or WS_CHILD or WS_BORDER or WS_VSCROLL or ES_MULTILINE,270,80,200,220,hWnd,0,hInstance,0 mov [esi].memo2,eax ;invoke SendMessage,hWnd,WM_PAINT,0h,0h .endif .if uMsg==WM_COMMAND mov eax,dword ptr [esi].button .if lParam==eax invoke myconnect,hWnd,[esi].memo,[esi].edit,[esi].edit2,[esi].edit3,[esi].edit4,[esi].memo2 .endif .endif .if uMsg==WM_PAINT .endif assume esi:nothing .if uMsg==WM_DESTROY invoke PostQuitMessage,NULL .else invoke DefWindowProc,hWnd,uMsg,wParam,lParam ; xor eax, eax .endif ret WndProc endp end start
Ethereal: No. Time Source Destination Protocol Info 22 26.180436 192.168.23.128 77.88.21.11 SMTP Message Body Frame 22 (298 bytes on wire, 298 bytes captured) Ethernet II, Src: Vmware_d9:c1:6f (00:0c:29:d9:c1:6f), Dst: Vmware_ed:54:a0 (00:50:56:ed:54:a0) Destination: Vmware_ed:54:a0 (00:50:56:ed:54:a0) Address: Vmware_ed:54:a0 (00:50:56:ed:54:a0) .... ...0 .... .... .... .... = Multicast: This is a UNICAST frame .... ..0. .... .... .... .... = Locally Administrated Address: This is a FACTORY DEFAULT address Source: Vmware_d9:c1:6f (00:0c:29:d9:c1:6f) Address: Vmware_d9:c1:6f (00:0c:29:d9:c1:6f) .... ...0 .... .... .... .... = Multicast: This is a UNICAST frame .... ..0. .... .... .... .... = Locally Administrated Address: This is a FACTORY DEFAULT address Type: IP (0x0800) Internet Protocol, Src: 192.168.23.128 (192.168.23.128), Dst: 77.88.21.11 (77.88.21.11) Version: 4 Header length: 20 bytes Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00) Total Length: 284 Identification: 0x05c1 (1473) Flags: 0x04 (Don't Fragment) Fragment offset: 0 Time to live: 128 Protocol: TCP (0x06) Header checksum: 0xb98f [correct] Source: 192.168.23.128 (192.168.23.128) Destination: 77.88.21.11 (77.88.21.11) Transmission Control Protocol, Src Port: 1150 (1150), Dst Port: smtp (25), Seq: 87, Ack: 295, Len: 244 Simple Mail Transfer Protocol Message: SUBJECT: Hello\r\n Message: \r\n Message: Hello 876\345876\345\r\n Message: \r\n Message: Content-Type: application/octet-stream; name="file.bin"\r\n Message: Content-Disposition: attachment; filename="file.bin"\r\n Message: Content-Transfer-Encoding: base64\r\n Message: NmMjiFci------=_NextPart_000_0005_01BDE2EC.8B286C00--\r\n Message: \r\n Message: \r\n Message: .\r\n
Ты всё таки что-то непонятное делаешь. Так выглядит мини письмо. Указано что формат текстовой (хотя можно было и не указывать, а просто оставить пустую строку в начале): Код (Text): Content-type: text/plain; Hello world! Есть заголовок в котором указан тип и содержимое. Заголовок от содержимого отделяют пустой строкой. Более сложны вариант, текст и вложенный архив: Код (Text): Content-type: multipart/mixed; boundary="simple boundary" --simple boundary Content-Type: text/plain; Hello ! --simple boundary Content-Type: application/x-zip-compressed;name="TT25.zip" Content-Disposition: attachment; filename="TT25.zip" Content-Transfer-Encoding: base64 --simple boundary-- Указан формат multipart/mixed, это значит что письмо имеет множество секций, указано чем разделяются секции. Обрати внимание на то как они разделяются и как закрывается последняя секция. multipart/mixed - состоит из секций, которые используются одновременно. multipart/alternative - для просмотра выбирается одна из секций, с более удобным форматом. Более сложный вариант когда у письма есть вложение, и текст ввиде двух вариантов (txt,html), тогда оно имеет древовидный формат: Код (Text): multipart/mixed multipart/alternative text/plain text/html application/x-zip-compressed т.е. указано что письмо имеет формат multipart/mixed, внутри которого есть архив и вложенная секций с текстом (multipart/alternative). Т.е. почтовик покажет тебе архив и один текст, который выберет по своему желанию, либо html либо txt. Секции внутри multipart/mixed, multipart/alternative надо отделять друг от друга и закрывать последнюю (разделители как ты понял должны быть разные).
Что-то не получается... В письме вместо вложения получается вот такой текст: Код (Text): Content-type: multipart/mixed; boundary="simple boundary" --simple boundary Content-Type: text/plain; Hello ! --simple boundary Content-Type: application/x-zip-compressed;name="TT25.zip" Content-Disposition: attachment; filename="TT25.zip" Content-Transfer-Encoding: base64 --simple boundary-- Вложение интерпретируется как текст почему-то... Тут я типа файл TT25.zip нулевого размере передаю... Можно ведь так? Ethereal: Код (Text): No. Time Source Destination Protocol Info 24 7.247498 192.168.23.128 87.250.251.11 SMTP Message Body Frame 24 (391 bytes on wire, 391 bytes captured) Ethernet II, Src: Vmware_d9:c1:6f (00:0c:29:d9:c1:6f), Dst: Vmware_ed:54:a0 (00:50:56:ed:54:a0) Internet Protocol, Src: 192.168.23.128 (192.168.23.128), Dst: 87.250.251.11 (87.250.251.11) Transmission Control Protocol, Src Port: 1171 (1171), Dst Port: smtp (25), Seq: 87, Ack: 296, Len: 337 Simple Mail Transfer Protocol Message: SUBJECT: Hello888\r\n Message: \r\n Message: Content-type: multipart/mixed; boundary="simple boundary"\r\n Message: \r\n Message: --simple boundary\r\n Message: Content-Type: text/plain;\r\n Message: \r\n Message: Hello !\r\n Message: \r\n Message: --simple boundary\r\n Message: Content-Type: application/x-zip-compressed;name="TT25.zip"\r\n Message: Content-Disposition: attachment; filename="TT25.zip"\r\n Message: Content-Transfer-Encoding: base64\r\n Message: \r\n Message: --simple boundary--\r\n Message: \r\n Message: .\r\n
Header db 'Message-ID: <%s>',CrLf db 'From: <%s>',CrLf db 'To: <%s>',CrLf db 'Subject: Text',CrLf db 'MIME-Version: 1.0',CrLf db 'Content-Type: application/octet-stream; name="file.txt"',CrLf db 'Content-Disposition: attachment; filename="file.txt"',CrLf db 'Content-Transfer-Encoding: base64',CrLf db 'TextInBase64',CrLf,0
Спасибо! Это получилось! + Нужно, чтобы данные были выровнены на 3 байта! Код (Text): Message: SUBJECT: Hello888\r\n Message: MIME-Version: 1.0\r\n Message: Content-Type: application/octet-stream; name="file.txt"\r\n Message: Content-Disposition: attachment; filename="file.txt"\r\n Message: Content-Transfer-Encoding: base64\r\n Message: SGFwcHkgTmV3IFllYXIhISEhICAg\r\n Message: \r\n Message: .\r\n