PDA

Просмотр полной версии : Socks4-5,http simple proxy server source


Ky3bMu4
20.01.2008, 16:35
У меня ещё больше года назад появилась идея написать нечто вроде 3proxy, но только попроще и с более понятный кодом, но руки дошли только месяц назад. По функциональности конечно не сравнится с 3proxy, но...
+socks4
+socks5(с авторизацией)
+http
+логгирование трафика
Я писал с использованием классов, поэтому можно будет легко поднимать несколько серваков.
В будующем можеь быть непепишу под *nix(старался использовать только стандартные типы\функции).

slil.ru/25377557
webfile.ru/1695911

P.S.
Пожайлуста, не надо всяких стёбов про '_', оутпост и анхук sst(темболее что я с этим завязал). Писал я всё сам - копипаста нет.

_Great_
20.01.2008, 16:59
темболее что я с этим завязал)
Правильно, наркотики до добра не доведут.

GoreMaster
20.01.2008, 17:00
наркотики до добра не доведут.
Тебя это тож касается =)))

KEZ
20.01.2008, 17:01
толи ещё будет


for(x;x<=1024;x++){
if(buffer[x]=='H'){
x++;
if(buffer[x]=='o'){
x++;
if(buffer[x]=='s'){
x++;
if(buffer[x]=='t'){
x+=3;
break;
}
}
}
}
}



else if(!strcmp(command,"stop_socks4")) s4.StopServer();
else if(!strcmp(command,"stop_socks5")) s5.StopServer();
else if(!strcmp(command,"stop_http")) hp.StopServer();

else if(!strcmp(command,"getstate_socks4")) s4.print_state();
else if(!strcmp(command,"getstate_socks5")) s5.print_state();
else if(!strcmp(command,"getstate_http")) hp.print_state();



using namespace std;


Кузьмич ыгыгы вот так писать не надо. Для тебя же сделали namespace'ы, чтоб не было конфликтов. А ты их обратно в глобальное... Хотя что тут придираться к неймспейсам ... гыгы
когда видишь такое


sprintf(login,"%s",nlogin);
sprintf(passwd,"%s",npasswd);


...

void __thiscall socks5::print_state(void){

зачем тебе __thiscall?))


CreateThread(NULL, 0, ServerThread5, this, 0, &threadIdServer);


а чеж не _beginthread?

бля, все, зря я начал это смотреть... это все равно что ... *** знает даже. придираться к учителю информатики 7ого класса что он не знает что такое там типа KeSuperPuperKernelFunction...

Кузьмич, почитай нехакерские форумы. Это мой совет. Исходники, винград и т.п.

Ky3bMu4
20.01.2008, 17:05
Это, да, это я напсевдокодил...

GoreMaster
20.01.2008, 17:07
2Ky3bMu4
Научись правильно оформлять код =\

Delimiter
20.01.2008, 22:14
Несколько мест переполнения буфера.!!!!!!!!

Поднимите такой сервер 8)))) и я буду его "опускать" когда хочу!!!
... или ждать появления видео "Взлом прокси от Кузьмича"?

Ky3bMu4
20.01.2008, 22:31
зачем тебе __thiscall?))

Ой, вот этого там не должно было быть.

а чеж не _beginthread?
А вот этого подтёба я, если честно, не понял.

Несколько мест переполнения буфера.
Я писал этот сервак с упором не на интерфейс и безопасность, а на работу по socks4-5. Вы видете только мои ошибки, а остального не видете =(

Delimiter
20.01.2008, 22:37
Кузьмич мы говорим тебе чтоб ты подправил а не ради ПОУЧЕНИЙ
.... я всегда за то чтобы поддержать любого ПИШУЩЕГО, но это прокси и каждый кто им будет пользоваться вправе спросить почему его вдруг взломали!

_Great_
20.01.2008, 22:46
2Ky3bMu4
Научись правильно оформлять код =\
Пока он не умеет ПИСАТЬ код, он не научится его оформлять.

а чеж не _beginthread?

А вот этого подтёба я, если честно, не понял.
Кроссплатформенность не для придумали?

Я писал этот сервак с упором не на интерфейс и безопасность, а на работу по socks4-5. Вы видете только мои ошибки, а остального не видете =(
Но, простите, если у тебя нету ни безопасного кода ,ни оформления, то все остальное давно паблик и в чем тогда ценность?

Лучше бы не языком трепал, а баги закрывал

reversys
20.01.2008, 22:51
Да пофиг на то что есть криво написаный код и буфер переполняется.

Кузьмич ты бы его хоть потестил сам, он же работает не корректно.
+ я тебе в репу поставил и убирать не хочу поэтому тести и исправляй :)

Полазяй через него по яндексу, по переходи с яшки например на блоги(чтоб переход был на другой сервак). И посмотри что будет. + посмотри на время загрузки страниц. В идеале через локальную проксю время загрузки должно быть практически таким же как и без него.

2 _Great_
Я помню что ты примерно год назад выкладывал на damagelab.org сорцы своего прокси. Где на них можно щас посмотреть?

KEZ
20.01.2008, 23:09
А вот этого подтёба я, если честно, не понял.


А потому что ты попросил подъ**ы на писать, а критику конструктивную вроде.
Вот тебе критика, что у тебя кругом встроеные типы языка, а тут вдруг CreateThread виндовая. _beginthread вот например у тебя сконпелируется на любом, соответствующем стандарте компиляторе.


Ой, вот этого там не должно было быть.


конечно, ведь ты это для понта написал) ничего, я тоже так делаю)


Я писал этот сервак с упором не на интерфейс и безопасность, а на работу по socks4-5. Вы видете только мои ошибки, а остального не видете =(


Понимаешь ли, у тебя сама объектная модель, хоть и простая, но уже кривая. И код схематично ужасен. Я не стал об этом писать конечно, т.к. смысла нет. Но если у тебя и такой цели не было, то скажу, что сокс и прокси наверное все-таки работает, молодец.
Вообще, я бы на твоем месте написал бы, что
sprintf(login,"%s",nlogin) сделал для того, чтобы потренироваться эксплойт написать к серверу. Надеюсь ты это место пофиксишь и больше никогда так делать не будешь... : )

KEZ
20.01.2008, 23:20
Это вы так Грейта хотите постыдить? Что он админом на damagelab был? гыыыы

_Great_
20.01.2008, 23:21
2 _Great_
Я помню что ты примерно год назад выкладывал на damagelab.org сорцы своего прокси. Где на них можно щас посмотреть?
Если на сайте нету, то нигде. Прошлой зимой винт слетал (https://forum.antichat.ru/thread31607.html)

reversys
21.01.2008, 00:12
Окей, а может есть у кого другого грамотно написанный маленький проксик (хоть http)?


ключевые слова: маленький, грамотно написанный.


Это вы так Грейта хотите постыдить? Что он админом на damagelab был? гыыыы
нет :)

Delimiter
21.01.2008, 00:17
Да есть конечно.... только мой GUI-Sock5 "заточенный" для членов домена.
нужно вырезать "служебное" 8))))

поэтому выслать проблематично.... счас диплом по 2fish закончу и потом может вырежу и выложу.

Ky3bMu4
22.01.2008, 14:15
Немного подправил код, т.к. винда умерла переписал под linux(прaвим config.h).

webfile.ru/1699412

KEZ
22.01.2008, 16:40
ключевые слова: маленький


Как я должен это понимать? Что кто-то слишком маленький и нормальненький код не понимает или что?

reversys
22.01.2008, 18:57
Как я должен это понимать? Что кто-то слишком маленький и нормальненький код не понимает или что?
Да все всё понимают, просто нет охоты сидеть и разбирать код сквида в свободные пол часа на работе.
и откуда у тебя столько злости кез? :)

bons
22.01.2008, 19:56
program socks5srv;
{$APPTYPE CONSOLE}
uses windows, winsock,sysutils;

