Конференция "Сети" » Socks5 клиент, как состряпать запрос ? [D7, Win2k, WinXP]
 
  • AHTOLLlKA (08.07.08 09:37) [0]
    инжекюсь в приложение, делаю хук на connect

    и пытаюсь переправить программу через sock5 прокси сервер (в программе нет возможности указать чтобы она работала через прокси, вот и приходиться)
    вобщем аналог фрикапа...
    на сокс4 все сделал.. работало а на сокс5 не могу..
    вот функция.. которой подменяю connect

    function hconnect(s:dword;sain:PSockAddrIn;slen:integer):integer;stdcall;
    var
    sh5:TSocks5Header;
    sh50:TSocks5Header0;
       uname:string;
       s2in:sockaddr_in;
       prxy_a:string;
       prxy_p:word;
       buff:array[0..16]of char;
       i:dword;

    begin

    ZeroMemory(@sh50,sizeof(tsocks5header0));
    CopyMemory(@s2in,sain,sizeof(s2in));

    ZeroMemory(@sh5,sizeof(TSocks5Header));

     prxy_p:=31337;
     prxy_a:='127.0.0.1';
     s2in.sin_addr.S_addr:=inet_addr(pchar(prxy_a));
     s2in.sin_port:=htons(prxy_p);

     UnHookCodeHook(@rd_c);
     result:=connect(s,s2in,slen);

     SetCodeHook(rd_c.Address,@hconnect,@rd_c);
     i:=GetLastError;

    if conn=true then
    begin
    conn:=false;
     sh50.VER:=$05;
     sh50.NMETHODS:=$01;
     sh50.METHODS:=$00;

     send(s,sh50,sizeof(tsocks5header0),0);
     sleep(100);
     recv(s,sh50,sizeof(tsocks5header0),0);

    end;

     if sh50.VER=$05 then
     begin
     sh5.VER:=$05;
     sh5.CMD:=$01;
     sh5.RSV:=$00;
     sh5.ATYP:=$01;
     sh5.dIP:=sain^.sin_addr;
     sh5.wPort:=sain^.sin_port;

     send(s,sh5,sizeof(tsocks5header),0);
     sleep(100);
     recv(s,sh5,sizeof(tsocks5header),0);

     end;
    end;



    кто тыкнет в недочет ?? почему не работает ? вроде как в рфц указано сделал..
  • Slym © (08.07.08 11:34) [1]
    0. как делал перехват
    1.sleep(100);
    ПЛОХО, не надо спать - надо дело делать

    2.не приведено описалово TSocks5Header и TSocks5Header0
  • umbra © (08.07.08 11:34) [2]

    > TSocks5Header0

    а что это за зверь? и какой ответ получаете от прокси?
  • Slym © (08.07.08 11:34) [3]
    добейся чтоб без перехватов работало, а уж потом инжекся в жертву
  • Slym © (08.07.08 11:54) [4]
    AHTOLLlKA   (08.07.08 9:37)
    send(s,sh5,sizeof(tsocks5header),0);
    recv(s,sh5,sizeof(tsocks5header),0);

    ответ может быть другой длинны: например BND.ADDR вернется $03-доменное_имя, а не IP...
    т.е. выкачиваешь не весь пакет и огрызок достается приложению-жертве
  • AHTOLLlKA (08.07.08 12:10) [5]
    спасибо всем за ответы, привожу остальной код..

    unit Soxify;

    interface

    uses
     windows,
     StrUtils,
     splicing,
     sysutils,
     winsock;

    type

     TSocks5Header0 = packed record
       VER: byte;
       NMETHODS: byte;
       METHODS: byte;
     end;

     TSocks5Header = packed record
       VER: byte;
       CMD: byte;
       RSV: byte;
       ATYP: byte;
       dIP: in_addr;
       wPort: word;
       lbyte:byte;// <-- Null
     end;

    var
     ppt: string;{proxyperthr}
     rd_S,rd_R,rd_c:TFunctionRestoreData;
    conn:boolean=true;

    function hconnect(s:dword;sain:PSockAddrIn;slen:integer):integer;stdcall;
    function set_curr_sock(sock:string):bool;
    function go_soxify:bool;
    function go_sniff:bool;

    implementation

    function str2int( S: PChar ): Integer;
    var M : Integer;
    begin
      Result := 0;
      if S = '' then Exit;
      M := 1;
      if S^ = '-' then
      begin
         M := -1;
         Inc( S );
      end
        else
      if S^ = '+' then
        Inc( S );
      while S^ in [ '0'..'9' ] do
      begin
         Result := Result * 10 + Integer( S^ ) - Integer( '0' );
         Inc( S );
      end;
      if M < 0 then
         Result := -Result;
    end;

    function hconnect(s:dword;sain:PSockAddrIn;slen:integer):integer;stdcall;
    var
    sh5:TSocks5Header;
    sh50:TSocks5Header0;
       uname:string;
       s2in:sockaddr_in;
       prxy_a:string;
       prxy_p:word;
       buff:array[0..16]of char;
       i:dword;

    begin

    ZeroMemory(@sh50,sizeof(tsocks5header0));
    CopyMemory(@s2in,sain,sizeof(s2in));

    ZeroMemory(@sh5,sizeof(TSocks5Header));

     prxy_p:=31337;
     prxy_a:='127.0.0.1';
     s2in.sin_addr.S_addr:=inet_addr(pchar(prxy_a));
     s2in.sin_port:=htons(prxy_p);

     UnHookCodeHook(@rd_c);
     result:=connect(s,s2in,slen);

     SetCodeHook(rd_c.Address,@hconnect,@rd_c);
     i:=GetLastError;

    if conn=true then
    begin
    conn:=false;
     sh50.VER:=$05;
     sh50.NMETHODS:=$01;
     sh50.METHODS:=$00;

     send(s,sh50,sizeof(tsocks5header0),0);
     sleep(100);
     recv(s,sh50,sizeof(tsocks5header0),0);

    end;

     if sh50.VER=$05 then
     begin
     sh5.VER:=$05;
     sh5.CMD:=$01;
     sh5.RSV:=$00;
     sh5.ATYP:=$01;
     sh5.dIP:=sain^.sin_addr;
     sh5.wPort:=sain^.sin_port;


     send(s,sh5,sizeof(tsocks5header),0);
     sleep(100);
     recv(s,sh5,sizeof(tsocks5header),0);

     end;

    end;

    function go_soxify:bool;
    begin

     splicing.SetProcedureHook(GetModuleHandle('wsock32'),'connect',@hconnect,@rd_c);
    end;

    function set_curr_sock(sock:string):bool;
    begin  ppt:=sock;
    end;

    function hsend(s:dword;buffer:pchar;blen:dword;flags:dword):integer;stdcall;
    begin
     sleep(100);
     UnHookCodeHook(@rd_S);
     result:=send(s,buffer^,blen,flags);
     SetCodeHook(rd_S.Address,@hsend,@rd_s);
     DeleteFile('blia');
    end;

    function hrecv(s:dword;buffer:pchar;blen:DWORD;flags:dword):integer;stdcall;
    begin

     UnHookCodeHook(@rd_r);
     result:=recv(s,buffer^,blen,flags);
     SetCodeHook(rd_r.Address,@hrecv,@rd_r);

    end;

    function go_sniff:bool;
    begin
       if not splicing.SetProcedureHook(GetModuleHandle('ws2_32'),'send',@hsend,@rd_S)then
       if not splicing.SetProcedureHook(GetModuleHandle('wsock32.dll'),'send',@send,@rd_R) then
         messagebeep(MB_ICONWARNING);
         
       if not splicing.SetProcedureHook(GetModuleHandle('wsock32.dll'),'recv',@hrecv,@rd_R) then
       if not splicing.SetProcedureHook(GetModuleHandle('ws2_32.dll'),'recv',@hrecv,@rd_R) then
         messagebeep(MB_ICONWARNING);
    end;

    end.



    это unit который собственно все и делает
  • AHTOLLlKA (08.07.08 12:14) [6]

    > Slym ©

    интересно, только не пойму вроде с сокс4 так работало..  сижу еще читаю рфц
  • umbra © (08.07.08 12:23) [7]

    >  send(s,sh50,sizeof(tsocks5header0),0);
    >  sleep(100);
    >  recv(s,sh50,sizeof(tsocks5header0),0);

    неплохо бы проверять, какое значение вернула recv


    >
    >  if sh50.VER=$05 then

    а почему не проверяете второй байт? может там $FF?

    И скажите все-таки, на какой стадии происходит затык?
  • AHTOLLlKA (08.07.08 12:36) [8]

    > >  if sh50.VER=$05 thenа почему не проверяете второй байт?
    >  может там $FF?

     if (sh50.VER=$05) and (sh50.NMETHODS=$00) then


    мне так или иначе нужен конект без авторизации так что буду на 00 проверять
    все проходит дальше..


    > И скажите все-таки, на какой стадии происходит затык?


    авторизация как я помян у меня происходт успешно.. вот дальнейший конект не работает, теость приложение не работает по сети
  • Slym © (08.07.08 12:49) [9]
    1. зачем Rcv/Snd перехватываешь?
    2. Сплайсинг похоже через таблицу импорта... тогда зачем каждый раз UnHookCodeHook, утебя есть реальная точка входа в функцию
    3. send/recv всетаки не процедуры, а функции - нет проверки на результаты вызова
    4. sleep(100); - зочем?
    5 вроде с сокс4 так работало - скорее всего и продолжает, но RFC не обязывает, и мы низнаем что за прокси и как там реализовано
  • umbra © (08.07.08 12:50) [10]

    > TSocks5Header = packed record
    >    VER: byte;
    >    CMD: byte;
    >    RSV: byte;
    >    ATYP: byte;
    >    dIP: in_addr;
    >    wPort: word;
    >    lbyte:byte;// <-- Null
    >  end;


    откуда lbyte? он вроде как не предусмотрен :)
  • AHTOLLlKA (08.07.08 12:53) [11]
    Slym ©   сиукни в аську 909021 пожалуста, если не сложно..
  • AHTOLLlKA (08.07.08 12:54) [12]

    > откуда lbyte? он вроде как не предусмотрен :)

    ога ога в 4ом предусмотрен, но если собирать хедер без него.. я хз почему не пашет.. может я наркаман ?7
  • Slym © (08.07.08 13:00) [13]
    AHTOLLlKA   (08.07.08 12:53) [11]
    забанен :(
    AHTOLLlKA   (08.07.08 12:54) [12]
    может я наркаман

    может проверять после каждого шага...
  • AHTOLLlKA (08.07.08 13:04) [14]

    > AHTOLLlKA   (08.07.08 12:53) [11]забанен :(

    мм-м-м- ?
  • AHTOLLlKA (08.07.08 13:05) [15]

    > 1. зачем Rcv/Snd перехватываешь?

    а как еще можно то перехватить конект
  • AHTOLLlKA (08.07.08 13:07) [16]

    > и мы низнаем что за прокси и как там реализовано

    фрикап с этим прокси работает без проблем...
  • AHTOLLlKA (08.07.08 13:26) [17]
    если кто хочет подзаработать немношко $ велкам в асю 909021
  • Slym © (08.07.08 13:34) [18]
    вот накатал... но не проверял
    function hconnect(s: TSocket; var name: TSockAddr; namelen: Integer):integer;stdcall;
    type TConnectProc= function (s: TSocket; var name: TSockAddr; namelen: Integer): Integer; stdcall;
    type
     TSocks5AuthReq = packed record
       VER,NMETHODS,METHODS: byte;
     end;
     TSocks5AuthResp = packed record
       VER,METHOD: byte;
     end;
    const
     Socks5AuthReqDef:TSocks5AuthReq=(VER:$5;NMETHODS:$1;METHODS:$0);

    type
     TSocks5Cmd = packed record
       VER, CMD, RSV, ATYP: byte;
       dIP: in_addr;
       wPort: word;
     end;

    var
     s2in:sockaddr_in;
     AuthResp:TSocks5AuthResp;
     Cmd:TSocks5Cmd;
    begin
     try
       s2in.sin_family := PF_INET;
       s2in.sin_addr.S_addr:=inet_addr(pchar('127.0.0.1'));
       s2in.sin_port:=htons(31337);

       result:=TConnectProc(rd_c)(s,s2in,SizeOf(s2in));
       if result=SOCKET_ERROR then exit;

       if send(s,(@Socks5AuthReqDef)^,sizeof(Socks5AuthReqDef),0)<>sizeof(Socks5AuthReqDef ) then
         Abort;
       if recv(s,AuthResp,sizeof(AuthResp),0)<>sizeof(AuthResp) then
         Abort;
       if (AuthResp.VER<>$05) or (AuthResp.METHOD=$00) then
         Abort;

       with Cmd do
       begin
         VER:=$05;
         CMD:=$01;
         RSV:=$00;
         ATYP:=$01;
         dIP:=name.sin_addr;
         wPort:=name.sin_port;
       end;

       if send(s,(@Cmd)^,sizeof(Cmd),0)<>sizeof(Cmd) then
         Abort;
       if recv(s,(@Cmd)^,sizeof(Cmd),0)<>sizeof(Cmd) then
         Abort;
       if Cmd.CMD<>0 then
         Abort;

     except
       shutdown(s,SD_BOTH);
       closesocket(s);
       result:=SOCKET_ERROR;
     end;
    end;

  • AHTOLLlKA (08.07.08 14:17) [19]
    пасиба, но как бэ код примерный мжно найти в
    Source\Indy\IdSocks.pas

    procedure TIdSocksInfo.MakeSocks5Connection(const AHost: string; const APort: Integer);
    var
     len, pos: Integer;
     tempBuffer: array [0..255] of Byte;
     ReqestedAuthMethod,
     ServerAuthMethod: Byte;
     tempPort: Word;
    begin
     // defined in rfc 1928
     if Authentication = saNoAuthentication then begin
       tempBuffer[2] := $0   // No authentication
     end else begin
       tempBuffer[2] := $2;  // Username password authentication
     end;

     ReqestedAuthMethod := tempBuffer[2];
     tempBuffer[0] := $5;     // socks version
     tempBuffer[1] := $1;     // number of possible authentication methods

     len := 2 + tempBuffer[1];
     FIOHandler.Send(tempBuffer, len);
     try
       FIOHandler.Recv(tempBuffer, 2); // Socks server sends the selected authentication method
     except
       On E: Exception do begin
         raise EIdSocksServerRespondError.Create(RSSocksServerRespondError);
       end;
     end;

     ServerAuthMethod := tempBuffer[1];
     if (ServerAuthMethod <> ReqestedAuthMethod) or (ServerAuthMethod = $FF) then begin
       raise EIdSocksAuthMethodError.Create(RSSocksAuthMethodError);
     end;

     // Authentication process
     if Authentication = saUsernamePassword then begin
       tempBuffer[0] := 1; // version of subnegotiation
       tempBuffer[1] := Length(Username);
       pos := 2;
       if Length(Username) > 0 then begin
         Move(Username[1], tempBuffer[pos], Length(Username));
       end;
       pos := pos + Length(Username);
       tempBuffer[pos] := Length(Password);
       pos := pos + 1;
       if Length(Password) > 0 then begin
         Move(Password[1], tempBuffer[pos], Length(Password));
       end;
       pos := pos + Length(Password);

       FIOHandler.Send(tempBuffer, pos); // send the username and password
       try
         FIOHandler.Recv(tempBuffer, 2);    // Socks server sends the authentication status
       except
         On E: Exception do begin
           raise EIdSocksServerRespondError.Create(RSSocksServerRespondError);
         end;
       end;

       if tempBuffer[1] <> $0 then begin
         raise EIdSocksAuthError.Create(RSSocksAuthError);
       end;
     end;

     // Connection process
     tempBuffer[0] := $5;   // socks version
     tempBuffer[1] := $1;   // connect method
     tempBuffer[2] := $0;   // reserved
     // for now we stick with domain name, must ask Chad how to detect
     // address type
     tempBuffer[3] := $3;   // address type: IP V4 address: X'01'    {Do not Localize}
                            //               DOMAINNAME:    X'03'    {Do not Localize}
                            //               IP V6 address: X'04'    {Do not Localize}
     // host name
     tempBuffer[4] := Length(AHost);
     pos := 5;
     if Length(AHost) > 0 then begin
       Move(AHost[1], tempBuffer[pos], Length(AHost));
     end;
     pos := pos + Length(AHost);
     // port
     tempPort := GStack.WSHToNs(APort);
     Move(tempPort, tempBuffer[pos], SizeOf(tempPort));
     pos := pos + 2;

     FIOHandler.Send(tempBuffer, pos); // send the connection packet
     try
       FIOHandler.Recv(tempBuffer, 5);    // Socks server replies on connect, this is the first part
     except
       raise EIdSocksServerRespondError.Create(RSSocksServerRespondError);
     end;

     case tempBuffer[1] of
       0: ;// success, do nothing
       1: raise EIdSocksServerGeneralError.Create(RSSocksServerGeneralError);
       2: raise EIdSocksServerPermissionError.Create(RSSocksServerPermissionError);
       3: raise EIdSocksServerNetUnreachableError.Create(RSSocksServerNetUnreachableError);
       4: raise EIdSocksServerHostUnreachableError.Create(RSSocksServerHostUnreachableError);
       5: raise EIdSocksServerConnectionRefusedError.Create(RSSocksServerConnectionRefusedError) ;
       6: raise EIdSocksServerTTLExpiredError.Create(RSSocksServerTTLExpiredError);
       7: raise EIdSocksServerCommandError.Create(RSSocksServerCommandError);
       8: raise EIdSocksServerAddressError.Create(RSSocksServerAddressError);
       else
          raise EIdSocksUnknownError.Create(RSSocksUnknownError);
     end;

     // type of destination address is domain name
     case tempBuffer[3] of
       // IP V4
       1: len := 4 + 2; // 4 is for address and 2 is for port length
       // FQDN
       3: len := tempBuffer[4] + 2; // 2 is for port length
       // IP V6
       4: len := 16 + 2; // 16 is for address and 2 is for port length
     end;

     try
       // Socks server replies on connect, this is the seconf part
       FIOHandler.Recv(tempBuffer[5], len-1);
     except
       raise EIdSocksServerRespondError.Create(RSSocksServerRespondError);
     end;
    end;



    проглядел вроде по идее так же... хз
  • AHTOLLlKA (10.07.08 08:33) [20]
    уф.. добрался до компа..
    вобщем делаю так потом

     if (sh50.VER=$05) and (sh50.NMETHODS=$00) then
     begin
     sh5.VER:=$05;
     sh5.CMD:=$01;
     sh5.RSV:=$00;
     sh5.ATYP:=$01;
     sh5.dIP:=sain.sin_addr;
     sh5.wPort:=sain.sin_port;

     send(s,sh5,sizeof(tsocks5header),0);
     sleep(100);
     recv(s,sh5,sizeof(tsocks5header),0);

     if sh5.cmd=$00 then messagebox(0,'sh5.cmd=$00','',0);
     if sh5.cmd=$01 then messagebox(0,'sh5.cmd=$01','',0);
     if sh5.cmd=$02 then messagebox(0,'sh5.cmd=$02','',0);
     if sh5.cmd=$03 then messagebox(0,'sh5.cmd=$03','',0);
     if sh5.cmd=$04 then messagebox(0,'sh5.cmd=$04','',0);
     if sh5.cmd=$05 then messagebox(0,'sh5.cmd=$05','',0);
     if sh5.cmd=$06 then messagebox(0,'sh5.cmd=$06','',0);
     if sh5.cmd=$07 then messagebox(0,'sh5.cmd=$07','',0);
     if sh5.cmd=$08 then messagebox(0,'sh5.cmd=$08','',0);
     if sh5.cmd=$09 then messagebox(0,'sh5.cmd=$09','',0);
     end;



    срабатывает $01
    теость
    o  X'01' ошибка SOCKS-сервера

    блин... как так =((
  • Slym © (10.07.08 10:50) [21]
    попробуй передать ip адрес как в [19] посте:
    function hconnect(s: TSocket; var name: TSockAddr; namelen: Integer):integer;stdcall;
    type TConnectProc= function (s: TSocket; var name: TSockAddr; namelen: Integer): Integer; stdcall;
    type
    TSocks5AuthReq = packed record
      VER,NMETHODS,METHODS: byte;
    end;
    TSocks5AuthResp = packed record
      VER,METHOD: byte;
    end;
    const
    Socks5AuthReqDef:TSocks5AuthReq=(VER:$5;NMETHODS:$1;METHODS:$0);
    var
    s2in:sockaddr_in;
    AuthResp:TSocks5AuthResp;
    Cmd:array[0..255] of byte;
    CmdLen:integer;
    Host:string;
    begin
    try
      s2in.sin_family := PF_INET;
      s2in.sin_addr.S_addr:=inet_addr(pchar('127.0.0.1'));
      s2in.sin_port:=htons(31337);

      result:=TConnectProc(rd_c)(s,s2in,SizeOf(s2in));
      if result=SOCKET_ERROR then exit;
      if send(s,(@Socks5AuthReqDef)^,sizeof(Socks5AuthReqDef),0)<>sizeof(Socks5AuthReqDef  ) then
        Abort;
      if recv(s,AuthResp,sizeof(AuthResp),0)<>sizeof(AuthResp) then
        Abort;
      if (AuthResp.VER<>$05) or (AuthResp.METHOD=$00) then
        Abort;

      Host:=inet_ntoa(name.sin_addr);
      Cmd[0] := $5;   // socks version
      Cmd[1] := $1;   // connect method
      Cmd[2] := $0;   // reserved
      Cmd[3] := $3;   // address type: IP V4 address: X'01'    {Do not Localize}
      Cmd[4] := Length(Host);
      if Length(Host)>0 then
        Move(Host[1], Cmd[5], Length(Host));
      PWord(@Cmd[5+Cmd[4]]):=name.sin_port;
      CmdLen:=5+Cmd[4]+SizeOf(Word);

      if send(s,(@Cmd)^,sizeof(CmdLen),0)<>sizeof(CmdLen) then
        Abort;
      if recv(s,(@Cmd)^,5,0)<>sizeof(5) then
        Abort;
      if Cmd[1]<>0 then
        Abort;
      case Cmd[3] of
       1: CmdLen := 4 + 2;
       3: CmdLen := Cmd[4]+2;
       4: CmdLen := 16 + 2;
      end;
      if recv(s,(@Cmd[5])^,CmdLen,0)<>CmdLen then
        Abort;

    except
      shutdown(s,SD_BOTH);
      closesocket(s);
      result:=SOCKET_ERROR;
    end;
    end;

  • umbra © (10.07.08 10:58) [22]
    а логи сервера почитать? :)
  • AHTOLLlKA (10.07.08 10:59) [23]
     result:=TConnectProc(rd_c)(s,s2in,SizeOf(s2in));


    Invalid typecast

    PWord(@Cmd[5+Cmd[4]]):=name.sin_port;


    Left side cannot be assegned to
  • AHTOLLlKA (10.07.08 11:51) [24]

    > umbra ©   (10.07.08 10:58) [22]
    > а логи сервера почитать? :)

    эм.. сервер тож примитивный, щас попробую добавть логирование ;)
  • Slym © (11.07.08 04:58) [25]
    AHTOLLlKA   (10.07.08 10:59) [23]
    result:=TConnectProc(rd_c)(s,s2in,SizeOf(s2in));

    Замени на свой способ вызова "реальной" функции
    AHTOLLlKA   (10.07.08 10:59) [23]
    PWord(@Cmd[5+Cmd[4]]):=name.sin_port; Left side cannot be assegned to

    PWord(@Cmd[5+Cmd[4]])^:=name.sin_port; а так?
    или
    Move(Host[1], @name.sin_port, SizeOf(Word));
  • Slym © (11.07.08 05:00) [26]
    Slym ©   (11.07.08 4:58) [25]
    Move(Host[1], @name.sin_port, SizeOf(Word));

    в "блокноте" писал... надо:
    Move(name.sin_port, Cmd[5+Cmd[4]], SizeOf(Word));
  • AHTOLLlKA (11.07.08 09:21) [27]
    =( что то не помогает ((
    теперь без ошибок.. но все равно не конект ((
  • Slym © (11.07.08 11:59) [28]
    Тогда брать портмап или снифер, натравливать FreeCap и потом анализировать "заранее верный" поток данных фрикапа
  • Slym © (11.07.08 12:01) [29]
    Slym ©   (11.07.08 11:59) [28]
    либо ты недокациваешь/перекачиваешь ответ прокселя...
     case Cmd[3] of
      1: CmdLen := 4 + 2;
      3: CmdLen := Cmd[4]+2;
      4: CmdLen := 16 + 2;
     end;
     if recv(s,(@Cmd[5])^,CmdLen,0)<>CmdLen then
       Abort;

  • AHTOLLlKA (11.07.08 13:33) [30]
    отснифал..
    проблема с пакетом..
    авторизация правельная..
    а вот это место ..
    sh5.VER:=$05;
    sh5.CMD:=$01;
    sh5.RSV:=$00;
    sh5.ATYP:=$01;
    sh5.dIP:=sain.sin_addr;
    sh5.wPort:=sain.sin_port;



    если конект через прокси.. то шлеться так
    05 01 00 03 0D 6C 6F 67 69 6E 2E 69 63 71 2E 63 6F 6D 14 46

    а если через мой запрос то так
    05 01 00 01 40 0C C8 59 14 46 00
  • AHTOLLlKA (15.07.08 14:04) [31]
    Апну, немогу все еще разобраться, не хватает мне мозгов, никто ни чего не придумал ?
  • Slym © (16.07.08 08:52) [32]
    AHTOLLlKA   (11.07.08 13:33) [30]
    разница в:
    1. типе - buf[3]: у тебя 1(IP), у людей 3(Domain Name)
    2. после порта лишний #0
    попробуй Slym ©   (10.07.08 10:50) [21]
    и будет тебе конект login.icq.com:5190
  • AHTOLLlKA (17.07.08 13:10) [33]
    05 01 00 03 40 0C A1 B9 14 46
    щас такой запрос.. все равно ничего ..
  • Eraser © (18.07.08 15:47) [34]
    > [0] AHTOLLlKA   (08.07.08 09:37)

    в Indy есть нужный компонент, посмотри как сделано и сделай так же.
  • Slym © (21.07.08 14:05) [35]
    1. он уже смотрел в инди...
    AHTOLLlKA   (17.07.08 13:10) [33]
    05 01 00 03

    и не будет :) он ждет строку а не упакованый в Int ip адрес
    ты ему имя или адрес в виде строки отдай а не упакованый ip
    Slym ©   (10.07.08 10:50) [21]
    Host:=inet_ntoa(name.sin_addr);
     Cmd[0] := $5;   // socks version
     Cmd[1] := $1;   // connect method
     Cmd[2] := $0;   // reserved
     Cmd[3] := $3;   // address type: IP V4 address: X'01'    {Do not Localize}
     Cmd[4] := Length(Host);
     if Length(Host)>0 then
       Move(Host[1], Cmd[5], Length(Host));
     PWord(@Cmd[5+Cmd[4]]):=name.sin_port;
     CmdLen:=5+Cmd[4]+SizeOf(Word);
  • имя (15.03.09 12:46) [36]
    Удалено модератором
  • имя (15.03.09 12:49) [37]
    Удалено модератором
 
Конференция "Сети" » Socks5 клиент, как состряпать запрос ? [D7, Win2k, WinXP]
Есть новые Нет новых   [134435   +33][b:0][p:0.016]