Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit ReverseSocks5Server;
- interface
- uses Socks5Types,ScktComp,Windows, SysUtils,Forms;
- type TReverseSocks5Server = class
- function Start(Settings: TReverseSocksSettings; Sockets: TPackedSockets):TPackedSockets;
- private
- procedure OnReceiveFromInternet(Sender: TObject; Socket: TCustomWinSocket);
- procedure OnReceiveFromInterface(Sender: TObject; Socket: TCustomWinSocket);
- var
- SSettings : TReverseSocksSettings;
- SSockets: TPackedSockets;
- State: Cardinal;
- buf: Array of Char;
- destTarget: Array of Byte;
- destPort: Word;
- tmpBoundAddr: String;
- tmpBoundPort: Integer;
- AuthFields: TSocksAuth;
- Methods: Array [0..255] of Byte;
- SelectedMethods: TSocksSelectedMethod;
- Request: TSocksRequest;
- TargetDataIPv4: TSocksTargetDataIPv4;
- TargetDataLengthDomain: TSocksTargetDataDomainLength;
- TargetDataDomain: TSocksTargetDataDomain;
- TargetPort: TSocksTargetPort;
- tmpTargetPort: TSocksTargetPort;
- boundtargetport: TSocksTargetPort;
- Reply: TSocksReply;
- auth: TSocksAuthes;
- Username: String;
- Password: String;
- end;
- implementation
- uses Unit1;
- function TReverseSocks5Server.Start(Settings: TReverseSocksSettings; Sockets: TPackedSockets):TPackedSockets;
- begin
- SSettings := Settings; // Set the Settings
- Sockets.InternetSocket.OnRead := Self.OnReceiveFromInternet;
- Sockets.InterfaceSocket.OnRead := Self.OnReceiveFromInterface;
- SSockets := Sockets;
- SSockets.InternetSocket := Form1.ClientSocket2;
- end;
- procedure TReverseSocks5Server.OnReceiveFromInterface(Sender: TObject; Socket: TCustomWinSocket);
- var
- I: Integer;
- begin
- if State = 0 then begin
- // SUPPORTEDMETHODS.
- Socket.ReceiveBuf(AuthFields, 2); // Receive 2 Bytes
- Socket.ReceiveBuf(Methods,AuthFields.nMethods); // Receive all the Methods
- for i := 0 to AuthFields.nMethods - 1 do begin
- if AuthFields.Methods[i] = Socks_SelectedMethod_AUTH then begin
- if ((config.Username = '') and (config.Password = '')) then begin
- // Ok have no Password but user tries to auth...
- AuthFields.nMethods := 0;
- Socket.SendBuf(AuthFields,2);
- end else begin
- AuthFields.nMethods := 2;
- Socket.SendBuf(AuthFields, 2);
- Socket.ReceiveBuf(auth, SizeOf(auth));
- if auth[0] = 1 then begin
- //get Username
- SetString(username, PChar(@auth[2]),auth[1]);
- //get Password
- SetString(password, PChar(Cardinal(@auth) + 3 + auth[1]), auth[2 + auth[1]]);
- if ((config.Username = username) and (config.password = password)) then begin
- auth[1] := 0;
- Socket.SendBuf(auth,2);
- end else begin
- auth[1] := $FF;
- Socket.SendBuf(auth,2);
- exit;
- end;
- end;
- end;
- end else
- if AuthFields.Methods[i] = SOCKS_SelectedMethod_NOAUTH then begin
- if ((config.password = '') and (config.username = '')) then begin
- AuthFields.nMethods := 0;
- Socket.SendBuf(AuthFields, 2);
- end else begin
- AuthFields.nMethods := $FF;
- Socket.SendBuf(AuthFields, 2);
- exit;
- end;
- end else
- if i = AuthFields.nMethods then begin
- AuthFields.nMethods := $FF;
- Socket.SendBuf(AuthFields, 2);
- exit;
- end;
- end;
- // Answering with the Selected Methods
- SelectedMethods.Version := 5; // SOCKS 5!!
- SelectedMethods.Method := SOCKS_SelectedMethod_NOAUTH;
- Socket.SendBuf(SelectedMethods, SizeOf(SelectedMethods));
- State := 2;
- end
- else if State = SOCKS_AUTHSTATE_request then begin
- Socket.ReceiveBuf(Request, 4); // Receive 4 Bytes
- if Request.AddressType = SOCKS_Addresstype_IPv4 then begin
- // IPv4 Adress is requested
- Socket.ReceiveBuf(TargetDataIPv4, 4); // Receive 4 Bytes
- SetLength(desttarget, 4);
- CopyMemory(@desttarget,@TargetDataIPv4.destAddress,Length(destTarget));
- end
- else if Request.AddressType = SOCKS_Addresstype_Domain then begin
- // Domain Name is required
- Socket.ReceiveBuf(TargetDataLengthDomain, 1);
- SetLength(TargetDataDomain.destAddress,TargetDataLengthDomain.destAddressLength);
- Socket.ReceiveBuf(TargetDataDomain.destAddress[0], Length(TargetDataDomain.destAddress));
- SetLength(desttarget, Length(TargetDataDomain.destAddress));
- CopyMemory(@destTarget, @TargetDataDomain.destAddress, Length(destTarget))
- end;
- State := 3;
- end
- else if State = SOCKS_AUTHSTATE_req_allowed then begin
- if not(SizeOf(desttarget) = 0) then begin
- Socket.ReceiveBuf(TargetPort, 2);
- // Invert Port
- tmpTargetPort := TargetPort;
- TargetPort.destPort[1] := tmpTargetPort.destPort[0];
- TargetPort.destPort[0] := tmpTargetPort.destPort[1];
- CopyMemory(@destPort,@TargetPort.destPort,2);
- SSockets.InternetSocket.Host := String(desttarget);
- // SSockets.InternetSocket.Host := 'google.com';
- SSockets.InternetSocket.Port := destPort;
- // SSockets.InternetSocket.Open;
- // SSockets.InternetSocket.Active := true;
- { Form1.ClientSocket2.Host := String(desttarget);
- Form1.ClientSocket2.Port := destPort;}
- Form1.ClientSocket2.Open;
- Request.Command := 0;
- Request.Version := 5;
- Request.AddressType := SOCKS_AddressType_IPv4;
- Request.Reserved := 0;
- Socket.SendBuf(Request, 10);
- Reply.Version := 5;
- Reply.ReplyType := SOCKS_ReplyType_Success;
- Reply.Reserved := 0;
- Reply.AddressType := SOCKS_AddressType_IPv4;
- // Hier verzweifle ich : LocalAddress = "" LocalPort = -1...
- tmpBoundAddr := SSockets.InternetSocket.Socket.LocalAddress;
- CopyMemory(@Reply.sBoundAddr, @tmpBoundAddr, 4);
- tmpBoundPort := SSockets.InternetSocket.Socket.LocalPort;
- CopyMemory(@tmpTargetPort,@tmpBoundPort, 2);
- boundtargetPort.destport[0] := tmpTargetPort.destPort[1];
- boundtargetPort.destport[1] := tmpTargetPort.destPort[0];
- CopyMemory(@Reply.sBoundPort,@BoundTargetPort.DestPort, 2);
- State := SOCKS_AUTHSTATE_Tunneling;
- end; // Error in Connection (perhaps tryed IPv6?)
- end
- else if State = SOCKS_AUTHSTATE_Tunneling then begin
- // Tunneling Work
- if ((SSockets.InternetSocket.Active) and (SSockets.InterfaceSocket.Active)) then begin
- // Dies tritt fast nie auf da InternetSocket nicht Active ist :[
- i := Socket.ReceiveLength;
- SetLength(buf, i);
- Socket.ReceiveBuf(buf[0], i);
- SSockets.InternetSocket.Socket.SendBuf(buf[0], i);
- end;
- end;
- end;
- procedure TReverseSocks5Server.OnReceiveFromInternet(Sender: TObject; Socket: TCustomWinSocket);
- var
- len: Integer;
- begin
- // Real Socks bekommt nachricht vom InternetZ
- len := Socket.ReceiveLength;
- SetLength(buf, len);
- Socket.ReceiveBuf(buf[0], len);
- SSockets.InterfaceSocket.Socket.SendBuf(buf[0], len);
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement