Ошибка: 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. Практика.
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