Autor |
Beitrag |
CABALxx
      
Beiträge: 174
D7 Ent
|
Verfasst: Sa 04.08.07 00:06
Hallo
War ja recht lange abstinent.
Wollte mich nun wiedermal an ein neues Programm dran setzen und brauche mal wieder Hilfe.
Was ich im Prinzip wollen würde, wäre ein Programm zu schreiben, das sozusagen einen Port ausliest. Damit ist gemeint: ich gebe den Port ein, und z.B. in ein Memo feld oder so wird dann alles an Daten reingeschrieben was über diesen Port aus dem Internet rein oder raus geht ( sollte sich doch alles als string darstellen lassen oder? )
Habe leider so garkeinen Ansatz wie ich dieses Problem angehen kann...
Würde mir gerne mal ankucken was da so bei rum kommt?
Danke schonmal für jede Hilfe.
Hoffe ich konnte verständlich machen was ich tun möchte.
///EDIT:
Also meine ersten nachforschungen haben ergeben, das das Problem wohl mit Hilfe der Internet komponenten lösbar sein könnte ( vll INDY ? )
Vielleicht mit dem OnRead Ereignis oder so.
Nur muss man da nicht noch eine spezifische IP eingeben ?`
Ich will ja als erstes mal den gesamten Datenverkehr an einem Port?
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Sa 04.08.07 01:01
Moin!
Je nach dem, was du für einen Fokus hast, sind folgende Ansätze denkbar:
a) Der Datenverkehr auf einem Port des lokalen PCs soll mitgeschnitten werden:
Die WSA-API-Calls global hooken und entsprechend reagieren; ist schon ein bischen anspruchsvoller, das Problem.
b) Der Datenverkehr zu einem entfernten System soll auf einem bestimmten Port abgehört werden:
In diesem Fall kann man ein Man-in-the-Middle-Szenario schaffen:
HostA <-> Dein PC <-> HostB
Sprich, du "simulierst" den Server und leitest eingehende Datenpakete einfach weiter, zurückkommende ebenfalls, hast aber so den Datenverkehr im Zugriff. Das ist z.B. auch mit den Delphi-Sockets relativ leicht realisierbar.
cu
Narses
PS: Ist die Anzahl der Fragezeichen ein Maß dafür, wie groß das Problem für dich ist? 
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
CABALxx 
      
Beiträge: 174
D7 Ent
|
Verfasst: Sa 04.08.07 09:38
Hallo...
Danke schonmal
Ja die Zahl der Fragezeichen richtet sich nach der Problem grösse.
Genau an so ein Man-in-the-middle Ding hatte ich gedacht ( durch den Berühmten LAN "angriff" kam ich überhaupt erst auf die Idee, auch wenn meine Zielsetzung eine ganz andere ist )
Werde einfach mal bisschen Herumexperimentieren.
|
|
arj
      
Beiträge: 378
Win XP/Vista, Debian, (K)Ubuntu
Delphi 5 Prof, Delphi 7 Prof, C# (#Develop, VS 2005), Java (Eclipse), C++, QT, PHP, Python
|
Verfasst: Sa 04.08.07 10:35
Zu a) schau dir doch mal den Source von Ethereal mittlerweile Wireshark an. Das nutzt die Treibersammlung WinPcap welche einen hardwarenahen Zugriff auf die Netzwerkkarte für Windows-basierte Betriebssysteme ermöglicht. Vielleicht reicht es auch einfach nur WinPcap anzuschauen. Ich kenn die Schnittstellen dafür nicht, sollte es aber Beispiele auf der Homepage geben. z.B. hier
|
|
CABALxx 
      
Beiträge: 174
D7 Ent
|
Verfasst: So 05.08.07 19:37
Also ich hab mal ein bisschen mit dem Indy Client herumexperimentiert.
Ich habe mal wahrlos aus den netstat ergebnissen eine IP und einen passenden Port herausgenommen bei den Properties des IndyClient eingeben und dann ein Bisschen mit den Funktionen ReadString und ReadLn herumgebastel. Wollte das er dann die Daten als string ausliesst und in ein Memo schreibt.
Kam jedesmal ein Error bzgl: " not connected ".
Ok es gibt einige Connect funktionen Beim indy client. Aber ich weiss nicht genau wie man das dann macht, ausserdem sollte das Endziel ja sein, das unabhängig einer verbunden IP alle daten aufgezeichnet werden die an einem Port so durchlaufen..
Was das Hardware - nahe Programmieren angeht: Ist warscheinlich ein guter Rat aber ich habe garkeine Erfahrung im Hardwarenahen Programmieren und ich hab vor 2 Jahren das letzte mal mit Delphi gearbeitet.
Das würde ich lieber als letzte Option nutzen.
|
|
cware
Hält's aus hier
Beiträge: 3
|
Verfasst: So 05.08.07 22:29
diese so-genannte "man-in-the-middle-attacke" ist in diesem fall ein einfacher proxy...
bei den indy 9 war seinerzeit eine fertige komponente dafür vorhanden...
cheers...
|
|
arj
      
Beiträge: 378
Win XP/Vista, Debian, (K)Ubuntu
Delphi 5 Prof, Delphi 7 Prof, C# (#Develop, VS 2005), Java (Eclipse), C++, QT, PHP, Python
|
Verfasst: So 05.08.07 22:34
Nochmal zu WinPCap:
Stückchen weiter unten auf der Seite ist der Source eines Sniffers. Vielleicht bringt dir das was:
members.fortunecity....ger/download/de.html
|
|
CABALxx 
      
Beiträge: 174
D7 Ent
|
Verfasst: Mo 06.08.07 19:28
Hallo
Leider hat mir der Sniffer nicht gerade weitergeholfen.
Trotzdem danke für die Mühe.
Ich hab dann auch mal mit dem TTcpClient herumexperimentiert. Genauer gesacht mit TcpClient1.Receiveln().
Was muss denn in die Klammer rein bei der function?
Hab zwar mal in die Delphi Hilfe gekuckt aber ich werd nicht schlau draus?
|
|
CABALxx 
      
Beiträge: 174
D7 Ent
|
Verfasst: Mo 06.08.07 23:07
Ich versuch jetzt erstmal das ganze so zu machen das ich erstmal nur die daten eines Ports einer einzelnen in netstat aufgeführten IP adresse. Dazu wollte ich dann zu jener in Netstat ausgelesenen IP connecten mit der IndyClient Komponente IdTCPClient1.
Habs folgendermaßen versucht:
Delphi-Quelltext 1: 2: 3:
| IdTCPClient1.Port := StrToInt(Edit4.Text); IdTCPClient1.Host := Edit3.Text; IdTCPClient1.Connect(-1); |
kA.
Schon das funktioniert nicht. Ärgerlich.
Jemand ne idee?
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 07.08.07 00:59
Moin!
Hier mal ein Quick-Hack für einen Socket-Proxy auf Basis des TClientSocket/TServerSocket, keine großartige Fehlerbehandlung, ziemlich raw.  Soll aber auch mehr das Prinzip verdeutlichen, als fehlerfrei sein.
Funktion: Prog starten, Host und Port anpassen, dann das Programm starten, das abgehört werden soll, dieses auf localhost:4000 verbinden lassen (der lokale Port ist immer 4000  Quelltext). Die Transferdatenzähler sollten sich jetzt "bewegen". Die Checkbox zeigt den Verbindungszustand des internen Clients an.  Hinweis: Falls jemand auf den Gedanken kommen sollte, eine Browser-Session damit abzuhören: das wird in der Regel nicht funtionieren, da der Browser ja für den Seiteninhalt nicht immer nur einen Server auf dem gleichen Port befragen wird! Für sowas braucht man einen HTTP-Proxy, der die komplette Anfrage vom Client entgegen nimmt und dann unterschiedliche Sitzungen aufbaut!  Fazit: ist also nur für Programme bzw. Verbindungen geeignet, die eine einzelne TCP-Session aufbauen.
Schau mal, ob du damit weiter kommst.
cu
Narses
Einloggen, um Attachments anzusehen!
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
CABALxx 
      
Beiträge: 174
D7 Ent
|
Verfasst: Di 07.08.07 13:41
Danke danke
Ich werd meim bestes versuchen.
Melde mich sobald ich weiter gekommen bin oder feststecke.
|
|
CABALxx 
      
Beiträge: 174
D7 Ent
|
Verfasst: Di 07.08.07 20:46
Ok das war doch schonmal sehr Hilfreich.
Ich habe mich mal an dem von Narses zur verfügung gestellten download orientiert ( danke sehr ).
Könnte folgendes funktionieren:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure TForm1.TcpClient1connect(Sender: TObject; Socket: TCustomWinSocket); begin if (CurrentClient = NIL) then begin currentclient := Socket; TcpClient1.RemoteHost := edit1.text; TcpClient1.RemotePort := Edit2.text; TcpClient1.Open; end else Socket.Close; end;
procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket); var Data: String; begin
Data := Socket.ReceiveText; Memo1.Text := Data;
end; |
??
CurrentSockethabe ich ebensfalls so definiert wie die in dem Beispiel es getan haben.
Dann müsste ich nur noch die Proceduren ausführen per Buttonclick? falls sie funktionieren können?
|
|
Wolle92
      
Beiträge: 1296
Windows Vista Home Premium
Delphi 7 PE, Delphi 7 Portable, bald C++ & DirectX
|
Verfasst: Sa 11.08.07 13:08
ich geselle micb mal mit einem ähnlichen Problem dazu:
Ich habe einen Apache-Server auf meinem PC laufen, und muss kontrollieren, ob noch verbindungen zu clienten bestehen...
Kann mir da jemand einen Tipp geben, wie ich das in einem externen Programm machen kann?
Oder gibt es irgendwo ein Tutorial zum Webserver-Programmieren mit Delphi? Dann wärs natürlich einfacher, das ganze zu kontrollieren...
|
|
CABALxx 
      
Beiträge: 174
D7 Ent
|
Verfasst: So 12.08.07 19:18
Hiho
Naja ich weiss nicht genau was ein Apache-Server ist, aber wenn man in der Eingabeaufforderung "netstat" eingibt dann bekommt man ja alle stehenden Verbindungen aufgelistet. Und wenn man an dieser Auflistung sehen könnte welche eine dieser Clientverbindungen dieses Apache-servers ist, dann wärs das.
Der EingabeAufforderung den NETSTAT - Befehl mit Delphi zu übergeben ist einfach, das AUSLESEN hingegen etwas mühsamer aber irgend ein Genie hier im Forum hat mal einen Code geschrieben der das kann und in ein Memo einträgt oder in eine listbox. Und dann könnte man ja diese Verbindungen nach belieben sortieren oder was auch immer damit tun.
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 13.08.07 09:42
Moin!
CABALxx hat folgendes geschrieben: | Ich habe mich mal an dem von Narses zur verfügung gestellten download orientiert ( danke sehr ).
//...
wie die in dem Beispiel es getan haben. |
Um keine Missverständnisse aufkommen zu lassen: der Code im Anhang ist von mir.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Wolle92
      
Beiträge: 1296
Windows Vista Home Premium
Delphi 7 PE, Delphi 7 Portable, bald C++ & DirectX
|
Verfasst: Di 14.08.07 16:13
Bei mir werden nur tausende von "die machen irgendwas, was ich nicht weiß"-Ports angezeigt...
Aber nicht Port 80, Port 144 und noch drei von einem Game-Server
Zu Narses anhang: bei mir gibbet kein TClientSocket und auch kein TServerSochet...
Hab Indy 9 isntalliert
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 14.08.07 16:23
Moin!
Das "Problem" bei einem Webserver (genauer: beim http) ist, dass es keine ständigen (TCP-)Verbindungen gibt. Es wird für jeden Dateitransfer (HTML-Seite, Bilder, etc.pp) immer wieder eine eigene (TCP-)Verbindung aufgebaut. Du würdest also mit einem netstat -a lediglich zufällig einen Transfer sehen, aber ob jemand gerade deinen Webserver "benutzt" - tja, das kann man soo einfach nicht feststellen, da http eben nicht Verbindungsorientiert konzipiert ist (deshalb macht man ja diese Verrenkungen z.B. bei den Foren mit Cookies, SessionID, etc.pp, um dann doch wieder eine Session nachzubauen...).
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Wolle92
      
Beiträge: 1296
Windows Vista Home Premium
Delphi 7 PE, Delphi 7 Portable, bald C++ & DirectX
|
Verfasst: Di 14.08.07 16:34
Das widerspricht sich jetzt irgendwie... wieso ist eine Verbindung mit TCP-Protokoll nicht verbindungsorientiert?
Und außerdem: wäre es nicht möglich nur einen einzigen Port abzufragen? Und den dann jede Sekunde einmal oder so? Und kann man dann nicht auch noch die eingehenden Daten auf z.B. die IP-Adresse oder die Datei, die angefragt wird absuchen?
Wäre das theoretisch möglich? Sodass man einen ähnlichen Ablauf angezeigt bekommt wie bei FileZilla...
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 14.08.07 16:46
Moin!
Wolle92 hat folgendes geschrieben: | Das widerspricht sich jetzt irgendwie... wieso ist eine Verbindung mit TCP-Protokoll nicht verbindungsorientiert? |
OK, die ausführliche Variante...  - Mensch tippt in Browser ein: "http://ich.bin.ein.Webserver.de/index.html", es passiert im Netzwerk:
- Browser ermittelt IP-Adresse des Webserver-Hostnamen; OK->weiter, Fehler->"Server nicht gefunden..."
- Browser baut TCP-Verbindung zum Webserver auf: "Gute Tag! Ich hätte gerne die Datei index.html aus dem Wurzelverzeichnis, bitte!" "Ahh ja, Moment eben, ich such das mal raus... los gehts: 01001010010101...", TCP-Verbindung trennen
- Browser stellt beim Untersuchen der index.html fest, dass ein Bild "/tolles_logo.jpg" geladen werden soll: TCP-Verbindung aufbauen: "Guten Tag, ich schon wieder! Ich hätte gerne auch noch /tolles_logo.jpg" "Nana, aber nicht gleich alles auf einmal runterladen, ja? Los gehts: 000100101010010...", TCP-Verbindung trennen
- etc.pp.
Es gibt also keine dauerhafte TCP-Verbindung, die anzeigt, dass jemand den Webserver verwendet!
Wolle92 hat folgendes geschrieben: | Und außerdem: wäre es nicht möglich nur einen einzigen Port abzufragen? Und den dann jede Sekunde einmal oder so? |
Was soll das bringen, wenn die Verbindungen immer nur ganz kurz sind?
Wolle92 hat folgendes geschrieben: | Und kann man dann nicht auch noch die eingehenden Daten auf z.B. die IP-Adresse oder die Datei, die angefragt wird absuchen? |
Dann kannst du auch gleich einen Webserver schreiben, das ist einfacher...
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Wolle92
      
Beiträge: 1296
Windows Vista Home Premium
Delphi 7 PE, Delphi 7 Portable, bald C++ & DirectX
|
Verfasst: Di 14.08.07 16:54
Gibts irgendwo nen Tutorial dafür? 
|
|