Железные цепи победы Николай "GorluM" Андреев Хакер, номер #070, стр. 070-122-4 Закончив цикл, функция возвращает 0, что означает успешное завершение. Теперь через сокет, передаваемый ей в параметре, можно работать. Это означает, что мы успешно соединились по цепочке SOCKS5-проксей! SocksChain Наша программа отличается от всем известного аналога двумя вещами: интерфейсом, который на хрен никому не сдался, и возможностью самому работать сервером. Ведь вся прелесть sockschain’а была в том, что можно было заставить работать через него любое приложение, которое поддерживает протокол SOCKS. А наша программа позволяет работать через цепочку только себе! Печально, но легко поправимо. В номере Х за июнь 2003 года я описывал, как своими руками сделать SOCKS4-сервер. Так что же мешает нам объединить код сервера и нашей программки, получив в итоге полноценный SocksChain, способный работать с любым приложением, которое поддерживает протокол? Причем объединить код очень легко. Нужно всего лишь добавить в сервер возможность работать с версией 5 и заменить в одном месте функцию connect на нашу универсальную. Разве не прелесть? :). Вскрытие показало Я думаю, если ты будешь развивать эту тему, то у тебя получится значительно лучше, чем у меня или у автора программы SocksChain. Если начинать апгрейдить мой сорец, то советую в первую очередь добавить поддержку старой версии протокола, затем поддержку разных видов аутентификации, к примеру, по логину-паролю (описание которой ты можешь вычитать в RFC1929). В общем, у тебя огромный простор для действий, основу ты получил. Теперь никакой, даже очень зубастый федеральный орган к тебе придраться не сможет – ты же за семью проксями :). RFCs Невероятно полезно будет почитать оригинальные RFC протоколов. В них детально описаны все функции протоколов, все нюансы. Там есть ответы на все вопросы, которые у тебя могут возникнуть. RFC1928 – SOCKS протокол RFC1929 – протокол аутентификации по username/password Функция соединения int connectbysocks(server *socks, int socksnum, SOCKET s, server dest) { SOCKADDR_IN addr; int nrecv = 0; char* request = "\x05\x01\x00"; BYTE request_ans[2]; req temp; addr.sin_addr.S_un.S_addr = socks[0].ip; addr.sin_port = socks[0].port; addr.sin_family = AF_INET; if(connect(s, (struct sockaddr *)&addr,sizeof(SOCKADDR_IN))) return -1; for (int i = 1; i <= socksnum; ++i) { send(s,(char*)request,3,0); nrecv = recv(s,(char*)request_ans,2,0); if ((nrecv == SOCKET_ERROR)||(request_ans[1]==0xFF)||(request_ans[0]!=0x05)) return -1; temp.ver = 0x05; temp.cmd = temp.type = 0x01; temp.rsv = 0x00; if (i == socksnum) { temp.addr = dest.ip; temp.port = dest.port; } else { temp.addr = socks[i].ip; temp.port = socks[i].port; } if (!temp.addr) continue; send(s,(char*)&temp,sizeof(temp),0); nrecv = recv(s, (char*)&temp,sizeof(temp),0); if ((nrecv == SOCKET_ERROR)||(temp.rsv != 0)||(temp.cmd != 0)) return -1; } return 0; CD На диске ты найдешь полный сорец программы, рассмотренной в статье. WWW Если ты всерьез занялся изучением протокола SOCKS5, тебе стоит внимательнейшим образом изучить RFC1928. На русском языке его можно найти на http://www.codenet.ru/webmast/socks51.php INFO Читай RFC’ы – в них Дао! |