FASM SMTP

Тема в разделе "WASM.BEGINNERS", создана пользователем eua, 25 июл 2010.

  1. eua

    eua New Member

    Публикаций:
    0
    Регистрация:
    25 июл 2010
    Сообщения:
    42
    всем привет.возникла проблема с отправкой на Smtp,не один добытый пример не фурычит.подсобите если кто распологает свежим примером на FASM.
     
  2. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    переделаете с Си ?
    Код (Text):
    1. #include <stdio.h>
    2. #include <windows.h>
    3. #include "util.h"
    4.  
    5. #define ENCODE_SEND(buf, string) do { \
    6.     base64_encode(buf, string, strlen(string)); \
    7.     strcat(buf, "\r\n"); \
    8.     printf("send - %s", buf); \
    9.     send(sock, buf, strlen(buf), 0); \
    10.     } while (0)
    11.    
    12. #define SEND(buf) do { \
    13.     printf("send - %s", buf); \
    14.     send(sock, buf, strlen(buf), 0); \
    15.     } while (0)
    16.  
    17. #define RECV(buf) do { \
    18.     memset(buf, 0, sizeof(buf)); \
    19.     recv(sock, buf, sizeof(buf), 0); \
    20.     printf("recv - %s", buf); \
    21.     } while (0)
    22.  
    23. #define MAX_SEND_RECV_BUFF 256
    24.  
    25. int main(void)
    26. {
    27.     SOCKET sock;
    28.     CHAR buff[MAX_SEND_RECV_BUFF];
    29.     WsaInit();
    30.     Init(&sock, "smtp.mail.ru", 25);
    31.     RECV(buff);
    32.     SEND("EHLO smtp.mail.ru\r\n");
    33.     RECV(buff);
    34.     SEND("AUTH LOGIN\r\n");
    35.     RECV(buff);
    36.     ENCODE_SEND(buff, "**********");
    37.     RECV(buff);
    38.     ENCODE_SEND(buff, "**************");
    39.     RECV(buff);
    40.     // начинаем отправлять конверт состоящий из полей
    41.     // MAIL FROM: и RCPT TO: После каждого поля ждем
    42.     // подтверждение
    43.     // сообщаем отправителя
    44.     SEND("MAIL FROM: *************@mail.ru\r\n");
    45.     // ждем подтверждение от сервера
    46.     RECV(buff);
    47.     // сообщаем получателя
    48.     SEND("RCPT TO: ***********@rambler.ru\r\n");
    49.     // ждем подтверждение от сервера
    50.     RECV(buff);
    51.     // подаем команду, что готовы начать передачу письма
    52.     SEND("DATA\r\n");
    53.     // ждем подтверждение от сервера
    54.     RECV(buff);
    55.     // передаем заголовок
    56.     // от кого письмо
    57.     SEND("FROM: ***********@mail.ru\r\n");
    58.     // кому письмо
    59.     SEND("TO: *************@rambler.ru\r\n");
    60.     // тема письма
    61.     SEND("SUBJECT: etrr\r\n");
    62.     // текст письма
    63.     SEND("Content-type: text\r\n");
    64.     SEND("Hi!\nIt is a message for you\n");
    65.     // говорим, что закончили
    66.     SEND("\r\n.\r\n");
    67.     RECV(buff);
    68.     // прощаемся с сервером
    69.     SEND("QUIT\r\n");
    70.     RECV(buff);
    71.     closesocket(sock);
    72.     WSACleanup();
    73.     return 0;
    74. }
    выхлоп
     
  3. eua

    eua New Member

    Публикаций:
    0
    Регистрация:
    25 июл 2010
    Сообщения:
    42
    osox спасибо за внимание но переделать для меня будет сложно.Вот имеится пример на FASM но он не пашит почемуто, мож кто поможет его ожевить
    Код (Text):
    1.   format PE GUI 4.0
    2. entry start
    3.  
    4.   include '%fasminc%\win32a.inc'
    5.  
    6. section '.code' code readable writeable executable
    7.  
    8. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    9. ; Я не буду в подробностях объяснять SMTP-команды, если вы их не знаете смотрите RFC
    10. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    11.  
    12.   smtp_server  db '194.67.23.111',0                 ; IP-адрес smtp.mail.ru
    13.  
    14.   helo_0       db 'HELO 0',13,10                    ; Команда helo
    15.   helo_0_sz    = $ - helo_0                     ;
    16.  
    17.   mail_fr      db 'MAIL FROM: 111@mail.ru',13,10            ; От кого письмо
    18.   mail_fr_sz   = $ - mail_fr                        ;
    19.  
    20.   rcpt_to      db 'RCPT TO: test3456@mail.ru',13,10         ; Кому отправлять
    21.   rcpt_to_sz   = $ - rcpt_to                        ;
    22.  
    23.   data_        db 'DATA',13,10                      ; Команда data
    24.   data_sz      = $ - data_                      ;
    25.  
    26.  
    27. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    28. ; Заголовок и текст письма
    29. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    30.  
    31.   message      db 'From: Bill Gates <111@mail.ru>',13,10,\              ; От кого
    32.           'Subject: Test MESSAGE',13,10,\                   ; Тема
    33.           'To: TEST <test3456@mail.ru>',13,10,\                 ; Кому
    34.           'MIME-Version: 1.0',13,10,\                       ; Версия MIME
    35.           'Content-Type: multipart/mixed;',13,10,\              ; Тип содержимого
    36.           ' boundary="--ct757"',13,10,13,10,\                   ; Разделитель
    37.           '----ct757',13,10,\
    38.           'Content-Type: text/plain; charset=Windows-1251',13,10,\      ; Содержимое: текст,
    39.           'Content-Transfer-Encoding: 8bit',13,10,13,10,\           ; кодировка Win-1251
    40.           'Hello, this is the test message with attachment.',13,10,13,10,\  ; Текст письма
    41.           '----ct757',13,10,\
    42.           'Content-Type: application/octet-stream; name="test.rar"',13,10,\ ; Содержимое: вложение
    43.           'Content-Disposition: attachment; filename="test.rar"',13,10,\    ; имя файла - test.rar
    44.           'Content-Transfer-Encoding: base64',13,10,13,10           ; Поясняем, что закодировано
    45.                                             ; с помощью base64
    46.  
    47.   message_sz   = $ - message                                ; Размер письма вместе с
    48.                                             ; заголовком (без вложения!)
    49.  
    50.  
    51.   file_name    db 'D:\test.rar',0                           ; Файл, который нужно отправить
    52.  
    53.   sock         dd 0                                 ; Дескриптор сокета
    54.   file_h       dd 0                                 ; Дескриптор файла
    55.   map_h        dd 0                                 ; Дескриптор мэппинга
    56.   map_addr     dd 0                                     ; Адрес мэппинга
    57.   al_mem       dd 0                                 ; Адрес памяти в куче
    58.  
    59.   buf_sz       = 100h                                   ; Размер буффера
    60.   buf          rb buf_sz                                ; Буффер для recv
    61.  
    62.   WSA          WSADATA                                  ; Необходимые
    63.   sin          sockaddr_in                              ; структуры
    64.  
    65.  
    66. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    67. ; base64 encoder without dictionary by RT Fishel
    68. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    69. ;
    70. ; ebp = length, esi -> src buffer, edi -> dst buffer
    71.  
    72.   b64:
    73.     .newline:
    74.       call     b64.store_crlf
    75.  
    76.     .encode:
    77.       push     (76 shr 2)+1
    78.       pop      edx
    79.  
    80.     .outer:
    81.       dec      edx
    82.       je       b64.newline
    83.       lodsd
    84.       dec      esi
    85.       inc      ebp
    86.       bswap    eax
    87.       mov      ecx,4
    88.  
    89.     .inner:
    90.       rol      eax,6
    91.       and      al,3Fh
    92.       cmp      al,3Eh
    93.       jb       b64.testchar
    94.       shl      al,2
    95.       sub      al,((3Eh shl 2)+'A'-'+') and 0FFh
    96.  
    97.     .testchar:
    98.       sub      al,4
    99.       cmp      al,'0'
    100.       jnl      b64.store
    101.       add      al,'A'+4
    102.       cmp      al,'Z'
    103.       jbe      b64.store
    104.       add      al,'a'-'Z'-1
    105.  
    106.     .store:
    107.       stosb
    108.       dec      ebp
    109.       loopne   b64.inner
    110.       jne      b64.outer
    111.       mov      al,'='
    112.       rep      stosb
    113.       ret
    114.  
    115.     .store_crlf:
    116.       mov      ax,0A0Dh
    117.       stosw
    118.       ret
    119.  
    120.  
    121. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    122. ; Процедура чтения в буффер из сокета
    123. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    124.  
    125.   read_buf:
    126.       invoke   recv,[sock],buf,buf_sz,esi
    127.       ret
    128.  
    129.  
    130. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    131. ; Начало основной программы
    132. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    133.  
    134.   start:
    135.       xor      esi,esi
    136.  
    137.       invoke   CreateFile,file_name,GENERIC_WRITE or GENERIC_READ,\     ; Откроем нужный
    138.          esi,esi,OPEN_EXISTING,esi,esi                  ; нам файл
    139.       inc      eax                              ; Выходим в
    140.       je       exit                             ; случае ошибки
    141.       dec      eax                              ; Если всё ок,
    142.       mov      [file_h],eax                         ; сохраним его хэндл
    143.  
    144.       invoke   GetFileSize,eax,esi                      ; Узнаем размер файла
    145.       mov      ebx,eax                              ; Сохраним его в ebx
    146.       rol      eax,1                                ; Умножим размер на два
    147.                                         ; (на всякий случай, т.к.
    148.                                         ; размер закодированного
    149.                                         ; в base64 файла всегда больше)
    150.       add      eax,message_sz                           ; Прибавим к получившемуся
    151.                                         ; результату размер уже
    152.                                         ; имеющегося письма
    153.  
    154.       invoke   LocalAlloc,LMEM_FIXED,eax                    ; Выделим место в куче
    155.       test     eax,eax                              ; Если ошибка -
    156.       je       exit                             ; выходим, иначе
    157.       mov      [al_mem],eax                         ; сохраним адрес
    158.  
    159.       mov      edi,eax                              ; Переместим в кучу
    160.       mov      esi,message                          ; подготовленный
    161.       mov      ecx,message_sz                           ; заголовок и текст
    162.       rep      movsb                                ; письма
    163.  
    164.       xor      esi,esi
    165.  
    166.       invoke   CreateFileMapping,[file_h],esi,PAGE_READWRITE,esi,ebx,esi    ; Создадим file mapping
    167.       test     eax,eax                              ; Выходим в
    168.       je       clean_exit3                          ; случае ошибки
    169.       mov      [map_h],eax                          ; Если всё ok, сохраним хэндл
    170.  
    171.       invoke   MapViewOfFile,eax,2,esi,esi,esi                  ; Спроецируем файл в память
    172.       test     eax,eax                              ; Выходим в
    173.       je       clean_exit2                          ; случае ошибки
    174.       mov      [map_addr],eax                           ; Если всё ok,
    175.                                         ; сохраним адрес мэппинга
    176.  
    177.       mov      esi,eax                              ; Укажем, откуда
    178.                                         ; брать данные
    179.       mov      ebp,ebx                              ; Укажем размер данных
    180.       call     b64.encode                           ; Кодируем в base64
    181.  
    182.       mov      ax,0A0Dh                             ; Добавим к
    183.       stosw                                 ; получившемуся
    184.       mov      ax,0A0Dh                             ; письму
    185.       stosw                                 ; CRLF
    186.       mov      al,'.'                               ; .
    187.       stosb                                 ; CRLF
    188.       mov      ax,0A0Dh                             ;
    189.       stosw                                 ;
    190.  
    191.       mov      eax,edi                              ; Вычислим размер
    192.       sub      eax,[al_mem]                         ; получившегося письма,
    193.       mov      ebx,eax                              ; и сохраним его в ebx
    194.  
    195.       xor      esi,esi
    196.  
    197.       invoke   WSAStartup,101h,WSA                      ; Инициализируем winsock
    198.       test     eax,eax                              ; Выходим в
    199.       jne      clean_exit1                          ; случае ошибки
    200.  
    201.       invoke   socket,AF_INET,SOCK_STREAM,0                 ; Создаем сокет
    202.       inc      eax                              ; Выходим
    203.       je       clean_exit                           ; если
    204.       dec      eax                              ; ошибка
    205.       mov      [sock],eax                           ; Если ok - сохраним
    206.                                         ; его дескриптор
    207.  
    208.       push     smtp_server                          ; Преобразуем адрес
    209.       call     [inet_addr]                          ; сервера
    210.  
    211.       mov      [sin.sin_family],AF_INET                     ; Заполним структуру
    212.       mov      [sin.sin_port],1900h                     ; sockaddr_in
    213.       mov      [sin.sin_addr],eax                       ;
    214.  
    215.       invoke   connect,[sock],sin,10h                       ; Коннектимся к серверу
    216.       inc      eax                              ; Если ошибка
    217.       je       shtdown                              ; выходим
    218.  
    219.       call     read_buf                             ; Получим и
    220.       inc      eax                              ; проверим
    221.       je       shtdown                              ; ответ сервера
    222.       cmp      dword [buf],'220 '                       ;
    223.       jne      shtdown                              ;
    224.  
    225.       invoke   send,[sock],helo_0,helo_0_sz,esi                 ; Пошлем приветствие
    226.       inc      eax                              ; Выход,
    227.       je       shtdown                              ; если ошибка
    228.  
    229.       call     read_buf                             ; Проверим ответ сервера
    230.       inc      eax
    231.       je       shtdown
    232.       cmp      dword [buf],'250 '
    233.       jne      shtdown
    234.  
    235.       invoke   send,[sock],mail_fr,mail_fr_sz,esi               ; MAIL FROM
    236.       inc      eax
    237.       je       shtdown
    238.  
    239.       call     read_buf
    240.       inc      eax
    241.       je       shtdown
    242.       cmp      dword [buf],'250 '
    243.       jne      shtdown
    244.  
    245.       invoke   send,[sock],rcpt_to,rcpt_to_sz,esi               ; RCPT TO
    246.       inc      eax
    247.       je       shtdown
    248.  
    249.       call     read_buf
    250.       inc      eax
    251.       je       shtdown
    252.       cmp      dword [buf],'250 '
    253.       jne      shtdown
    254.  
    255.       invoke   send,[sock],data_,data_sz,esi                    ; DATA
    256.       inc      eax
    257.       je       shtdown
    258.  
    259.       call     read_buf
    260.       inc      eax
    261.       je       shtdown
    262.       cmp      dword [buf],'354 '
    263.       jne      shtdown
    264.  
    265.       invoke   send,[sock],[al_mem],ebx,esi                 ; Посылаем письмо
    266.       inc      eax
    267.       je       shtdown
    268.  
    269.       call     read_buf
    270.  
    271.   shtdown:
    272.       invoke   shutdown,[sock],esi                      ; Разрываем соединение
    273.       invoke   closesocket,[sock]                       ; и закрываем сокет
    274.  
    275.   clean_exit:
    276.       invoke   WSACleanup
    277.  
    278.   clean_exit1:
    279.       invoke   UnmapViewOfFile,[map_addr]                   ; Выгрузим файл из памяти
    280.  
    281.   clean_exit2:
    282.       invoke   CloseHandle,[map_h]                      ; Закроем хэндл мэппинга
    283.  
    284.   clean_exit3:
    285.       invoke   LocalFree,[al_mem]                       ; Освободим память в куче
    286.       invoke   CloseHandle,[file_h]                     ; Закроем файл
    287.  
    288.   exit:
    289.       invoke   ExitProcess,esi                          ; Выходим из программы
    290.  
    291.  
    292. data import                                 ; Import table
    293.  
    294.   library kernel32,'KERNEL32.DLL',\
    295.       wsock32,'WSOCK32.DLL'
    296.  
    297.   include '%fasminc%\APIA\kernel32.inc'
    298.   include '%fasminc%\APIA\wsock32.inc'
    299.  
    300. end data
     
  4. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    а вы уверены? С остальным сомнительно (так мельком просмотрел), но вроде все в порядке.
     
  5. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    он у вас после команды DATA будет требовать регистрацию поэтому подконнектились поздоровались потом
    send - AUTH LOGIN
    recv - 334 VXNlcm5hbWU6
    send - **************
    recv - 334 UGFzc3dvcmQ6
    send - ********************
    recv - 235 Authentication succeeded
    а потом только все остальные запросы
     
  6. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    да и 194.67.23.111 у вас не валидный
     
  7. eua

    eua New Member

    Публикаций:
    0
    Регистрация:
    25 июл 2010
    Сообщения:
    42
    да IP для smtp.bk.ru 94.100.177.2 для smtp.mail.ru 94.100.177.1
    поменял IP теперь хоть конектится.Cпасибо что подсказали.
     
  8. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.561
    Адрес:
    Russia
    неужели вызов gethostbyaddr так накладен, что пришлось захардкорить IP ?
     
  9. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    701
    термосинтез +1
    всё это хз когда было расписано в стотиях и разжевано .. к примеру мну красивым =)
     
  10. eua

    eua New Member

    Публикаций:
    0
    Регистрация:
    25 июл 2010
    Сообщения:
    42
    slon мож даш сылку где это разжовано чтоб код на fasm и работало?
     
  11. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    ключ от квартиры где деньги лежат?
     
  12. eua

    eua New Member

    Публикаций:
    0
    Регистрация:
    25 июл 2010
    Сообщения:
    42
    да нафиг мне от квартиры...я и без ключа могу...
     
  13. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    701
    когда разжовывал писал ещё на тасме гугль в помощь по моему нику де-то та всплывет
     
  14. eua

    eua New Member

    Публикаций:
    0
    Регистрация:
    25 июл 2010
    Сообщения:
    42
    опять возникла проблема,как закодить pass и login с помощъю base64.
     
  15. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    используя кодирование base64!
    в сорце из #3 это даже есть.
     
  16. eua

    eua New Member

    Публикаций:
    0
    Регистрация:
    25 июл 2010
    Сообщения:
    42
    С отправкой на smtp.mail.ru всё ясно,а ктонибудь знает как отправить смс на мобилу с компа.Какой там протокол ?
     
  17. DoctorWho

    DoctorWho New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2010
    Сообщения:
    87
    eua
    Отправляются через сервера операторов связи. Опять же гугл.

    http://www.myfreeware.narod.ru/products/CMD2SMS.htm например