e58a10c8bf1d730d6d84edf7a114794e Winsock и C++. Часть |||. smtp монстр.

В предыдущем посте мы уже познакомились с структурой протокола smtp. И поняли, что то, чего нам не хватает для его реализации – это реализация алгоритма base64. Хотя лично мне до сих пор непонятно зачем кодировать  в то, что обратно можно восстановить в два счета? Похоже, эти “загибоны” для того, чтобы отпугивать кодеров. Больше объяснения я найти не могу. Но что-то я увлекся лирикой, приступим.

Монстр:

Первым делом, мы найдем реализацию алгоритма base64, точнее алгоритма кодирования в него. Можно спросить у всемогущего гугля и он вам выплюнет кучу ссылок.

Вторым же этапом мы, как водится скопируем функцию GetIpByHostName – ибо она нам позарез нужна. Ну зачем же себе жизнь усложнять?

Третьим делом мы сделаем функцию для облегчения себе жизни, и назовем ее SendCommand. Что она будет делать? Просто слать в сокет то, что ей передали с одним но. В конце она всегда будет добавлять перевод каретки-возврат строки (\r\n). Ну и плюшку в придачу: она будет получать сообщения пока не получит сообщение с кодом 354(Код подсказки ввода сообщения). Это будет у нас “типо” ЕррорЛога.

Четвертым этапом написания нашей программы будет полный баян: сначала запустим винсокет (WSAStartup(…)), и будем слать сообщения. Больше ничего сказать по этому поводу немогу. Смотрим в код, господа, смотрим в код.

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include
#include

#pragma comment(lib, "ws2_32.lib")

#define host "localhost"
#define port 25
#define clit "TESTCLIENT"
#define user "user"
#define pass "user"
#define from "user@mail.ru"
#define to "admin@mail.ru"
#define theme "This is theme"
#define mail "This is mail. You read this mail? I'am Ok?"

SOCKET s;
char debug[8192];
bool stopdebug = false;

BOOL GetIpByHostName(PCHAR pHostName, PCHAR pIp, DWORD dwIpSize){
hostent *pHosten;
if(!(pHosten = gethostbyname(pHostName))){
return 0;
}
if((unsigned int)lstrlen(inet_ntoa(*(in_addr*)*pHosten->h_addr_list)) > dwIpSize){
return 0;
}
lstrcpy(pIp, inet_ntoa(*(in_addr*)*pHosten->h_addr_list));
return 1;
}

to_uchar(char ch){
return ch;
}

void base64_encode(char *in, int inlen, char *out, int outlen){
static const char b64str[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
while(inlen && outlen){
*out++ = b64str[to_uchar (in[0]) >> 2];
if (!--outlen)
break;
*out++ = b64str[((to_uchar (in[0]) 4) + (--inlen ? to_uchar (in[1]) >> 4 : 0)) & 0x3f];
if(!--outlen)
break;
*out++ = (inlen ? b64str[((to_uchar (in[1]) 2) + (--inlen ? to_uchar (in[2]) >> 6 : 0)) & 0x3f] : '=');
if(!--outlen)
break;
*out++ = inlen ? b64str[to_uchar (in[2]) & 0x3f] : '=';
if(!--outlen)
break;
if(inlen)
inlen--;
if(inlen)
in += 3;
}
if(outlen)
*out = '\0';
}

void SendCommand(char *cmd){
char command[1024];memset(command,'\0',1024);
sprintf(command,"%s\r\n",cmd);

send(s,command,strlen(command),0);

if(!stopdebug){
memset(command,'\0',1024);

recv(s,command,sizeof(command),0);

strcat(debug,command);

if(command[0]=='3'&&command[1]=='5'&&command[2]=='4')
stopdebug = true;
}

Sleep(150);
}

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WSAData wsaData;
sockaddr_in ssin;
char user64[256],pass64[256];
base64_encode(user,strlen(user),user64,256);
base64_encode(pass,strlen(pass),pass64,256);
char cIp[17];
memset((char *)&ssin,0,sizeof(ssin));
memset(cIp,'\0',17);
WSAStartup(MAKEWORD(2,2),&wsaData);
GetIpByHostName(host,cIp,17);
s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
ssin.sin_family = AF_INET;
ssin.sin_port = htons(port);
ssin.sin_addr.s_addr = inet_addr(cIp);
connect(s,(SOCKADDR *)&ssin,sizeof(ssin));

char g[1024];memset(g,'\0',1024);
sprintf(g,"HELO %s",clit);
SendCommand(g);

SendCommand("AUTH LOGIN");
SendCommand(user64);
SendCommand(pass64);

memset(g,'\0',1024);
sprintf(g,"MAIL FROM:",from);
SendCommand(g);

memset(g,'\0',1024);
sprintf(g,"RCPT TO:",to);
SendCommand(g);

SendCommand("DATA");

memset(g,'\0',1024);
sprintf(g,"From: %s",from);
SendCommand(g);

memset(g,'\0',1024);
sprintf(g,"To: %s",to);
SendCommand(g);

memset(g,'\0',1024);
sprintf(g,"Reply-To: %s",from);
SendCommand(g);

memset(g,'\0',1024);
sprintf(g,"Subject: %s",theme);
SendCommand(g);

SendCommand("\r\n");

SendCommand(mail);

SendCommand("\r\n.");

SendCommand("QUIT");

closesocket(s);

WSACleanup();

MessageBox(0,debug,"DEBUG",0);

return 0;
}

