📄 adwnport.pas
字号:
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 + -