Железные цепи победы Николай "GorluM" Андреев Хакер, номер #070, стр. 070-122-2 На наше трогательное приветствие вежливый сокс должен ответить двумя байтами: номером своей версии и выбранным из посланной нами последовательности методом. Если соксу не понравился ни один из предложенных нашим клиентом способов аутентификации, то байт метода будет равен 0xFF и дальнейшая работа с сервером будет невозможна, если же он будет равняться 0x00, то мы получим право перейти к следующему этапу большого пути. На этом шаге нам надо сообщить сокс-серверу, с кем ему соединяться и как. Для этого клиенту нужно послать пакет со следующим содержанием: 1 байт – опять номер версии; 1 байт – команда; 1 байт – еще не придумали, зачем; 1 байт – тип адреса, который будет идти следом; N байт – адрес; 2 байта – порт; Байт «команда» может принимать значения: 0x01 – если мы желаем просто соединиться, 0x02 – команда BIND, 0x03 – UDP ASSOCIATE (ведь 5 версия протокола умеет работать по UDP). Следующий байт резервирован до лучших времен и должен быть всегда равен нулю. Типом адреса мы должны будем сообщить соксу, в каком виде мы даем ему адрес пункта назначения, байт может принимать значения: 0x01 - ip v4 адрес, заданный четырьмя байтами; 0x03 – нерезолвленное имя хоста, т.е. просто строка (соксы не всегда умеют резолвить домены, учитывай это); 0x04 – ip v6 адрес, редкий случай. На такой пакет сокс должен послать в ответ пакет той же структуры, но с другими значениями. Например, если в ответе второй байт, который в запросе был «команда», будет не равен нулю, то это значит, что в ходе коннекта возникла какая-то ошибка и клиенту надо разорвать соединение. Тип адреса и сам адрес могут тоже поменяться, это хорошо заметно, если в запросе был послан нерезолвленный хост, потому что вернется его ip’шник. Если же все прошло нормально и соединение успешно создано, то socks-прокси переходит в прозрачный режим и начинает передавать ВСЕ данные по адресу, указанному в запросе. Данные по цепочке Вся прелесть описанного выше socks-протокола заключается в том, что мы без проблем можем выстроить из прокси цепочку, через которую будем работать с каким-нибудь удаленным сервером. Делается это элементарно! Ты, наверное, и сам догадался, как. Пройдя аутентификацию, первый этап, мы должны подсунуть вместо адреса сервера, к которому коннектимся, адрес следующего socks-прокси! Получив ответ сервера, что с проксей мы соединились успешно и что сервер начал передавать ВСЕ данные, мы посылаем очередное приветствие и проходим аутентификацию уже со следующим socks-сервером. Затем наступает пора послать адрес, и мы можем снова подсунуть адрес какого-нибудь сокса! И так пока не надоест или пока какой-нибудь сервер нас не пошлет. В конце цепочки мы укажем, куда все-таки должны идти наши данные, и закруглимся в плане составления цепи проксей. Цепочка вживую Для наглядности программу, реализующую соединение с сервером через цепочку проксей, я сделал консольной, поэтому не пугайся, если увидешь printf или подобные функции (нда, заставить Горла сделать нормальный фейс я так и не смог :) - прим.Dr.). |