Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
1 / 1 / 2
Регистрация: 02.05.2013
Сообщений: 31
1

Соединение через SOCKS4

02.10.2013, 20:37. Просмотров 1950. Ответов 5
Метки нет (Все метки)


Доброго времени суток!

Помогите разобраться с соединением к хосту через SOCKS4, а именно с структурой отправляемых данных.

field 1: SOCKS version number, 1 byte, must be 0x04 for this version
field 2: command code, 1 byte:
0x01 = establish a TCP/IP stream connection
0x02 = establish a TCP/IP port binding
field 3: network byte order port number, 2 bytes
field 4: network byte order IP address, 4 bytes
field 5: the user ID string, variable length, terminated with a null (0x00)
Что следует заполнять в UserID? И возможно ли законнектить по UDP через Socks4?

Использую сокеты из Boost 1.54.0, погуглив набросал\накопипастил такой код:
ZSocks.cpp

C++
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
#include "ZSocks.h"
 
ZSocket::ZSocket(string parIp, int parPort, string parDestIp, int parDestPort, char parData[]){
    this->socket_ip = parIp.c_str();
    this->socket_port = parPort;
    this->dst_ip = parDestIp.c_str();
    this->dst_port = parDestPort;
    this->packetData = parData;
 
    if(this->Connect()){
        this->IsConnected = true;
    } else {
        printf("can't connect !\n");
        this->IsConnected = false;
    }
}
 
bool ZSocket::Connect(){
    struct hostent *Ip = gethostbyname(this->socket_ip);
    if(Ip == NULL) 
        return false;
 
    sockaddr_in sa;
    sa.sin_family = AF_INET;
    sa.sin_port = htons(this->socket_port);
    sa.sin_addr.s_addr = inet_addr(inet_ntoa(*((struct in_addr *)Ip->h_addr)));
 
    char pack[12];
    pack[0] = 0x04;
    pack[1] = 0x03;
    pack[2] = this->dst_port/256;
    pack[3] = this->socket_port%256;
 
    Ip = gethostbyname(this->dst_ip);
    if(Ip == NULL) 
        return false;
 
    char ip[16];
    strcpy(ip, inet_ntoa(*((struct in_addr *)Ip->h_addr)));
    char *p = ip;
    int i, j = strlen(ip), k=4;
    for(i = 0; i<j; i++){
        if(ip[i] == '.')
        {
            ip[i] = 0;
            pack[k] = atoi(p);
            k++;
            p = ip+i+1;
        }
    }
     
    //pack[k] = atoi(p);
 
    pack[8] = rand()%255;
    pack[9] = rand()%255;
    pack[10] = rand()%255;
    pack[11] = 0x00;
 
    SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if(s == SOCKET_ERROR)
        return false;
 
    if(connect(s, (SOCKADDR *)&sa, sizeof(sa)) == SOCKET_ERROR)
        return false;
 
    if(send(s, pack, sizeof(pack), 0) == SOCKET_ERROR)
        return false;
 
    i = recv(s, pack, 4, 0);
    if(i == 0 || i == SOCKET_ERROR)
        return false;
 
    if(pack[1] == 0x5a) {
        this->zSock = &s;
    }
 
    return false;
}
 
bool ZSocket::Send(){
    if (this->IsConnected){
        if (send(*this->zSock, this->packetData, sizeof(this->packetData), 0) != SOCKET_ERROR){
            return true;
        } else {
            return false;
        }
    } else {
        return false;
    }
}
ZSock.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <boost\asio.hpp>
using namespace std;
 
#pragma once
 
class ZSocket {
public:
    ZSocket(string parIp, int parPort, string parDestIp, int parDestPort, char parData[]);
    bool Send();
 
    bool IsConnected;
 
    const char* socket_ip;
    int         socket_port;
    const char* dst_ip;
    int         dst_port;
 
    const char* packetData;
private:
    bool Connect();
    SOCKET* zSock;
};
main
C++
1
2
3
4
5
ZSocket s = ZSocket("78.25.77.206", 1080, "s.zontwelg.com", 27019, dt);
printf("> Connecting ...\n");
while(s.IsConnected){
    s.Send();
}


Данный код возвращает ошибку (-1) при получении данных от прокси на строке:
C++
1
2
3
    i = recv(s, pack, 4, 0);
    if(i == 0 || i == SOCKET_ERROR)
        return false;
Сказу говорю с цпп дела имею мало, пишу в основном на шарпе, так-что код может быть полным трешем.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.10.2013, 20:37
Ответы с готовыми решениями:

HttpWebRequest через прокси socks4
Здравствуйте, подскажите какое-нибудь стороннее решение, чтобы отправлять запросы HttpWebRequest...

