Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Socks4-5,http simple proxy server source (https://forum.antichat.xyz/showthread.php?t=59320)

Ky3bMu4 20.01.2008 16:35

Socks4-5,http simple proxy server source
 
У меня ещё больше года назад появилась идея написать нечто вроде 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

Цитата:

Сообщение от GoreMaster
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

Цитата:

Сообщение от reversys
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(ErrorAtAddr));
  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,@ovp) 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

Цитата:

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

slil.ru/25377557
webfile.ru/1695911

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

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


Время: 18:38