⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adwnport.pas

📁 测试用例
💻 PAS
📖 第 1 页 / 共 3 页
字号:
  PutChar (Char ((TempAddress and $ff000000) shr 24));

  Output := WsSocksServerInfo.UserCode; { USERID - User ID }
  PutChar (#$00);
end;

procedure TApdCustomWinsockPort.ConnectToSocks4a;
{ Sends a socks 4a request }
var
  ErrCode     : Integer;
  TempPort    : Word;

begin
  EnableSocks4Reply;
  { Convert or lookup the port }
  Val (FWsPort, TempPort, ErrCode);
  if ErrCode <> 0 then
    TempPort := ApdSocket.LookupService (FWsPort);
  if TempPort = 0 then
    raise EApdSocketException.CreateTranslate (ADWSINVPORT, 0, 0);
  TempPort := ApdSocket.htons (TempPort);

  { Send the SOCKS 4a request }
  PutChar (#$04); { VN - Version Number }
  PutChar (#$01); { CD - Command Code - 1 }
  PutChar (Char (TempPort and $00ff)); { DSTPORT - Destination Port }
  PutChar (Char ((TempPort and $ff00) shr 8));
  PutChar (#$00); { DSTIP - Destination IP - 1 to indicate domain }
  PutChar (#$00);
  PutChar (#$00);
  PutChar (#$01);
  Output := WsSocksServerInfo.UserCode;
  PutChar (#$00);
  Output := Self.WsAddress;
  PutChar (#$00);
end;

procedure TApdCustomWinsockPort.ConnectToSocks5;
{ Sends a socks 5 request }
begin
  EnableSocks5Reply;
  PutChar (#$05); { VN - Version Number }
  PutChar (#$02); { NMETHODS - Number of authentication methods }
  PutChar (#$00); { METHODS - No authentication }
  PutChar (#$02); { METHODS - Username/Password }
end;

procedure TApdCustomWinsockPort.EnableSocks4Reply;
{ Turn on the data packet that receives the reply from a socks 4 and 4a
  request }
begin
  FConnectPacket.Enabled := False;
  FConnectPacket.StartCond := scAnyData;
  FConnectPacket.EndCond := [ecPacketSize];
  FConnectPacket.PacketSize := 8;
  FConnectPacket.OnPacket := Socks4Packet;
  FConnectPacket.Enabled := True;
end;

procedure TApdCustomWinsockPort.EnableSocks5Reply;
{ Turn on the data packet that receives the reply from a socks 5 request }
begin
  FConnectPacket.Enabled := False;
  FConnectPacket.StartCond := scAnyData;
  FConnectPacket.EndCond := [ecPacketSize];
  FConnectPacket.PacketSize := 2;
  FConnectPacket.OnPacket := Socks5Packet;
  FConnectPacket.Enabled := True;
end;

procedure TApdCustomWinsockPort.EnableSocks5UserNameReply;
{ Turns on the data packet that receives the reply from a SOCKS 5 username
  packet }
begin
  FConnectPacket.Enabled := False;
  FConnectPacket.StartCond := scAnyData;
  FConnectPacket.EndCond := [ecPacketSize];
  FConnectPacket.PacketSize := 2;
  FConnectPacket.OnPacket := Socks5UserNamePacket;
  FConnectPacket.Enabled := True;
end;

procedure TApdCustomWinsockPort.EnableSocks5RequestReply;
{ Turns on the data packet that receives the reply from a SOCKS 5 request
  packet }
begin
  FConnectPacket.Enabled := False;
  FConnectPacket.StartCond := scAnyData;
  FConnectPacket.EndCond := [ecPacketSize];
  FConnectPacket.PacketSize := 5;
  FConnectPacket.OnPacket := Socks5RequestPacket;
  FConnectPacket.Enabled := True;
end;

procedure TApdCustomWinsockPort.EnableSocks5RequestEndReply (Len : Integer);
{ Gets the last bit of the SOCKS 5 request packet }
begin
  FConnectPacket.Enabled := False;
  FConnectPacket.StartCond := scAnyData;
  FConnectPacket.EndCond := [ecPacketSize];
  FConnectPacket.PacketSize := Len;
  FConnectPacket.OnPacket := Socks5RequestEndPacket;
  FConnectPacket.Enabled := True;
end;

procedure TApdCustomWinsockPort.SendSocks5UserName;
{ Sends a user name packet to continue the SOCKS5 negotiation }
begin
  EnableSocks5UserNameReply;
  PutChar (#$05); { VER - Version Number }
  PutChar (Char (Length (WsSocksServerInfo.UserCode))); { ULEN }
  Output := WsSocksServerInfo.UserCode; { UNAME }
  PutChar (Char (Length (WsSocksServerInfo.Password))); { PLEN }
  Output := WsSocksServerInfo.Password; { PASSWD }
end;

procedure TApdCustomWinsockPort.SendSocks5Request;
{ Sends a request packet to continue the SOCKS 5 negotiation }
var
  TempAddress : DWORD;
  ErrCode     : Integer;
  TempPort    : Word;

begin
  EnableSocks5RequestReply;
  { Convert or lookup the port }
  Val (FWsPort, TempPort, ErrCode);
  if ErrCode <> 0 then
    TempPort := ApdSocket.LookupService (FWsPort);
  if TempPort = 0 then
    raise EApdSocketException.CreateTranslate (ADWSINVPORT, 0, 0);
  TempPort := ApdSocket.htons (TempPort);

  { Convert or lookup the IP address }
  if FWsAddress = '' then
    raise EApdSocketException.CreateTranslate (WSAEDESTADDRREQ, 0, 0);
  TempAddress := (ApdSocket.String2NetAddr (FWsAddress).S_addr);
  if TempAddress = INADDR_NONE then
    TempAddress := (ApdSocket.LookupName (FWsAddress).S_addr);
  if TempAddress = 0 then
    if Assigned (FOnWsError) then begin
      OnWsError (Self, ADWSCANTRESOLVE);
      Exit;
    end else
      raise EApdSocketException.CreateTranslate (ADWSCANTRESOLVE, 0, 0);

  { Send the Request packet }
  PutChar (#$05); { VER - Version Number }
  PutChar (#$01); { CMD }
  PutChar (#$00); { RSV }
  PutChar (#$01); { ATYP}
  PutChar (Char (TempAddress and $000000ff)); { DSTID - Dest IP }
  PutChar (Char ((TempAddress and $0000ff00) shr 8));
  PutChar (Char ((TempAddress and $00ff0000) shr 16));
  PutChar (Char ((TempAddress and $ff000000) shr 24));

  PutChar (Char (TempPort and $00ff)); { DSTPORT - Destination Port }
  PutChar (Char ((TempPort and $ff00) shr 8));
end;

procedure TApdCustomWinsockPort.Socks4Packet (Sender : TObject; Data : Pointer;
                                              Size : Integer);
{ Handle the socks 4/4a reply }
var
  Buffer : array[0..8] of byte;

begin
  FConnectPacket.Enabled := False;
  FSocksComplete := True;
  Move (Data^, Buffer[0], Size);
  { Interpret the reply }
  case Buffer[1] of
    90 :
      begin
        { All is ok }
      end;
    91 :
      if Assigned (FOnWsError) then 
        OnWsError (Self, ADWSREQUESTFAILED)
      else
        raise EApdSocketException.CreateTranslate (ADWSREQUESTFAILED, 0, 0);
    92 :
      if Assigned (FOnWsError) then
        OnWsError (Self, ADWSREJECTEDIDENTD)
      else
        raise EApdSocketException.CreateTranslate (ADWSREJECTEDIDENTD, 0, 0);
    93 :
      if Assigned (FOnWsError) then
        OnWsError (Self, ADWSREJECTEDUSERID)
      else
        raise EApdSocketException.CreateTranslate (ADWSREJECTEDUSERID, 0, 0);
    else
      if Assigned (FOnWsError) then
        OnWsError (Self, ADWSUNKNOWNERROR)
      else
        raise EApdSocketException.CreateTranslate (ADWSUNKNOWNERROR, 0, 0);
  end;
end;

procedure TApdCustomWinsockPort.Socks5Packet (Sender : TObject; Data : Pointer;
                                              Size : Integer);
{ Handle the socks 4/4a reply }
var
  Buffer : array[0..2] of byte;

begin
  FConnectPacket.Enabled := False;
  Move (Data^, Buffer[0], Size);
  { Interpret the reply }
  case Buffer[1] of
    00 : SendSocks5Request; { No user name needed, send the request }
    02 : SendSocks5UserName; { Username/password required - send it }
    else
      if Assigned (FOnWsError) then
        OnWsError (Self, ADWSUNKNOWNERROR)
      else
        raise EApdSocketException.CreateTranslate (ADWSUNKNOWNERROR, 0, 0);
  end;
end;

procedure TApdCustomWinsockPort.Socks5UserNamePacket (Sender : TObject;
                                                      Data : Pointer;
                                                      Size : Integer);
{ Receive and interpret the SOCKS 5 Username packet reply }                                                      
var
  Buffer : array[0..2] of byte;

begin
  FConnectPacket.Enabled := False;
  Move (Data^, Buffer[0], Size);
  { Interpret the reply }
  case Buffer[1] of
    00 : SendSocks5Request; { UserName/Password OK - send the request }
    else
      if Assigned (FOnWsError) then
        OnWsError (Self, ADWSUNKNOWNERROR)
      else
        raise EApdSocketException.CreateTranslate (ADWSUNKNOWNERROR, 0, 0);
  end;
end;

procedure TApdCustomWinsockPort.Socks5RequestPacket (Sender : TObject;
                                                     Data : Pointer;
                                                     Size : Integer);
{ Get and interpret the first part of the SOCK5 request packet reply }                                                     
var
  Buffer : array[0..5] of byte;
  Len : Integer;

begin
  Move (Data^, Buffer[0], Size);
  { Interpret the reply }
  case Buffer[1] of
    $00 : begin
            { All is OK }
          end;
    $01 :
      if Assigned (FOnWsError) then
        OnWsError (Self, ADWSSOCKSERROR)
      else
        raise EApdSocketException.CreateTranslate (ADWSSOCKSERROR, 0, 0);
    $02 :
      if Assigned (FOnWsError) then
        OnWsError (Self, ADWSCONNECTIONNOTALLOWED)
      else
        raise EApdSocketException.CreateTranslate (ADWSCONNECTIONNOTALLOWED,
                                                   0, 0);
    $03 :
      if Assigned (FOnWsError) then
        OnWsError (Self, ADWSNETWORKUNREACHABLE)
      else
        raise EApdSocketException.CreateTranslate (ADWSNETWORKUNREACHABLE,
                                                   0, 0);
    $04 :
      if Assigned (FOnWsError) then
        OnWsError (Self, ADWSHOSTUNREACHABLE)
      else
        raise EApdSocketException.CreateTranslate (ADWSHOSTUNREACHABLE, 0, 0);
    $05 :
      if Assigned (FOnWsError) then
        OnWsError (Self, ADWSREFUSED)
      else
        raise EApdSocketException.CreateTranslate (ADWSREFUSED, 0, 0);
    $06 :
      if Assigned (FOnWsError) then
        OnWsError (Self, ADWSTTLEXPIRED)
      else
        raise EApdSocketException.CreateTranslate (ADWSTTLEXPIRED, 0, 0);
    $07 :
      if Assigned (FOnWsError) then
        OnWsError (Self, ADWSBADCOMMAND)
      else
        raise EApdSocketException.CreateTranslate (ADWSBADCOMMAND, 0, 0);
    $08 :
      if Assigned (FOnWsError) then
        OnWsError (Self, ADWSBADADDRESSTYPE)
      else
        raise EApdSocketException.CreateTranslate (ADWSBADADDRESSTYPE, 0, 0);
    else
      if Assigned (FOnWsError) then
        OnWsError (Self, ADWSUNKNOWNERROR)
      else
        raise EApdSocketException.CreateTranslate (ADWSUNKNOWNERROR, 0, 0);
  end;

  { Get the rest of the request packet - trigger errors for unsupported
    address types }
  Len := 2;
  case Buffer[3] of
    $01 : Len := 5;
    $02 : Len := Byte (Buffer[4]) + 2;
    $03 :
      if Assigned (FOnWsError) then
        OnWsError (Self, ADWSUNSUPPORTEDREPLY)
      else
        raise EApdSocketException.CreateTranslate (ADWSUNSUPPORTEDREPLY, 0, 0);
    else
      if Assigned (FOnWsError) then
        OnWsError (Self, ADWSINVALIDREPLY)
      else
        raise EApdSocketException.CreateTranslate (ADWSINVALIDREPLY, 0, 0);
  end;
  
  EnableSocks5RequestEndReply (Len);
end;

procedure TApdCustomWinsockPort.Socks5RequestEndPacket (Sender : TObject;
                                                        Data : Pointer;
                                                        Size : Integer);
{ Get the rest of the SOCKS 5 request packet reply }
begin
  FConnectPacket.Enabled := False;
  FSocksComplete := True;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -