C # нужна помощь в отладке socks5-попытки подключения - PullRequest
0 голосов
/ 02 апреля 2010

Я написал следующий код для (успешного) подключения к прокси-серверу socks5.

Я отправляю пользователя / pw auth и получаю ответ OK (0x00), но как только я сообщаю прокси-серверу подключиться к какому-либо ip: порту, он дает мне 0x01 (общая ошибка).

Socket socket5_proxy = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint proxyEndPoint = new IPEndPoint(IPAddress.Parse("111.111.111.111"), 1080); // proxy ip, port. fake for posting purposes.
socket5_proxy.Connect(proxyEndPoint);
byte[] init_socks_command = new byte[4];
init_socks_command[0] = 0x05;
init_socks_command[1] = 0x02;
init_socks_command[2] = 0x00;
init_socks_command[3] = 0x02;
socket5_proxy.Send(init_socks_command);
byte[] socket_response = new byte[2];
int bytes_recieved = socket5_proxy.Receive(socket_response, 2, SocketFlags.None);

if (socket_response[1] == 0x02)
{
    byte[] temp_bytes;
    string socks5_user = "foo";
    string socks5_pass = "bar";
    byte[] auth_socks_command = new byte[3 + socks5_user.Length + socks5_pass.Length];
    auth_socks_command[0] = 0x05;
    auth_socks_command[1] = Convert.ToByte(socks5_user.Length);
    temp_bytes = Encoding.Default.GetBytes(socks5_user);
    temp_bytes.CopyTo(auth_socks_command, 2);
    auth_socks_command[2 + socks5_user.Length] = Convert.ToByte(socks5_pass.Length);
    temp_bytes = Encoding.Default.GetBytes(socks5_pass);
    temp_bytes.CopyTo(auth_socks_command, 3 + socks5_user.Length);
    socket5_proxy.Send(auth_socks_command);
    socket5_proxy.Receive(socket_response, 2, SocketFlags.None);
    if (socket_response[1] != 0x00)
        return;
    byte[] connect_socks_command = new byte[10];
    connect_socks_command[0] = 0x05;
    connect_socks_command[1] = 0x01; // streaming
    connect_socks_command[2] = 0x00;
    connect_socks_command[3] = 0x01; // ipv4
    temp_bytes = IPAddress.Parse("222.222.222.222").GetAddressBytes(); // target connection. fake ip, obviously
    temp_bytes.CopyTo(connect_socks_command, 4);
    byte[] portBytes = BitConverter.GetBytes(3333);
    connect_socks_command[8] = portBytes[0];
    connect_socks_command[9] = portBytes[1];
    socket5_proxy.Send(connect_socks_command);
    socket5_proxy.Receive(socket_response);
    if (socket_response[1] != 0x00)
        MessageBox.Show("Damn it"); // I always end here, 0x01

Я использовал это как ссылку: http://en.wikipedia.org/wiki/SOCKS#SOCKS_5

Я что-то здесь совершенно не понял? Как я вижу, я могу подключиться к socks5 нормально. Я могу подтвердить подлинность в порядке. Но я / прокси не могу ничего сделать?

  1. Да, я знаю, что прокси работает.
  2. Да, целевой ip доступен, и да целевой порт открыт / реагирует.
  3. Я получаю 0x01 независимо от того, к чему я пытаюсь подключиться.

ОЧЕНЬ признательна за любую помощь!

Спасибо

  • Chuck

1 Ответ

0 голосов
/ 02 апреля 2010

Вы можете быть укушены порядком байтов. Например, BitConverter.GetBytes возвращает вам правильные байты? Вы прошли через это и проверили, содержат ли ваши байтовые массивы то, что вы ожидаете от них?

Это похоже на little-endian, а в сетевых вещах обычно используется big-endian. BitConverter всегда использует системный порядок байтов, поэтому вам придется ревертировать байты вручную, если вы работаете в системе с прямым порядком байтов (что вы, похоже, делаете). BitConverter.IsLittleEndian скажет вам, является ли ваша система прямым порядком байтов или нет.

Кроме того, было бы неплохо сократить ваше значение, например BigConverter.GetBytes((short)3333). Таким образом, вы получите только два байта, которые вам нужны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...