Socks4-5,http simple proxy server source

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Ky3bMu4, 20 Jan 2008.

  1. Ky3bMu4

    Ky3bMu4 Elder - Старейшина

    Joined:
    3 Feb 2007
    Messages:
    487
    Likes Received:
    284
    Reputations:
    42
    У меня ещё больше года назад появилась идея написать нечто вроде 3proxy, но только попроще и с более понятный кодом, но руки дошли только месяц назад. По функциональности конечно не сравнится с 3proxy, но...
    +socks4
    +socks5(с авторизацией)
    +http
    +логгирование трафика
    Я писал с использованием классов, поэтому можно будет легко поднимать несколько серваков.
    В будующем можеь быть непепишу под *nix(старался использовать только стандартные типы\функции).

    slil.ru/25377557
    webfile.ru/1695911

    P.S.
    Пожайлуста, не надо всяких стёбов про '_', оутпост и анхук sst(темболее что я с этим завязал). Писал я всё сам - копипаста нет.
     
    #1 Ky3bMu4, 20 Jan 2008
    Last edited: 20 Jan 2008
    3 people like this.
  2. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    Правильно, наркотики до добра не доведут.
     
    2 people like this.
  3. GoreMaster

    GoreMaster Elder - Старейшина

    Joined:
    28 May 2007
    Messages:
    119
    Likes Received:
    32
    Reputations:
    4
    Тебя это тож касается =)))
     
  4. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    толи ещё будет

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

    ...

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

    а чеж не _beginthread?

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

    Кузьмич, почитай нехакерские форумы. Это мой совет. Исходники, винград и т.п.
     
    #4 KEZ, 20 Jan 2008
    Last edited: 20 Jan 2008
  5. Ky3bMu4

    Ky3bMu4 Elder - Старейшина

    Joined:
    3 Feb 2007
    Messages:
    487
    Likes Received:
    284
    Reputations:
    42
    Это, да, это я напсевдокодил...
     
  6. GoreMaster

    GoreMaster Elder - Старейшина

    Joined:
    28 May 2007
    Messages:
    119
    Likes Received:
    32
    Reputations:
    4
    2Ky3bMu4
    Научись правильно оформлять код =\
     
  7. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    Несколько мест переполнения буфера.!!!!!!!!

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

    Ky3bMu4 Elder - Старейшина

    Joined:
    3 Feb 2007
    Messages:
    487
    Likes Received:
    284
    Reputations:
    42
    Ой, вот этого там не должно было быть.

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

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

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    Кузьмич мы говорим тебе чтоб ты подправил а не ради ПОУЧЕНИЙ
    .... я всегда за то чтобы поддержать любого ПИШУЩЕГО, но это прокси и каждый кто им будет пользоваться вправе спросить почему его вдруг взломали!
     
  10. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    Пока он не умеет ПИСАТЬ код, он не научится его оформлять.

    Кроссплатформенность не для придумали?

    Но, простите, если у тебя нету ни безопасного кода ,ни оформления, то все остальное давно паблик и в чем тогда ценность?

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

    reversys Elder - Старейшина

    Joined:
    21 Nov 2007
    Messages:
    139
    Likes Received:
    57
    Reputations:
    7
    Да пофиг на то что есть криво написаный код и буфер переполняется.

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

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

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

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    А потому что ты попросил подъ**ы на писать, а критику конструктивную вроде.
    Вот тебе критика, что у тебя кругом встроеные типы языка, а тут вдруг CreateThread виндовая. _beginthread вот например у тебя сконпелируется на любом, соответствующем стандарте компиляторе.

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

    Понимаешь ли, у тебя сама объектная модель, хоть и простая, но уже кривая. И код схематично ужасен. Я не стал об этом писать конечно, т.к. смысла нет. Но если у тебя и такой цели не было, то скажу, что сокс и прокси наверное все-таки работает, молодец.
    Вообще, я бы на твоем месте написал бы, что
    sprintf(login,"%s",nlogin) сделал для того, чтобы потренироваться эксплойт написать к серверу. Надеюсь ты это место пофиксишь и больше никогда так делать не будешь... : )
     
    #12 KEZ, 20 Jan 2008
    Last edited by a moderator: 21 Jan 2008
    1 person likes this.
  13. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    Это вы так Грейта хотите постыдить? Что он админом на damagelab был? гыыыы
     
  14. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    Если на сайте нету, то нигде. Прошлой зимой винт слетал (https://forum.antichat.ru/thread31607.html)
     
  15. reversys

    reversys Elder - Старейшина

    Joined:
    21 Nov 2007
    Messages:
    139
    Likes Received:
    57
    Reputations:
    7
    Окей, а может есть у кого другого грамотно написанный маленький проксик (хоть http)?


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

    нет :)
     
    #15 reversys, 20 Jan 2008
    Last edited: 20 Jan 2008
  16. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    Да есть конечно.... только мой GUI-Sock5 "заточенный" для членов домена.
    нужно вырезать "служебное" 8))))

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

    Ky3bMu4 Elder - Старейшина

    Joined:
    3 Feb 2007
    Messages:
    487
    Likes Received:
    284
    Reputations:
    42
    Немного подправил код, т.к. винда умерла переписал под linux(прaвим config.h).

    webfile.ru/1699412
     
    #17 Ky3bMu4, 22 Jan 2008
    Last edited: 22 Jan 2008
  18. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    Как я должен это понимать? Что кто-то слишком маленький и нормальненький код не понимает или что?
     
  19. reversys

    reversys Elder - Старейшина

    Joined:
    21 Nov 2007
    Messages:
    139
    Likes Received:
    57
    Reputations:
    7
    Да все всё понимают, просто нет охоты сидеть и разбирать код сквида в свободные пол часа на работе.
    и откуда у тебя столько злости кез? :)
     
  20. bons

    bons Elder - Старейшина

    Joined:
    20 Dec 2007
    Messages:
    286
    Likes Received:
    121
    Reputations:
    21
    Code:
    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.
    
     
    1 person likes this.