Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #70, ОКТЯБРЬ 2004 г.

Железные цепи победы

Николай "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’ы – в них Дао!

Назад на стр. 070-122-3  Содержание