Навигация
  Главня
Статьи
-Сеть
--Безопасность
-Графика
--Photoshop
--Corel Draw
--Illustrator
-ОС
--Windows
--Linux
--Unix
-SEO
-Дизайн
--Web-Design
-Разное
-Программирование
--Delphy
--C/C++
--.NET
--PHP
--Pascal
--Perl
--Visual Basic
--Ассемблер
--Java
--Java Script
--ASP
Книги

Карта Сайта
Наши Сайты
Обратная связь
Новое на сайте
Статьи про любовь

 
Вход
 
Логин
Пароль
 

 
Найти
 

 
Партнёры
 

 
Статистика
 

 
Популярное
 

 
Календарь
 
«    Ноябрь 2007    »
ПнВтСрЧтПтСбВс
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 

 
Архив
  Сентябрь 2008 (4)
Июнь 2008 (4)
Май 2008 (12)
Апрель 2008 (49)
Март 2008 (51)
Февраль 2008 (73)
Январь 2008 (40)
Декабрь 2007 (58)
Ноябрь 2007 (61)
Октябрь 2007 (51)
Сентябрь 2007 (82)

 
Реклама
  мотоэкипировка sinisalo польша, иллюстрированный каталог мотоэкипировка
профилированный брус цена Кулинарные рецепты на Cook-room.com - с пошаговыми фото

 
Казино
 

Интернет-казино Grand Casino произвело фурор в игорном мире. Одно из самых важных нововведений - наличие системы контроля честности всех азартных игр казино. Наличие контроля честности дает возможность полностью уйти в игру, не задумываясь о подтасовке или обмане. В Grand Casino можно пополнить счет и вывести выигрыш большим количеством способов:(SMS, E-gold, Rupay, Яндекс.Деньги, Webmoney,Кредитные карты,...). Теперь азартные игры на деньги стали доступнее. Предоставлены игры: Рулетка, Покер, Блэкджек, Видео Покер, Игровые автоматы, Кено.

   

Статьи » Программирование » Ассемблер » Отправка по 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 />
    [email protected]

    >[CRLF]

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

    

    RCPT TO:<<br />
    [email protected]

    >[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
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо зайти на сайт под своим именем.
Вы читаете: Статьи » Программирование » Ассемблер » Отправка по SMTP с авторизацией
Статьи по теме:
  • Графический счётчик на PHP
  • Установка свойств для элементов управления и объектов
  • Как узнать размер базы данных MySQL через php
  • Как узнать размер базы данных MySQL через php
  • Время выполнения SQL запросов
  •  (голосов: 0)
    Просмотров: 3160 :: Комментарии: (0) :: :: Напечатать

    Информация
    Посетители, находящиеся в группе Гости, не могут оставлять комментарии в данной новости.
     
    Design by PODPOLE