Что такое прокси?

Надеюсь, не нужно объяснять, что прокси-сервер — это сервер, который отправляет через себя запросы на веб (либо другой) сервер.
Для тех кто в танке, схематически:
e51513232ec14c3d5f07eb09c68249a9 Winsock и C++. Мини прокси. Часть |\/. Завершающая.
Казалось бы, дело простое, но давайте рассмотрим это поподробнее.

Алгоритм нашего мини прокси

  1. Поднять сервер
  2. Ждать пока подключится клиент
  3. Как только клиент подключится к серверу, то
  4. Прочитать запрос от подключившегося клиента
  5. Определить по запросу сервер
  6. Создать клиента и через него послать запрос на конечный сервер
  7. Как только клиент (созданный сервером) получит данные от запрашиваемого сервера
  8. Отправить эти данные первоначальному клиенту

Это звучит страшнее, чем это выглядит… Странновато, но ничего. Это почти всегда так бывает. Гы. Вот, собсно, сорец…

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
#include

#include

#pragma comment(lib, "ws2_32.lib")//Это знакомо, надеюсь

#define BrouzerDataSize 64000 //Размер принимаемого буфера (от первого клиента)

#define ReturnBufferSize 1024 //Размер буфера для возврата

#define ProxyPort 95 //Порт прокси

#define HostMaxSize 256 // Максимальный размер хоста

#define RequestLog "C:\\in.txt" // Файл лога запросов

#define AnswersLog "C:\\out.txt" //Файл лога ответов

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;
}

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow){
char cBrouzerData[BrouzerDataSize];
char ReturnBuffer[ReturnBufferSize];

WSADATA wsa;//Известно
WSAStartup(MAKEWORD(2,2),&wsa);

SOCKET server,one_client;//Один сокет для сервера, а другой для клиента (который будет подключаться к нам)
int from_len = 0;
struct sockaddr_in server_ssin,one_client_from_ssin;//Один для сервера, другой для клиента

server = socket(AF_INET,SOCK_STREAM,0);

memset((char *)&server_ssin,'\0',sizeof(server_ssin));

server_ssin.sin_family = AF_INET;
server_ssin.sin_addr.s_addr = INADDR_ANY;//Подключаться с любого ИП
server_ssin.sin_port = htons(ProxyPort);

bind(server,(struct sockaddr *)&server_ssin, sizeof(server_ssin));//Биндимся на порт

listen(server,SOMAXCONN);//Листим. Максимум соединений

while(1){
memset(cBrouzerData,'\0',BrouzerDataSize);
from_len = sizeof(one_client_from_ssin);
one_client = accept(server,(struct sockaddr *)&one_client_from_ssin,&from_len);//Берем клиента за жабры

if(recv(one_client,cBrouzerData,BrouzerDataSize,0)>0){//И читаем от него данные
FILE *fIn = fopen(RequestLog,"a");//Пишем в лог
fputs(cBrouzerData,fIn);
fclose(fIn);

char host[HostMaxSize];

int j=0;
bool f = false;

for(int i = 0;i if(f){
host[j++] = cBrouzerData[i];
}
if(cBrouzerData[i]==' '&&cBrouzerData[i-1]==':'&&cBrouzerData[i-2]=='t'&&cBrouzerData[i-3]=='s'&&cBrouzerData[i-4]=='o'&&cBrouzerData[i-5]=='H'){
f = true;
}
if(f&&cBrouzerData[i]=='\r')
f = false;
}//END for
host[j-1]='\0';

//А дальше все знакомо - создаем клиента, шлем запрос

char cIp[17];
memset(cIp,'\0',17);
GetIpByHostName(host,cIp,17);

SOCKET HttpClient;
HttpClient = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
sockaddr_in HttpClient_ssin;
HttpClient_ssin.sin_family = AF_INET;
HttpClient_ssin.sin_port = htons(80);
HttpClient_ssin.sin_addr.s_addr = inet_addr(cIp);
connect(HttpClient,(SOCKADDR *)&HttpClient_ssin,sizeof(HttpClient_ssin));

send(HttpClient,(PCHAR)cBrouzerData,strlen(cBrouzerData),0);
memset(ReturnBuffer,'\0',ReturnBufferSize);

FILE *fOut = fopen(AnswersLog,"a");

while(recv(HttpClient,ReturnBuffer,ReturnBufferSize,0)>0){//И последовательно читаем оттуда - пишем туда (и параллельно в лог)
send(one_client,ReturnBuffer,ReturnBufferSize,0);
fputs(ReturnBuffer,fOut);
memset(ReturnBuffer,'\0',ReturnBufferSize);
}//END while
//И дальше терминатимся по полной
fclose(fOut);

closesocket(HttpClient);

}//END if(recv

closesocket(one_client);

}//END while(1)

closesocket(server);

WSACleanup();

return 0;
}

Таким методом можно сделать довольно таки простой прокси — сервер. Для чего? Ну например для того, чтобы узнать, что ваш браузер шлет сайту, или что сайт шлет браузеру. Таким образом, вы можете приоткрыть кулисы протокола HTTP, и узнать много интересного. Что-то вроде подзорной трубы…

tt twitter big4 Winsock и C++. Мини прокси. Часть |\/. Завершающая. tt digg big4 Winsock и C++. Мини прокси. Часть |\/. Завершающая. tt facebook big4 Winsock и C++. Мини прокси. Часть |\/. Завершающая. tt gmail big4 Winsock и C++. Мини прокси. Часть |\/. Завершающая. tt myspace big4 Winsock и C++. Мини прокси. Часть |\/. Завершающая. tt reddit big4 Winsock и C++. Мини прокси. Часть |\/. Завершающая.

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

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++