Соединение с БД (соединение через сеть)
Доброго времени суток. Помогите пожалуйста новичку. Создал в Visual Studio Net 2010 C++ проект с...

Создать соединение через TcpClient через прокси
Нужно создать соединение через TcpClient, но не простое, а чтобы оно шло через прокси. к примеру у...

Socks4 и WebBrowser
Как поставить Socks4 прокси для элемента WebBrowser? Знаю как поставить Http, а как Socks4 не где...

5
10 / 10 / 6
Регистрация: 24.05.2013
Сообщений: 349
07.03.2015, 22:11 2
socks4 не поддерживает udp
используй socks5
0
1 / 1 / 2
Регистрация: 02.05.2013
Сообщений: 31
07.03.2015, 22:21  [ТС] 3
Цитата Сообщение от drunkwolfs Посмотреть сообщение
socks4 не поддерживает udp
используй socks5
Коли подняли старую тему, отпишусь, ибо вопрос еще актуален. Нашел стандарт RFC1928 по SOCKS5, пытался напаять код для коннетка, но видимо что-то до конца не понял. Сейчас правда писал на шарпе, но коли тема в разделе плюсов, обойдусь ссылкой на пастбин.
А если говорить без приязки к языку то проблема следующая:
https://i.gyazo.com/c9f20b421f... 8a57bd.png

Кратко, делаю следующее:
  • Коннечусь TCPшкой к проки.
  • Отправляю UDP ASSOCIATE на прокси.
  • Беру порт из последнего ответа (на UDP ASSOCIATE) и коннекучь к нему по UDP сокету.

И все не пойму, что я делаю не так, терзает сомнение что я не правильно понял спецификацию по соксам5.
0
10 / 10 / 6
Регистрация: 24.05.2013
Сообщений: 349
08.03.2015, 09:13 4
Я сам щас изучаю socks5.
Попробуй поискать примеры программ. Чем больше тем лучше. Например на этом форуме.
Вот еще годный гайд https://xakep.ru/2003/10/02/19989/ завтра буду по нему изучать.

:75
C#
1
byte[] auth_req = { 0x05, 0x01, 0x00 };
"RFC 1928 — Протокол SOCKS 5
X'00' аутентификация не требуется
X'01' GSSAPI
..."

В каком месте у тебя проблема? По tcpdum'у плохо ориентируюсь.
Но я бы для начала использовал код без аутентификации.

Добавлено через 7 минут
Зачем конектится к порты с которого пришел ответ?
Пробовал к тому же порту конектится на котором socks5?
Вроде исходящий порт от сервера всегда рандомный и сервер не слушает тот порт с которого он отправляет пакеты, а слушает он только один порт.
Но это только догадка.
0
1 / 1 / 2
Регистрация: 02.05.2013
Сообщений: 31
08.03.2015, 10:54  [ТС] 5
Цитата Сообщение от drunkwolfs Посмотреть сообщение
"RFC 1928 — Протокол SOCKS 5
X'00' аутентификация не требуется
X'01' GSSAPI
..."
Авторизация у меня проходит, здесь все правильно я передаю количество методов аутентификации 0x01 и сам метод 0x00 (без авторизации), ибо сервера которые я ищу ее не требуют. Авторизация идет, сервер выдает мне порт на котором он должен слушать UDP коннекты, если я правильно все понимаю. Во всяком случае, проблема не в авторизации, а где-то после.

Цитата Сообщение от drunkwolfs Посмотреть сообщение
Пробовал к тому же порту конектится на котором socks5?
По UDP? Пробывал, та-же история идет с пакетами.

Цитата Сообщение от drunkwolfs Посмотреть сообщение
Вот еще годный гайд https://xakep.ru/2003/10/02/19989/ завтра буду по нему изучать.
Немного не тот гайд, он описывает TCP соединение, мне нужно прогонять UDP пакеты через прокси.
0
10 / 10 / 6
Регистрация: 24.05.2013
Сообщений: 349
08.03.2015, 19:31 6
Если разберешься то напиши ответ тут, мне скоро тоже UDP проксировать придется.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.03.2015, 19:31

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Indy Socks4\Socks5
Не могу найти рабочий способ работы через соксы на инди, пытаюсь сделать так: ...

socks4/5 прокси на java
Хочу написать простейший socks прокси, но не знаю с чего начать. Думаю, было бы неплохо почитать...

Браузер и поддержка socks4/5
Здрасте . Как сделать свой мини браузер с поддержкой прокси типа socks4/5 ? Думал как-то через...

Socks4 работа с локальной сетью
Доброго времени суток!! Решил разработать локальный прокси сервер, для просмотра и контроля...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.