u:EHLO server
s:250-mx6.mail.ru Hello server [111.11.11.111]
s:250-SIZE 10485760
s:250-8BITMIME
s:250-AUTH PLAIN LOGIN
s:250 PIPELINING
u:AUTH LOGIN
s:334 VXNlcm5hbWu6
u:dGVzdF9fXzAwMDAz
s:334 UGFzc3dvcmQ6
u:dGVzdF9fXzAwMDAz
s:235 Authentication succeeded
u:MAIL FROM:
s:250 OK
u:RCPT TO:
s:250 Accepted
u:DATA
s:354 Enter message, ending with "." on a line by itself
u:asdf
u:.
s:250 OK id=1FUkCk-000OR2-00
u:QUIT
s:221 mx6.mail.ru closing connection3. SMTP. Практика.Приступим непосредственно к практике. Напишем небольшуюпрограммку, которая будет посылать небольшое сообщение на заданныйпочтовый ящик с авторизацией. Я предполагаю, что Вы уже знакомы сWinSocks, и не буду на этом останавливаться.Вы можете скачать полную версию программы, а я разъясню только ключевыемоменты. А именно работу процедуры Send_Mailproc Send_Mail pszmess,pszfrom,pszto,pszlog,pszpass,pszserv,pszsubjpszMess - само сообщение.
pszfrom - адрес отправителя
pszto - адрес получателя
pszlog, szpass - логин и пароль для авторизации
pszserv - сервер
pszsubj - тема письмаlea ebx,[base64log]
invoke lstrlen,[pszlog]
stdcall Base64Encode, dword [pszlog],ebx,eax
add ebx,200
invoke lstrlen,[pszpass]
stdcall Base64Encode, dword [pszpass],ebx,eaxТут шифруется логин и пароль в Base64, используется алгоритм by RT Fishel без использования алфавита.Далее идёт работа с WinSocksinvoke socket,2,1,0Создается сокетinvoke gethostbyname,[pszserv]
test eax,eax
jz cantfinds
mov eax,[eax+0ch]
mov eax,[eax]
mov eax,[eax]Тут в качестве параметра gethostbyname передаётся указатель настроку с именем сервера, а потом из структуры hostent извлекаетсяsin_addr.mov ax,25
xchg ah,al
mov word [saddr.sin_port], axКоннект на 25 порт, только нужно учитывать порядок байт.call get_data
test eax,eax
jz errrecvПосле коннекта прочитаем ответ сервера.Следует отметить, что все ответы сервера начинаются сопределенного кода. Несложно увидеть, что в случае успеха кодначинается либо с цифры 2, либо с 3. На этом основана проверка ошибок впроцедуре get_data.Теперь немного о вспомогательных процедурах:sendNrecv - передаёт строку, указатель на которую следует поместить в еах, на сервер, получает ответ сервера.
Send_String - просто передает строку, адрес которой передан как параметр, на сервер.Я не считаю, что следует рассматривать работу каждой из них, если Вы знакомы с WinSocks, то без проблем сделаете это сами.lea eax,[base64log]
stdcall Send_String,eax
mov eax,szEnd+3
call sendNrecv
lea eax,[base64pass]
stdcall Send_String,eax
mov eax,szEnd+3
call sendNrecvОтсылка логина и пароля на сервер. szEnd+3 - указатель на [CRLF].Получается, что мы передаем строку, а после этого [CRLF] и читаемответ. Далее все по порядку, описанному в начале статьи.Программа отсылает строки примерно таким образом:MAIL FROM:<
adres@mail.ru
>[CRLF]
[читаем ответ]
RCPT TO:<
adres@mail.ru
>[CRLF]
[читаем ответ]
DATA[CRLF]
Subject:
SMTP work's
[CRLF]
test
[CRLF].[CRLF]
[читаем ответ]
QUIT
[ответ]sЧтоб передать файл, нужно в теле сообщения создать заголовок видаContent-Type: application/octet-stream; name="file.bin"
Content-Disposition: attachment; filename="file.bin"
Content-Transfer-Encoding: base64После чего просто передать файл, зашифрованный в Base64.4. ЗаключениеДумаю, что эта статья хоть кому-нибудь пригодится. Или хотя быоблегчит жизнь, так как готовой информации для "низкоуровнего"программиста достаточно мало, а искать в интернете крохи информации иисходники, а потом в них разбираться порой нет времени, а иногда ижелания. Благодарность:Ct757 за помощь и утилиту pfcode, которая придала моему ужасному коду ровный и красивый вид.Bill Prisoner за идею написания статьи.revers я б вообще не трогал этот СМТП.Использованная литература:Использование сокетов/взаимодействие с SMTP-сеpвеpами [Billy Belcebu/IKX, пер. Aquila]Руководство Beej по сетевому программированию, используя интернет-сокеты [Брайан "Beej" Холл, пер. varnie]INFECTED VOICE #15 - Введение ... в Интернет. Диалог с SMTP сервером на AssemblerИсходный код Xinch.RFC #821 #2554
Программа http://www.wasm.ru/pub/16/files/smtp.rar