Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TCP Alles empfangen (https://www.delphipraxis.net/141506-tcp-alles-empfangen.html)

XXcD 10. Okt 2009 03:04


TCP Alles empfangen
 
Hallo,
ich bin momentan auf der Suche nach einer Möglichkeit um Daten auszulesen die zwischen Client und Server gesendet werden.
Bei dem Client kann ich den Port ändern und dachte mir nun, dass ich ein Programm schreibe mit einer Server- und Clientkomponente.
Das Programm nimmt die Daten vom Client entgegen und sendet sie weiter zum Server dabei wird der Inhalt in ein Memo geschrieben.
Das ganze auch andersrum.

Hat einer eine Idee wie ich alle Daten abfangen kann?
Weil mit Readln das hilft mir nicht weiter das müssen nicht unbedingt Strings sein.

Edit: Achja ich nutze die Indy komponenten

Aphton 10. Okt 2009 04:13

Re: TCP Alles empfangen
 
Funk als Proxy dazwischen!

Am einfachsten ginge es imho mit Socks.

MfG

XXcD 10. Okt 2009 12:20

Re: TCP Alles empfangen
 
Ich versuche das gerade mit IdSockInfo zu verwirklichen aber irgendwie will das nicht klappen.
Hab hier die hilfe für Indy benutzt: http://www.indyproject.org/KB/tidtcp...lightsub=socks

Hat nicht jemand ein Beispielprogramm womit das funktioniert?

Zacherl 10. Okt 2009 13:08

Re: TCP Alles empfangen
 
Alternativ geht es auch mit einem WinSocks Hook.

Aphton 10. Okt 2009 13:36

Re: TCP Alles empfangen
 
@Zacherl
Man muss dafür doch nicht gleich schweres Geschütz auffahren...

@XXcD
Was hast du denn so alles probiert?

MfG

XXcD 10. Okt 2009 13:42

Re: TCP Alles empfangen
 
Ich habe idTCPClient, IdIOHandlerStack und idSocksInfo auf meinem Formular.
Die sind miteinander verknüpft, aber hat keiner eine Idee wie ich sowas basteln kann?
will ja nur die Daten durchschleifen und anzeigen.

Zacherl 10. Okt 2009 14:35

Re: TCP Alles empfangen
 
Du brauchst die IdSocksServer Komponente.

Aphton 10. Okt 2009 14:38

Re: TCP Alles empfangen
 
Hier haste ne kleine Demo.

Öffne deinen Internet Explorer; gehe auf Extras - Internetoptionen - (Reiter) Verbindungen - (unten) LAN Einstellungen - (3.) Checkbox "Proxy für LAN verwenden.." - Erweitert:
Hier einfach bei Socks als IP 127.0.0.1 und 1080 als Port angeben.

Anschließend kompilierst und führst die Applikation aus und versuchst ne Seite zu besuchen.
Klar funktioniert es evt. nicht 100% - Feintuning musst du selber machen, ich habs mir nur mal so aus dem Arm geschüttelt.

Delphi-Quellcode:
program SOCKS4MiniProxy;

{$APPTYPE CONSOLE}

uses
  Windows,
  Winsock;

type
  TSOCKS4Header = record
    Version : Byte;
    Command : Byte;
    Port   : Word;
    IP     : DWord;
    UserID : Array[0..63] of Char;
  end;

const
  Size = $2000;

var
  WSAData : TWSAData;
  Server : TSocket;
  AddrIn : TSockAddrIn;

  Client, Host     : TSocket;
  cAddrIn, hAddrIn : TSockAddrIn;

  AddrSize : Integer;
  X        : Integer;

  Header : TSOCKS4Header;
  Data   : Array[0..Size-1] of Char;
  DataStr : String;

const
  DefPort = 1080;
  SockAddrInSize = SizeOf( TSockAddrIn );

procedure FilterStr(var Str : String);
var
  i, j : integer;
begin
  for i := 1 to Length( Str ) do
  begin
    j := Ord( Str[i] );
    if ( j < 32 ) or ( j > 122 ) then
      Str[i] := '.';
  end;
end;

function ConsoleCtrlHandler(dwCtrlType : DWord) : BOOL; stdcall;
begin
  closesocket( Server );
  WSACleanup;
  Result := True;
end;

begin
  WSAStartup( $101, WSAData );
  Server := socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
  with AddrIn do
  begin
    sin_family := AF_INET;
    sin_port   := htons( DefPort );
    sin_addr.S_addr := INADDR_ANY;
  end;
  bind( Server, AddrIn, SockAddrInSize );
  listen( Server, 0 );
  X := 0;
  ioctlsocket( Server, FIONBIO, X );
  SetConsoleCtrlHandler( @ConsoleCtrlHandler, True );
  while True do
  begin
    AddrSize := SockAddrInSize;
    Client := accept( Server, @cAddrIn, @AddrSize );
    if Client <> INVALID_SOCKET then
    begin
      FillChar( Header, SizeOf( TSOCKS4Header ), 0 );
      // receive header
      recv( Client, Header, SizeOf( TSOCKS4Header ), 0 );
      if Header.Version = $04 then
      begin
        hAddrIn.sin_family     := AF_INET;
        hAddrIn.sin_port       := Header.Port;
        hAddrIn.sin_addr.S_addr := Header.IP;
        Host := socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
        Header.Version := 0;
        if connect( Host, hAddrIn, SockAddrInSize ) = ERROR_SUCCESS then
        begin
          Header.Command := $5A;
        end else
          Header.Command := $5B;
        send( Client, Header, SizeOf( TSOCKS4Header ), 0 );
        if Header.Command = $5A then
        begin // connection established
          // now receive from client, send to host
          Writeln( '-- Connection established --' );
          DataStr := '';
          repeat
            X := recv( Client, Data[0], Size, 0 );
            if X > 0 then
            begin
              DataStr := DataStr + Copy( Data, 1, X );
              send( Host, Data[0], X, 0 );
            end;
          until X < Size;
          Writeln( '[CLIENT] received data' );
          FilterStr( DataStr );
          Writeln( DataStr );
          // now receive from host, send to client
          DataStr := '';
          repeat
            X := recv( Host, Data[0], Size, 0 );
            if X > 0 then
            begin
              DataStr := DataStr + Copy( Data, 1, X );
              send( Client, Data[0], X, 0 );
            end;
          until X < Size;
          Writeln( '[HOST] received data' );
          FilterStr( DataStr );
          Writeln( DataStr );
          Writeln( '-- Connection closed --' );
        end;
        closesocket( Host );
      end;
    end;
  end;
end.
MfG


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz