Просмотр полной версии : Socks4-5,http simple proxy server source
У меня ещё больше года назад появилась идея написать нечто вроде 3proxy, но только попроще и с более понятный кодом, но руки дошли только месяц назад. По функциональности конечно не сравнится с 3proxy, но...
+socks4
+socks5(с авторизацией)
+http
+логгирование трафика
Я писал с использованием классов, поэтому можно будет легко поднимать несколько серваков.
В будующем можеь быть непепишу под *nix(старался использовать только стандартные типы\функции).
slil.ru/25377557
webfile.ru/1695911
P.S.
Пожайлуста, не надо всяких стёбов про '_', оутпост и анхук sst(темболее что я с этим завязал). Писал я всё сам - копипаста нет.
темболее что я с этим завязал)
Правильно, наркотики до добра не доведут.
GoreMaster
20.01.2008, 17:00
наркотики до добра не доведут.
Тебя это тож касается =)))
толи ещё будет
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...
Кузьмич, почитай нехакерские форумы. Это мой совет. Исходники, винград и т.п.
Это, да, это я напсевдокодил...
GoreMaster
20.01.2008, 17:07
2Ky3bMu4
Научись правильно оформлять код =\
Delimiter
20.01.2008, 22:14
Несколько мест переполнения буфера.!!!!!!!!
Поднимите такой сервер 8)))) и я буду его "опускать" когда хочу!!!
... или ждать появления видео "Взлом прокси от Кузьмича"?
зачем тебе __thiscall?))
Ой, вот этого там не должно было быть.
а чеж не _beginthread?
А вот этого подтёба я, если честно, не понял.
Несколько мест переполнения буфера.
Я писал этот сервак с упором не на интерфейс и безопасность, а на работу по socks4-5. Вы видете только мои ошибки, а остального не видете =(
Delimiter
20.01.2008, 22:37
Кузьмич мы говорим тебе чтоб ты подправил а не ради ПОУЧЕНИЙ
.... я всегда за то чтобы поддержать любого ПИШУЩЕГО, но это прокси и каждый кто им будет пользоваться вправе спросить почему его вдруг взломали!
2Ky3bMu4
Научись правильно оформлять код =\
Пока он не умеет ПИСАТЬ код, он не научится его оформлять.
а чеж не _beginthread?
А вот этого подтёба я, если честно, не понял.
Кроссплатформенность не для придумали?
Я писал этот сервак с упором не на интерфейс и безопасность, а на работу по socks4-5. Вы видете только мои ошибки, а остального не видете =(
Но, простите, если у тебя нету ни безопасного кода ,ни оформления, то все остальное давно паблик и в чем тогда ценность?
Лучше бы не языком трепал, а баги закрывал
reversys
20.01.2008, 22:51
Да пофиг на то что есть криво написаный код и буфер переполняется.
Кузьмич ты бы его хоть потестил сам, он же работает не корректно.
+ я тебе в репу поставил и убирать не хочу поэтому тести и исправляй :)
Полазяй через него по яндексу, по переходи с яшки например на блоги(чтоб переход был на другой сервак). И посмотри что будет. + посмотри на время загрузки страниц. В идеале через локальную проксю время загрузки должно быть практически таким же как и без него.
2 _Great_
Я помню что ты примерно год назад выкладывал на damagelab.org сорцы своего прокси. Где на них можно щас посмотреть?
А вот этого подтёба я, если честно, не понял.
А потому что ты попросил подъ**ы на писать, а критику конструктивную вроде.
Вот тебе критика, что у тебя кругом встроеные типы языка, а тут вдруг CreateThread виндовая. _beginthread вот например у тебя сконпелируется на любом, соответствующем стандарте компиляторе.
Ой, вот этого там не должно было быть.
конечно, ведь ты это для понта написал) ничего, я тоже так делаю)
Я писал этот сервак с упором не на интерфейс и безопасность, а на работу по socks4-5. Вы видете только мои ошибки, а остального не видете =(
Понимаешь ли, у тебя сама объектная модель, хоть и простая, но уже кривая. И код схематично ужасен. Я не стал об этом писать конечно, т.к. смысла нет. Но если у тебя и такой цели не было, то скажу, что сокс и прокси наверное все-таки работает, молодец.
Вообще, я бы на твоем месте написал бы, что
sprintf(login,"%s",nlogin) сделал для того, чтобы потренироваться эксплойт написать к серверу. Надеюсь ты это место пофиксишь и больше никогда так делать не будешь... : )
Это вы так Грейта хотите постыдить? Что он админом на damagelab был? гыыыы
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 закончу и потом может вырежу и выложу.
Немного подправил код, т.к. винда умерла переписал под linux(прaвим config.h).
webfile.ru/1699412
ключевые слова: маленький
Как я должен это понимать? Что кто-то слишком маленький и нормальненький код не понимает или что?
reversys
22.01.2008, 18:57
Как я должен это понимать? Что кто-то слишком маленький и нормальненький код не понимает или что?
Да все всё понимают, просто нет охоты сидеть и разбирать код сквида в свободные пол часа на работе.
и откуда у тебя столько злости кез? :)
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.
это socks5 без авторизации, он не проверяет ошибок как следует и вообще прост как двери. Но он работает. Я его писал на делфи под винду, компилится и фри паскалем
Да все всё понимают, просто нет охоты сидеть и разбирать код сквида в свободные пол часа
Да я вообще-то подумал, что ты хочешь размер бинарника маленький, что бы следуя манифестам хэкеров, вырезать нахер 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;
}
по-чи-та-ть в свободные 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 файлов уже нет, что не удивительно(((. Может новую ссылку дадите?
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot