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


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


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


Отправка по 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

 

Интересное

10 способов проверки среды...
Служба Каталогов (Active Directory Services) — действующий стандарт для инициализации учётных записей, базового системного управления и DNS-идентификации в большинстве сред. Ведение отчётности...
Подробнее...
Своя CMS на PHP. Часть 1
Итак, с чего начнем... естественно с проектирования. Что должна уметь/иметь не крутая, простенькая CMS? Этот вопрос достаточно сложный, т.к. любая CMS, даже самая простая, пишется под конкретные...
Подробнее...
Шаги по увеличению...
Этот документ является списком параметров защиты для применения на FreeBSD серверах.Существует огромное количество статей, обзоров и инструкций в которых описаны методы защиты вашей FreeBSD...
Подробнее...
Java обгоняет по...
Одним из главных недостатков языка Java традиционно считается невысокая скорость работы программ по сравнению с приложениями на языке С++. И для приложений, где переносимость между платформами...
Подробнее...
Малобюджетные веб-сайты
Сайтостроительство — мир, который изменяется быстро, растет с каждым без исключения днем, разработчику уже не достаточно вариться в собственном маленьком мирке, почитывая документацию в оригинале...
Подробнее...
Что такое движок сайта?
Вообще-то, движок, это жаргонное выражение, правильное название – программный комплекс управления сайтом. Подобная система управления может состоять из множества небольших модулей (т.е. несколько...
Подробнее...
Увеличение...
Настройка сетевой подсистемы FreeBSDЭта статья описывает несколько простых шагов, которые можно выполнить,для получения прироста производительности сетевой подсистемы, а такжеправильно выбрать...
Подробнее...
Разработка эффективной...
Саму идею интернет-торговли нельзя назвать новой. Первые российские интернет-магазины появились еще в конце 90-х годов прошлого века. Многие из них работают по сей день. Многих, к сожалению, давно...
Подробнее...
Установка IIS на Windows...
Internet Information Services (IIS) 6.0 – полнофункциональный веб-сервер, обеспечивающий основу для систем семейства Windows Server 2003, а также существующих веб-приложений и веб-служб XML. В IIS...
Подробнее...
Windows 2000 Pro: лучшая...
Когда я поинтересовался, может ли операционная система десятилетней давности типа Windows 98 по-прежнему быть жизнеспособным вариантом для использования на корпоративных настольных компьютерах,...
Подробнее...