//длина очереди
const NLISTEN=5;
//Максимальная длина принятой строки
const MAX_RECV_BUF_SIZE=1500;

{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~}
//Структура с информацией о клиенте
type CLIENT_INFO = record
sock:TSocket;
TargetSock:TSocket;
ClientAddr:TInAddr;
ServerAddr:TInAddr;
TargetConnected:boolean;
ClientConnected:boolean;

end;
PCLIENT_INFO=^CLIENT_INFO;

var CRLF:array[0..1] of char=(#13,#10);

//Импортируемые функции
function send(s: TSocket; Buf:pChar; len, flags: Integer): Integer;
stdcall; external 'ws2_32.dll';
function recv(s: TSocket; Buf:pChar; len, flags: Integer): Integer;
stdcall; external 'ws2_32.dll';
function AcceptEx(
sListenSocket,
sAcceptSocket:TSocket;
lpOutputBuffer:pointer;
dwReceiveDataLength,
dwLocalAddressLength,
dwRemoteAddressLength:DWORD;
lpdwBytesReceived:LPDWORD;
lpOverlapped:POVERLAPPED
):boolean;
stdcall; external 'Mswsock.dll';


{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~}
var MainSock:TSocket;
var Listened:boolean=true;
{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~}
procedure error(str:string);
begin
writeln(str);
halt(0);
end;
{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~}
//Вызывается при закрытии консоли
procedure ConsoleEvent(dwCtrlType:cardinal);
begin
Listened:=false;
closesocket(MainSock);
Sleep(dword(-1));
end;
{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~}
function GetTime:ansistring;
var Time:SYSTEMTIME;
s:ansistring;
begin
GetLocalTime(Time);

s:='{'+
IntToStr(Time.wYear)+'.'+
IntToStr(Time.wMonth)+'.'+
IntToStr(Time.wDay)+' '+
IntToStr(Time.wHour)+'.'+
IntToStr(Time.wMinute)+'.'+
IntToStr(Time.wSecond)+'} ';
result:=s;
end;
{################################################# ################}
{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~}
procedure Shut(info:PCLIENT_INFO);
begin

if info.sock<>0 then begin
shutdown(info.sock,SD_BOTH);
closesocket(info.sock);
info.sock:=0;
end;

ExitThread(0);
end;
{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
function dns(Host:pChar):TInAddr;
type TaPInAddr = array [0..10] of PinAddr;
PaPInAddr = ^TaPInAddr;
var phe:pHostEnt;
pptr: PaPInAddr;

begin
phe:=gethostbyname(Host);
zeromemory(@result,sizeof(result));
if phe <> nil then begin;
pPtr := PaPInAddr(phe^.h_addr_list);
if pPtr^[0] <> nil then result:=pptr^[0]^;
end;
end;
{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~}
procedure RecvBuffer(info:PCLIENT_INFO; var Buf; dwSize:integer);
type ByteBuf=array[0..144000] of byte;
var len,k,r:integer;
begin
len:=0;
repeat
k:=dwSize-len;
r:=recv(info.sock,@ByteBuf(Buf)[len],k,0);
if r<=0 then begin
writeln(' !Error! Connection closed by client');
shut(info);
end;
len:=len+r;
until len=dwSize;
end;
{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~}
procedure SendBuffer(sock:integer; pBuf:pchar; dwSize:integer);
begin
send(sock,pBuf,dwSize,0);
end;

{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~}
procedure ClientToTarget(info:PCLIENT_INFO);stdcall;
var k:integer;
buf:array[0..1499] of byte;
begin

while true do begin
zeromemory(@buf,sizeof(buf));
k:=recv(info.sock,@buf,sizeof(buf),0);
if (k=0)OR(k=SOCKET_ERROR) then break;
send(info.TargetSock,@buf,k,0);
end;

info.ClientConnected:=false;
shutdown(info.TargetSock,SD_SEND);


end;

{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~}
//Основная процедура сервера
procedure server(info:PCLIENT_INFO);stdcall;
var buf:array[0..1499] of byte;
dnsname:array[0..256] of char;
k,i:integer;
Version,nMethods:byte;
ip:TInAddr;
port:word;
sz:byte;
addr:TSockAddr;
target:TSocket;
const NoMethods:array[0..1] of byte=($05,$FF);
YeMethods:array[0..1] of byte=($05,$00);
SuccessConnect:array[0..3] of byte=($05,$00,$00,$01);
ErrorAtAddr:array[0..3] of byte=($05,$08,$00,$00);
begin

{Чтение запроса 1}

info.ClientConnected:=true;
RecvBuffer(info,Version,sizeof(Version));
RecvBuffer(info,nMethods,sizeof(nMethods));

if Version<>5 then begin
Shut(info);
writeln(' ! Error! Version must be 5');
end;

if nMethods=0 then begin
writeln(' ! Error! nMethods cannot be 0');
Shut(info);
end;

RecvBuffer(info,buf,nMethods);
k:=1;
for i:=0 to nMethods-1 do
if buf[i]=0 then begin
k:=0;
break;
end;

{Ответ 1}
if k=1 then begin
writeln(' ! Error! No good methods');
sendbuffer(info.sock,@NoMethods,sizeof(NoMethods)) ;
Shut(info);
end;

sendbuffer(info.sock,@YeMethods,sizeof(NoMethods)) ;

{Прием команды}

RecvBuffer(info,buf,4);

if buf[0]<>5 then begin
writeln(' ! Error! Version must be 5');
Shut(info);
end;
if buf[1]<>1 then begin
writeln(' ! Error! Only CONNECT command supported');
Shut(info);
end;
if buf[2]<>0 then begin
writeln(' ! Error! Rsv must be 0');
Shut(info);
end;
if (buf[3]<>1)and(buf[3]<>3) then begin
writeln(' ! Error! Only IPv4 or DNS address supported');
sendbuffer(info.sock,@ErrorAtAddr,sizeof(ErrorAtAd dr));
Shut(info);
end;

zeromemory(@dnsname,sizeof(dnsname));
{Прием целевого адреса IPv4}
if buf[3]=1 then begin
RecvBuffer(info,ip,4);
end;

{Прием целевого адреса DNS}
if buf[3]=3 then begin
RecvBuffer(info,sz,1);
if sz=0 then begin
writeln(' ! Error in size of DNS address');
Shut(info);
end;

RecvBuffer(info,dnsname,sz);
ip:=dns(@dnsname);
if dword(ip)=0 then begin
writeln(' !Error host not found: ',pChar(@dnsname));
shut(info);
end;
end;

RecvBuffer(info,port,2);

if port=0 then begin
writeln(' !Error in port: ',htons(port));
shut(info);
end;


{Connect}

target:=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if target=INVALID_SOCKET then begin
writeln('! Error at socket, ',WSAGetlastError);
Shut(info);
end;
info.TargetSock:=Target;

zeromemory(@addr,sizeof(addr));
addr.sin_family:=AF_INET;
addr.sin_port:=port;
addr.sin_addr:=ip;

if connect(target,addr,sizeof(addr))<>0 then begin
writeln(' ! Could not connect to target');
Shut(info);
end;

write;
info.TargetSock:=target;

write('# ',inet_ntoa(info.ClientAddr));
write(' -> ',pChar(@dnsname),' (',inet_ntoa(ip));
writeln(':',htons(port),'), ',GetTime);

info.TargetConnected:=true;

{Ответ на команду}

k:=sizeof(addr);
getsockname(Target,addr,k);
ip:=addr.sin_addr;
port:=addr.sin_port;

movememory(@buf,@SuccessConnect,4);
movememory(@buf[4],@ip,4);
movememory(@buf[6],@port,2);

sendbuffer(info.sock,@buf,10);


{Перенаправление данных Target->Client}

if CreateThread(nil,0,@ClientToTarget,info,0,cardinal (k))=0 then Shut(info);


while true do begin
zeromemory(@buf,sizeof(buf));
k:=recv(info.TargetSock,@buf,sizeof(buf),0);
if (k=0)OR(k=SOCKET_ERROR) then break;
send(info.sock,@buf,k,0);
end;

info.TargetConnected:=false;
shutdown(info.sock,SD_SEND);

k:=0;
while true do begin
if not info.ClientConnected then break
else Sleep(70);
inc(k);
if k=50 then break;
end;
closesocket(info.sock);
closesocket(info.TargetSock);
end;
{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~}
{################################################# ################}
{
Вызывается для обслуживания нового соединения:
1. Выделяет память под информацию о клиенте
2. Инициализирует поля структуры
3. Выделяет память под временный буфер для данных из сети
4. Создает поток для обслуживания нового соединения
}
function NewClient(sock:TSocket; ClientAddr,ServerAddr:TInAddr):THandle;
var info:PCLIENT_INFO;
id:cardinal;
begin
GetMem(info,sizeof(CLIENT_INFO));
info.sock:=sock;
info.TargetSock:=0;
MoveMemory(@info.ClientAddr, @ClientAddr, sizeof(ClientAddr));
MoveMemory(@info.ServerAddr, @ServerAddr, sizeof(ServerAddr));
NewClient:=CreateThread(nil,0,@server,info,0,id);
end;

{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~}
{Процедура инициализации}
procedure Entry(port:word);
var InitData:TWSAData;
local, peer:TSockAddr;
code,loclen,remlen:integer;
s1:TSocket;
Buf:array[0..255] of char;
ovp:TOVERLAPPED;
begin
if WSAStartup(MakeWord(2,2),InitData)<>0 then
error('! error at WSAStartup');


fillchar(local, sizeof(local), 0);
local.sin_family:=AF_INET;
local.sin_port:=htons(port);

MainSock:=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if MainSock=INVALID_SOCKET then begin
WSACleanup();
error('! error at socket');
end;

if bind(MainSock, local, sizeof(local))<>0 then begin
closesocket(MainSock);
WSACleanup();
error('! error at bind');
end;

if listen(MainSock, NLISTEN)<>0 then begin
closesocket(MainSock);
WSACleanup();
error('! error at listen');
end;

SetConsoleCtrlHandler(@ConsoleEvent, TRUE);
writeln('* Start echo\n');

while true do begin
loclen:= sizeof(peer)+16;
remlen:=loclen;
s1:=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if s1=INVALID_SOCKET then begin
closesocket(MainSock);
WSACleanup();
error('! error at socket');
end;
zeromemory(@ovp,sizeof(ovp));
ovp.hEvent:=CreateEvent(Nil, True, False, Nil);

if not acceptEx(MainSock,s1,@Buf,0,loclen,remlen,@code,@o vp) then begin
code:=WSAGetLastError;
if code=WSAECONNRESET then begin
closesocket(s1);
continue;
end;
end;
WaitForSingleObject(ovp.hEvent,INFINITE);

if not listened then begin
closesocket(s1);
WSACleanup();
writeln('! halt');
halt(0);
end;

movememory(@peer.sin_addr,@buf[42],4);
movememory(@local.sin_addr,@buf[14],4);

NewClient(s1,peer.sin_addr,local.sin_addr);
end;
end;


{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

{Точка входа}
var code:integer;
port:word;

BEGIN
if ParamCount<>1 then
error('Usage: echo.exe port');

val(ParamStr(1),port,code);

Entry(port);;
END.

bons
22.01.2008, 20:00
это socks5 без авторизации, он не проверяет ошибок как следует и вообще прост как двери. Но он работает. Я его писал на делфи под винду, компилится и фри паскалем

KEZ
22.01.2008, 20:09
Да все всё понимают, просто нет охоты сидеть и разбирать код сквида в свободные пол часа


Да я вообще-то подумал, что ты хочешь размер бинарника маленький, что бы следуя манифестам хэкеров, вырезать нахер CRT, использовать осенблерные вставки в самых неподходящих местах (для понта), и т.п. А зачем тебе нужен маленький исходник - это ещё более неясно. Какая разница какой будет размер исходного кода, если он будет расширяем, правильно работать, будут средства отладки и тп?*

reversys
22.01.2008, 22:03
А зачем тебе нужен маленький исходник - это ещё более неясно. Какая разница какой будет размер исходного кода, если он будет расширяем, правильно работать, будут средства отладки и тп?*
по-чи-та-ть в свободные 30 минут на работе.

PS мне показалось или я это уже написал?

PPS а если тебе интересны ещё какиелибо причины моих действий добро пожаловать ко мне в аську :)

nc.STRIEM
23.01.2008, 00:22
Исходник простейшего прокси от мя

#include <winsock2.h>
#include <windows.h>
#include <stdio.h>

#pragma comment(lib,"ws2_32")

#define SLISTEN_PORT 8080 //ïîðò
#define MESSAGE_BYF 2048
#define LISTEN_BACKLOG 5


////////////////////////////////////////////////////////////////////////
int GetHeader(int socket, char *buf, int maxlen) // ÷èòàåì õåäåð áåç ïîñòà. (äî \n\n èëè \r\n\r\n )
{
int len, i=0, f=0;
char c;
while(f != 2 && i < maxlen)
{
len = recv(socket, &c, 1, 0);
if(len==0 || len==-1)
break;
if(c == '\n')
f++;
else if(c != '\r')
f=0;
buf[i] = c;
i++;
}
buf[i]='\0';

char *p = strstr(buf, "HTTP/1.0");
if(p != NULL)
*(p+7)='1';

return i;
}

////////////////////////////////////////////////////////////////////////

int GetHost(char *buf, char *host, int maxlen) /// ïàðñèì èìÿ õîñòà ñ õåäåðà
{
char *p = strstr(buf, "Host: ");

if( p == NULL )
return 0;

p+=6;
int i;
for(i=0; *(p+i)!='\0' && *(p+i)!='\n' && *(p+i)!='\r' && *(p+i)!=':' && *(p+i)!=' ' && i<maxlen; i++)
host[i] = *(p+i);

if( i == maxlen )
return 0;
host[i] = '\0';
return i;
}

////////////////////////////////////////////////////////////////////////

int GetContLeng(char *buf) /// ïàðñèì äëèííó POST äàííûõ
{
char *p = strstr(buf, "Content-Length: ");
if( p == NULL )
return 0;

p+=16;
char len[8];
int i;
for(i=0; *(p+i)!='\0' && *(p+i)!='\n' && *(p+i)!='\r' && *(p+i)!=' ' && i<8; i++)
len[i] = *(p+i);

if( i == 8 )
return 0;
len[i]='\0';
return atoi(len);
}

////////////////////////////////////////////////////////////////////////

SOCKET SocketConnect(char *host) /// ïîäñîåäåíÿåìñÿ ê ñåðâåðó
{
SOCKET ksocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct hostent *Ip;
Ip = gethostbyname(host);

sockaddr_in clientService;
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr(inet_ntoa(*((struct in_addr *)Ip->h_addr)));
clientService.sin_port = htons(80);

if(connect( ksocket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR)
return SOCKET_ERROR;

return ksocket;
}

//////************************************************** *************************************************/////

DWORD WINAPI SocketListen(LPVOID AcceptSocket)
{
int len;
char recvbuf[MESSAGE_BYF], host[256];

if( GetHeader((int)AcceptSocket, recvbuf, MESSAGE_BYF) == SOCKET_ERROR ) //ïîëó÷àåì õåäåð îò áðàóçåðà
return false;

//printf("%s", recvbuf);

if( !GetHost(recvbuf, host, 256) ) /// ïàðñèì õîñò èç õåäåðà
{
char message[]="Proxy error. Host not found in header.";
send((int)AcceptSocket, message, strlen(message), 0);
closesocket((int)AcceptSocket);
return false;
}

SOCKET ConnectSocket = SocketConnect(host); // ïäñîåäåíÿåìñÿ ê ñåðâåðó
if(ConnectSocket == SOCKET_ERROR)
{
char message[]="Proxy error.Cannot connect to host.";
send((int)AcceptSocket, message, strlen(message), 0);
closesocket((int)AcceptSocket);
return false;
}

if( send((int)ConnectSocket,recvbuf,strlen(recvbuf),0) == SOCKET_ERROR) // îòïðàâëÿåì äàííûé íà ñåðâåð
{
char message[]="Proxy error. Cannot send data to host.";
send((int)AcceptSocket, message, strlen(message), 0);
closesocket((int)AcceptSocket);
return false;
}

len = GetContLeng(recvbuf); // ïàðñèì ðàçìåð POST äàííûõ
char contbuf[128];
int recvlen;

while(len > 0) /// ïîëó÷àåì îò áðàóçåðà è îòïàâëÿåì POST äàííûå íà ñåðâåð
{
recvlen = recv((int)AcceptSocket, contbuf, 128, 0);
if(recvlen == SOCKET_ERROR)
break;
send((int)ConnectSocket,contbuf,recvlen,0);
len-=recvlen;
}

while(1) /// ïîëó÷àåì äàííûå îò ñåâåðà è îòïðàâëÿåì áðàóçåðó
{
len = recv((int)ConnectSocket, recvbuf, MESSAGE_BYF, 0);
if(len == 0 || len == SOCKET_ERROR)
break;
send((int)AcceptSocket,recvbuf,len,0);
}

closesocket((int)AcceptSocket);
return true;
}

//************************************************** ************************************************** ***********************//

int main()
{

WSADATA wsaData;
if (WSAStartup(MAKEWORD(2,2), &wsaData) != NO_ERROR)
{
printf("Error at WSAStartup()\n");
return 0;
}

SOCKET ListenSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
if (ListenSocket == INVALID_SOCKET)
{
printf("Error at socket(): %ld\n", WSAGetLastError());
WSACleanup();
return 0;
}


SOCKADDR_IN sa = {0};
int len = sizeof(sa);

sa.sin_family = AF_INET;
sa.sin_addr.s_addr = INADDR_ANY;
sa.sin_port = htons( SLISTEN_PORT );


if( bind( ListenSocket, (sockaddr*)&sa, len ) == SOCKET_ERROR )
{
printf("bind() failed.\n");
closesocket(ListenSocket);
return 0;
}

if( listen( ListenSocket, LISTEN_BACKLOG ) == SOCKET_ERROR )
{
printf("Error listening on socket.\n");
closesocket(ListenSocket);
return 0;
}

printf("Server start at port: %d \nWaiting...\n",SLISTEN_PORT );
SOCKET AcceptSocket;
DWORD thID;

while( (AcceptSocket = accept( ListenSocket, (sockaddr*)&sa, &len )) != -1 )
{
printf("Connection from %s:%d AcceptID=%d\n", inet_ntoa(sa.sin_addr), htons(sa.sin_port), AcceptSocket );
CreateThread(0, 0, SocketListen, (LPVOID)AcceptSocket, 0, &thID);
}

return 1;
}

KEZ
23.01.2008, 03:24
по-чи-та-ть в свободные 30 минут на работе.


на работе надо читать Пушкина, а не исходники сокс-серверов, написаные кое-как

Alexsis f
10.03.2009, 02:43
У меня ещё больше года назад появилась идея написать нечто вроде 3proxy, но только попроще и с более понятный кодом, но руки дошли только месяц назад. По функциональности конечно не сравнится с 3proxy, но...
+socks4
+socks5(с авторизацией)
+http
+логгирование трафика
Я писал с использованием классов, поэтому можно будет легко поднимать несколько серваков.
В будующем можеь быть непепишу под *nix(старался использовать только стандартные типы\функции).

slil.ru/25377557
webfile.ru/1695911

P.S.
Пожайлуста, не надо всяких стёбов про '_', оутпост и анхук sst(темболее что я с этим завязал). Писал я всё сам - копипаста нет.

На slil.ru и webfile.ru файлов уже нет, что не удивительно(((. Может новую ссылку дадите?