Большой архив статей, книг, документации по программированию, вебдизайну, компьютерной графике, сетям, операционным системам и многому другому
 
<Добавить в Избранное>    <Сделать стартовой>    <Реклама на сайте>    <Контакты>
  Главная Документация Программы Обои   Экспорт RSS E-Books
 
Поиск по сайту

 

  Раздел: Компьютерная документация -> Программирование -> Assembler

 

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

  1. Введение.
  2. SMTP. Теория
  3. SMTP. Практика
  4. Заключение

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:<e-mail@server.ext>[CRLF], а получателя RCPT TO:<e-mail@server.ext>[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:<
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. Заключение

Думаю, что эта статья хоть кому-нибудь пригодится. Или хотя бы облегчит жизнь, так как готовой информации для "низкоуровнего" программиста достаточно мало, а искать в интернете крохи информации и исходники, а потом в них разбираться порой нет времени, а иногда и желания.

Благодарность:

  1. Ct757 за помощь и утилиту pfcode, которая придала моему ужасному коду ровный и красивый вид.
  2. Bill Prisoner за идею написания статьи.
  3. revers я б вообще не трогал этот СМТП.

Использованная литература:

  1. Использование сокетов/взаимодействие с SMTP-сеpвеpами [Billy Belcebu/IKX, пер. Aquila]
  2. Руководство Beej по сетевому программированию, используя интернет-сокеты [Брайан "Beej" Холл, пер. varnie]
  3. INFECTED VOICE #15 - Введение ... в Интернет. Диалог с SMTP сервером на Assembler
  4. Исходный код Xinch.
  5. RFC #821 #2554

Программа smtp.rar

Автор: Freeman
Источник: www.wasm.ru

Ссылки по теме
CODE-RIP: искусство выдирания чужого кода - Часть I. Теория
Пишем свой загрузочный сектор
Динамический опрос клавиатуры
Основы разработки прикладных виртуальных драйверов
Оптимизация программ на ассемблере
 

Компьютерная документация от А до Я - Главная

 
ключ стим
 
Интересное в сети
10 новых программ
CodeLobster PHP Edition 3.7.2
WinToFlash 0.7.0008
Free Video to Flash Converter 4.7.24
Total Commander v7.55
aTunes 2.0.1
Process Explorer v12.04
Backup42 v3.0
Predator 2.0.1
FastStone Image Viewer 4.1
Process Lasso 3.70.4
FastStone Image Viewer 4.0
Xion Audio Player 1.0.125
Notepad GNU v.2.2.8.7.7
K-Lite Codec Pack 5.3.0 Full

Наши сервисы
Рассылка новостей. Подпишитесь на рассылку сейчас и вы всегда будете в курсе последних событий в мире информационных технологий.
Новостные информеры. Поставьте наши информеры к себе и у вас на сайте появится дополнительный постоянно обновляемый раздел.
Добавление статей. Если вы являетесь автором статьи или обзора на тему ИТ присылайте материал нам, мы с удовольствием опубликуем его у себя на сайте.
Реклама на сайте. Размещая рекламу у нас, вы получите новых посетителей, которые могут стать вашими клиентами.
 
Это интересно
 

Copyright © CompDoc.Ru
При цитировании и перепечатке ссылка на www.compdoc.ru обязательна. Карта сайта.
 
Rambler's Top100