Первым делом обратите, что за defin’ы. Я так вынес настройки программы, ибо с гуем все это будет выглядеть еще страшнее, а так еще смотреть можно.

Итак, внимание на функцию WinMain. Все шаблонно: объявляем, запускаем, стоп! Вот функция кодирования в баз. Параметры у нее такие: Текст для хеширования, размер текста, переменная для возврата, размер переменной для возврата. Вроде ничего интересного в ней нет. Все просто. Стандартно проходимся по параметрам структуры ssin и подключаемся к серверу. Дальше целиком и полностью юзаем свою свеженаписанную функцию SendCommand. Протокол smtp я как мог объяснил в предыдущей статье, а тут все по шаблону: зануляем переменную, копируем туда строчку с некоторым изменением определенного параметра, и все это отправляется. Завершается функция WInMain закрытием сокета и “обнулением” винсока.

В функции SendCommand нет чего-то “сверхъестественного”. Единственное, на что следует обратить внимание, так это на Sleep. Действительно, странно, что нужно делать задержку, но из экспериментов я сделал именно такой вывод. Итак, я поскорее постараюсь выложить класс CMailSend для того, кто даже если ничего не понял, то все таки мог реализовать передачу e-mail.

tt twitter big4 Winsock и C++. Часть |||. smtp монстр. tt digg big4 Winsock и C++. Часть |||. smtp монстр. tt facebook big4 Winsock и C++. Часть |||. smtp монстр. tt gmail big4 Winsock и C++. Часть |||. smtp монстр. tt myspace big4 Winsock и C++. Часть |||. smtp монстр. tt reddit big4 Winsock и C++. Часть |||. smtp монстр.

Комментарии (2) на “Winsock и C++. Часть |||. smtp монстр.”

  • Безумный Программист:

    А где отступы? И кошернее, конечно, пользоваться cURL++.

    Ответить
  • Panterr63:

    Разумеется, я с вами согласен, про то, что cURL использовать очень хорошо. Но, когда просто нельзя таскать с собой DLL либо это излишне для маленькой программы, то в этом есть необходимость. А с отступами, это моя оплошность.

    Ответить

Оставить комментарий

CAPTCHA изображение
Обновить изображение
*

RSS-подписка NIG Twitter-подписка NIG

Метки
Друзья
Блог линуксоида Программы для диагностики компьютера
Супер Pixel
Убивалка флешаБэкконект шелл. Часть вторая.Бэкконект шелл. Начало.НАМ для деления чиселПростая арифметикаПередача файлов. Часть третья. Клиент.Dll injectionСканер портовКодировка текста в BMPРухнул на два дняПередача файлов. Часть вторая. Сервер.Поворот и BMPCRC32 суммаBMP форматфайловые вирусыассемблер, строкиАссемблер и матрицапримеры ассемблерМногопоточное программированиеАрхитектура клиент — серверРаздача ICQПишем шуткупишем паукаПривет от ДжеймсаОбход firewallЗагрузка картинок на Gyazo, прямо из ThunarКейлоггер 3Плюшки в контекстном меню Thunarc по сетиКейлоггер 2КейлоггерСкачать Ассемблер!VirusCheckerОтморозки мешают жить ?! Не проблемма !Cкрипты для взлома аккаунтов QIPWinAPI. Работа с файлами. Часть третья. ЧтениеDlink exploitБрут сайта etxt.ruКрасивая раскладка клавиатуры в GnomeМои безделушки на PerlКак запускать Perl скрипты под WindowsБрутфорс партнёрки ZipCoinПарсер upwap.ruИзменения в блогеЧудо ЗаливалкаСкрипт для загрузки файлов на Zalil.ruЯндекс «чоткий» поисковик!WinAPI. Работа с файлами. Часть вторая. ЗаписьWinAPI. Работа с файлами. Часть первая. ПоискПолучение MD5 хеша средствами C++Что нам стоить letitfile.com забрутить?WarCraft III запуск под LinuxЭнтропия файлаWinsock и C++. Мини прокси. Часть |\\/. Завершающая.Перепилил чекер для 4gameЧекер акаунтов YoupornCMailSend v 1.1. Отправка почы без проблемСлучайные числаWinsock и C++. Часть |||. smtp монстр.Брутфорс LetitFile.comИспользование X-Forwarded-For, для обмана веб-сервера, подмена IP подручными средствамиДело было вечером, делать было нечего…Мысли о аудио сервереПарсер ников из твиттераКонец школоло…Perl+Linux. Заметка первая (Удобный Paste bin).Бэкконект шелл.E-MAIL + winsocket + Cpp. Сложно?winsock и C++. Часть ||. Атака клоунов.C++ резолвинг адресаPerl, анализ HTML кода и определение CMSМатематика в C++winsock и C++