Advertisement
Guest User

Untitled

a guest
May 27th, 2017
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 7.40 KB | None | 0 0
  1. unit ReverseSocks5Server;
  2.  
  3. interface
  4. uses Socks5Types,ScktComp,Windows, SysUtils,Forms;
  5.  
  6.  
  7. type TReverseSocks5Server = class
  8.     function Start(Settings: TReverseSocksSettings; Sockets: TPackedSockets):TPackedSockets;
  9.   private
  10.     procedure OnReceiveFromInternet(Sender: TObject; Socket: TCustomWinSocket);
  11.     procedure OnReceiveFromInterface(Sender: TObject; Socket: TCustomWinSocket);
  12. var
  13. SSettings : TReverseSocksSettings;
  14. SSockets: TPackedSockets;
  15. State: Cardinal;
  16. buf: Array of Char;
  17.  
  18. destTarget: Array of Byte;
  19. destPort: Word;
  20.  
  21. tmpBoundAddr: String;
  22. tmpBoundPort: Integer;
  23.  
  24. AuthFields: TSocksAuth;
  25. Methods: Array [0..255] of Byte;
  26. SelectedMethods: TSocksSelectedMethod;
  27. Request: TSocksRequest;
  28. TargetDataIPv4: TSocksTargetDataIPv4;
  29. TargetDataLengthDomain: TSocksTargetDataDomainLength;
  30. TargetDataDomain: TSocksTargetDataDomain;
  31. TargetPort: TSocksTargetPort;
  32. tmpTargetPort: TSocksTargetPort;
  33. boundtargetport: TSocksTargetPort;
  34. Reply: TSocksReply;
  35.  
  36. auth: TSocksAuthes;
  37.  
  38. Username: String;
  39. Password: String;
  40. end;
  41.  
  42. implementation
  43. uses Unit1;
  44.  
  45. function TReverseSocks5Server.Start(Settings: TReverseSocksSettings; Sockets: TPackedSockets):TPackedSockets;
  46. begin
  47.   SSettings := Settings; // Set the Settings
  48.  
  49.   Sockets.InternetSocket.OnRead := Self.OnReceiveFromInternet;
  50.   Sockets.InterfaceSocket.OnRead := Self.OnReceiveFromInterface;
  51.  
  52.   SSockets := Sockets;
  53.   SSockets.InternetSocket := Form1.ClientSocket2;
  54. end;
  55.  
  56. procedure TReverseSocks5Server.OnReceiveFromInterface(Sender: TObject; Socket: TCustomWinSocket);
  57. var
  58. I: Integer;
  59. begin
  60.    if State = 0 then begin
  61.       // SUPPORTEDMETHODS.
  62.        Socket.ReceiveBuf(AuthFields, 2); // Receive 2 Bytes
  63.        Socket.ReceiveBuf(Methods,AuthFields.nMethods); // Receive all the Methods
  64.  
  65.        for i := 0 to AuthFields.nMethods - 1 do begin
  66.          if AuthFields.Methods[i] = Socks_SelectedMethod_AUTH then begin
  67.            if ((config.Username = '') and (config.Password = '')) then begin
  68.              // Ok have no Password but user tries to auth...
  69.              AuthFields.nMethods := 0;
  70.              Socket.SendBuf(AuthFields,2);
  71.            end else begin
  72.              AuthFields.nMethods := 2;
  73.              Socket.SendBuf(AuthFields, 2);
  74.              Socket.ReceiveBuf(auth, SizeOf(auth));
  75.  
  76.              if auth[0] = 1 then begin
  77.                 //get Username
  78.                 SetString(username, PChar(@auth[2]),auth[1]);
  79.                 //get Password
  80.                 SetString(password, PChar(Cardinal(@auth) + 3 + auth[1]), auth[2 + auth[1]]);
  81.  
  82.                 if ((config.Username = username) and (config.password = password)) then begin
  83.                   auth[1] := 0;
  84.                   Socket.SendBuf(auth,2);
  85.                 end else begin
  86.                   auth[1] := $FF;
  87.                   Socket.SendBuf(auth,2);
  88.                   exit;
  89.                 end;
  90.              end;
  91.            end;
  92.          end else
  93.         if AuthFields.Methods[i] = SOCKS_SelectedMethod_NOAUTH then begin
  94.           if ((config.password = '') and (config.username = '')) then begin
  95.             AuthFields.nMethods := 0;
  96.             Socket.SendBuf(AuthFields, 2);
  97.           end else begin
  98.             AuthFields.nMethods := $FF;
  99.             Socket.SendBuf(AuthFields, 2);
  100.             exit;
  101.           end;
  102.           end else
  103.  
  104.           if i = AuthFields.nMethods then begin
  105.             AuthFields.nMethods := $FF;
  106.             Socket.SendBuf(AuthFields, 2);
  107.             exit;
  108.           end;
  109.  
  110.        end;
  111.  
  112.  
  113.        // Answering with the Selected Methods
  114.        SelectedMethods.Version := 5; // SOCKS 5!!
  115.        SelectedMethods.Method := SOCKS_SelectedMethod_NOAUTH;
  116.  
  117.         Socket.SendBuf(SelectedMethods, SizeOf(SelectedMethods));
  118.  
  119.       State := 2;
  120.     end
  121.  
  122.     else if State = SOCKS_AUTHSTATE_request then begin
  123.         Socket.ReceiveBuf(Request, 4); // Receive 4 Bytes
  124.  
  125.         if Request.AddressType = SOCKS_Addresstype_IPv4 then begin
  126.           // IPv4 Adress is requested
  127.           Socket.ReceiveBuf(TargetDataIPv4, 4); // Receive 4 Bytes
  128.  
  129.           SetLength(desttarget, 4);
  130.           CopyMemory(@desttarget,@TargetDataIPv4.destAddress,Length(destTarget));
  131.         end
  132.         else if Request.AddressType = SOCKS_Addresstype_Domain then begin
  133.           // Domain Name is required
  134.           Socket.ReceiveBuf(TargetDataLengthDomain, 1);
  135.           SetLength(TargetDataDomain.destAddress,TargetDataLengthDomain.destAddressLength);
  136.  
  137.           Socket.ReceiveBuf(TargetDataDomain.destAddress[0], Length(TargetDataDomain.destAddress));
  138.           SetLength(desttarget, Length(TargetDataDomain.destAddress));
  139.           CopyMemory(@destTarget, @TargetDataDomain.destAddress, Length(destTarget))
  140.  
  141.         end;
  142.  
  143.         State := 3;
  144.     end
  145.  
  146.     else if State = SOCKS_AUTHSTATE_req_allowed then begin
  147.         if not(SizeOf(desttarget) = 0) then begin
  148.             Socket.ReceiveBuf(TargetPort, 2);
  149.  
  150.             // Invert Port
  151.             tmpTargetPort := TargetPort;
  152.  
  153.             TargetPort.destPort[1] := tmpTargetPort.destPort[0];
  154.             TargetPort.destPort[0] := tmpTargetPort.destPort[1];
  155.  
  156.             CopyMemory(@destPort,@TargetPort.destPort,2);
  157.  
  158.             SSockets.InternetSocket.Host := String(desttarget);
  159. //            SSockets.InternetSocket.Host := 'google.com';
  160.             SSockets.InternetSocket.Port := destPort;
  161. //            SSockets.InternetSocket.Open;
  162. //            SSockets.InternetSocket.Active := true;
  163. {            Form1.ClientSocket2.Host := String(desttarget);
  164.             Form1.ClientSocket2.Port := destPort;}
  165.             Form1.ClientSocket2.Open;
  166.  
  167.               Request.Command := 0;
  168.               Request.Version := 5;
  169.               Request.AddressType := SOCKS_AddressType_IPv4;
  170.               Request.Reserved := 0;
  171.  
  172.               Socket.SendBuf(Request, 10);
  173.  
  174.               Reply.Version := 5;
  175.               Reply.ReplyType := SOCKS_ReplyType_Success;
  176.               Reply.Reserved := 0;
  177.               Reply.AddressType := SOCKS_AddressType_IPv4;
  178.  
  179. //        Hier verzweifle ich : LocalAddress = "" LocalPort = -1...
  180.        
  181.               tmpBoundAddr := SSockets.InternetSocket.Socket.LocalAddress;
  182.               CopyMemory(@Reply.sBoundAddr, @tmpBoundAddr, 4);
  183.  
  184.               tmpBoundPort := SSockets.InternetSocket.Socket.LocalPort;
  185.               CopyMemory(@tmpTargetPort,@tmpBoundPort, 2);
  186.  
  187.               boundtargetPort.destport[0] := tmpTargetPort.destPort[1];
  188.               boundtargetPort.destport[1] := tmpTargetPort.destPort[0];
  189.  
  190.               CopyMemory(@Reply.sBoundPort,@BoundTargetPort.DestPort, 2);
  191.  
  192.           State := SOCKS_AUTHSTATE_Tunneling;
  193.         end; // Error in Connection (perhaps tryed IPv6?)
  194.     end
  195.  
  196.     else if State = SOCKS_AUTHSTATE_Tunneling then begin
  197.        // Tunneling Work
  198.        if ((SSockets.InternetSocket.Active) and  (SSockets.InterfaceSocket.Active)) then begin
  199. //     Dies tritt fast nie auf da InternetSocket nicht Active ist :[
  200.            i := Socket.ReceiveLength;
  201.            SetLength(buf, i);
  202.            Socket.ReceiveBuf(buf[0], i);
  203.  
  204.            SSockets.InternetSocket.Socket.SendBuf(buf[0], i);
  205.         end;
  206.      end;
  207. end;
  208.  
  209. procedure TReverseSocks5Server.OnReceiveFromInternet(Sender: TObject; Socket: TCustomWinSocket);
  210. var
  211. len: Integer;
  212. begin
  213. // Real Socks bekommt nachricht vom InternetZ
  214.   len := Socket.ReceiveLength;
  215.   SetLength(buf, len);
  216.   Socket.ReceiveBuf(buf[0], len);
  217.  
  218.   SSockets.InterfaceSocket.Socket.SendBuf(buf[0], len);
  219. end;
  220. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement