Ошибка: Failed to parse the Currency Converter XML document.
$757.28


Ошибка: Failed to parse the Currency Converter XML document.
$1 434.43


Ошибка: Failed to parse the Currency Converter XML document.
$2 718.51


Отправка по SMTP с авторизацией

1. Введение.

Практически каждый, кто сталкивается с работой в инете на низком уровне при создании какой-либо почтовой программы, оповещалки, либо троя или кейлогера, напарывается на такой неприятный облом, как авторизация. Ведь многие SMTP-серверы не дают пользователю нормально отправить письмо, а требуют какие-то логин и пароль.

В этой статье я попытаюсь раскрыть эту проблему, простыми словами написать то, что написано в более «расплывчатом» виде в rfc, который почему-то всем лень читать. И, конечно, данная статья будет ориентирована на «низкоуровневых» программистов. Я буду писать под фасм, но думаю, что для Вас не составит особого труда переделать примеры под более удобный для Вас компилятор.


2. SMTP. Теория


Итак, теперь кратко, что такое SMTP — Simple Mail Transfer Protocol. Задача протокола — это удобная передача электронной почты. Но если не делать отступлений и не вдаваться в подробности, то это просто некоторое количество команд и «спецсимволов», позволяющих отправлять письма. Для того, чтоб собственноручно пообщаться с сервером, можно взять обычный телнет (Пуск-Выполнить-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 connection

3. SMTP. Практика.

Приступим непосредственно к практике. Напишем небольшую программку, которая будет посылать небольшое сообщение на заданный почтовый ящик с авторизацией. Я предполагаю, что Вы уже знакомы с WinSocks, и не буду на этом останавливаться. Вы можете скачать полную версию программы, а я разъясню только ключевые моменты. А именно работу процедуры Send_Mail

proc Send_Mail pszmess,pszfrom,pszto,pszlog,pszpass,pszserv,pszsubj

pszMess — само сообщение.
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 без использования алфавита. Далее идёт работа с WinSocks

        invoke     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:<<br />
    adres@mail.ru

    >[CRLF]

    [читаем ответ]

    

    RCPT TO:<<br />
    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

 

Интересное

Защита зрения от компьютера
Технический прогресс принес не только пользу человечеству, но еще и ощутимый вред здоровью людей, которые пользуются дарами цивилизации. О чем это я? Ну, конечно же, речь здесь идет о компьютерах...
Подробнее...
Flash-технология. Недостатки
Прежде, чем применять Flash на сайте, нужно семь раз отмерить. Оказывается, не все знают, что это такое. Одни применяют Flash от необходимости, другие — от незнания.Дело в том, что Flash — это не...
Подробнее...
Диски, разделы, буквы...
Вот, не кажется мне MS Windows такой дружественной, как утверждают её пользователи. Ничего удивительного, впрочем: сам я её пользователем практически не являюсь, и сталкиваюсь с ней...
Подробнее...
О Windows Vista
<img src=«http://i-faq.ru/uploads/posts/2007-09/1189807052_[b]windows[/b]_vista_logo.png» align=«left» style=«border: none;» alt=«О Windows Vista» />О Windows Vista слышали если не все, то, как...
Подробнее...
Red Hat и USB-устройства
Цель этой статьи — заставить работать мою USB мышь, USB камеру и USB жесткий диск с Linux«ом.Мой Компьютер с Emperor Linux и USBЯ начал использовать Red Hat 7.3. Хотя уже прошло много времени, и...
Подробнее...
Вирусы. Что это и как с...
Организация защиты компьютера примерно схожа с организацией зашиты частного дома, т.е. сперва укрепляются стены, заводится собака и возводится забор. В первую очередь при выходе пользователя в...
Подробнее...
Загрузчик операционной системы
В этой области данных жесткого диска должен быть расположен небольшой код загрузчика, назначение которого состоит только в том, чтобы передать управление дальше. Этот код передает управление в...
Подробнее...
Сквозная навигация
Сквозная навигация — это система связей (гиперссылок), облегчающих движение пользователя по сайту. Речь идёт о максимально возможном переплетении данных. Кроме того, наличие такой связи...
Подробнее...
АнтиОМОН v.1.0
Представь такую ситуацию, ты сидишь перед телеком, смотришь Санта Барбару и тут раздаётся звонок. Ты открываешь дверь и в квартиру входят несколько амбалов, представившись сотрудниками ФСБ =)Они...
Подробнее...
10 правил грамотной игры в...
Сегодня большинство пользователей Интернета знают о том, что почтовые рассылки являются одним из самых дешевых и эффективных методов рекламы. И это правда. Беда только в том, что основная масса...
Подробнее...