Главная » Отправка по SMTP с авторизацией
Введение.SMTP. ТеорияSMTP. ПрактикаЗаключение1. Введение.Практически каждый, кто сталкивается с работой в инете на низкомуровне при создании какой-либо почтовой программы, оповещалки, либотроя или кейлогера, напарывается на такой неприятный облом, какавторизация. Ведь многие SMTP-серверы не дают пользователю нормальноотправить письмо, а требуют какие-то логин и пароль. В этой статье я попытаюсь раскрыть эту проблему, простымисловами написать то, что написано в более "расплывчатом" виде в rfc,который почему-то всем лень читать. И, конечно, данная статья будеториентирована на "низкоуровневых" программистов. Я буду писать подфасм, но думаю, что для Вас не составит особого труда переделатьпримеры под более удобный для Вас компилятор.2. SMTP. ТеорияИтак, теперь кратко, что такое SMTP - Simple Mail TransferProtocol. Задача протокола - это удобная передача электронной почты. Ноесли не делать отступлений и не вдаваться в подробности, то это простонекоторое количество команд и "спецсимволов", позволяющих отправлятьписьма. Для того, чтоб собственноручно пообщаться с сервером, можновзять обычный телнет (Пуск-Выполнить-telnet) и зайти на 25 портсервера.Делается это командой open smtp.servak.net 25. И ,если всё пройдёт удачно, Вы получите ответ от сервера.Далее следует начать работу с сервером, а для этого его надопоприветствовать. так как сервер нормальных слов не понимает, сделатьэто надо командой EHLO someword[CRLF].[CRLF]=Enter=13,10 (каждая команда завершается этойпоследовательностью байт). После утвердительного ответа можноприступать непосредственно к отправке писем.Задать отправителя письма можно командой MAIL FROM:[CRLF], а получателя RCPT TO:[CRLF].После того как эти параметры заданы, можно приступать к написанию письма. Для этого надо послать команду DATA[CRLF].Теперь то можно набрать тело письма. Чтоб завершить письмо, следует отправить последовательность вида[CRLF].[CRLF] на сервер. Если все пройдёт удачно, то письмо будет отправлено адресату. Завершить работу с сервером следует командой QUIT[CRLF].Так просто было общаться с сервером не слишком долгое время.Теперь, прежде чем отправить письмо, следует авторизироваться. Естьнесколько способов авторизации, но я опишу самый простой, которыйподдерживается большинством SMTP-серверов. Чтоб начать авторизацию,следует послать на сервер команду AUTH LOGIN[CRLF], но преждеубедитесь, что данный сервер поддерживает эту команду.В случае принятия команды сервер запросит у Вас логин и пароль(запросы будут зашифрованы в Base64). следовательно логин и пароль надоотправлять, предварительно зашифровав их в Base64. При удачнойаутентификации будет выведено соответствующее сообщение. После этого Выможете задать адрес отправителя (должен быть привязан к логину),получателя и отправить письмо.Но лучше раз увидеть, чем 100 раз услышать, поэтому я приведу пример диалога с сервером (s - server, u - user):s:220 mail.ru ESMTP Sat, 15 Apr 2006 16:46:49 +0400
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 Категория: Языки программирования | Просмотров: 115