Entwickler-Ecke
Internet / Netzwerk - Port auslesen???
CABALxx - Sa 04.08.07 00:06
Titel: Port auslesen???
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 - 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? :zwinker:
CABALxx - 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.
CABALxx - 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 - 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...
CABALxx - 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 - 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 - 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. :mahn:
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 :arrow: Quelltext). Die Transferdatenzähler sollten sich jetzt "bewegen". Die Checkbox zeigt den Verbindungszustand des internen Clients an. :idea: 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! :mahn: 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
CABALxx - Di 07.08.07 13:41
Danke danke
Ich werd meim bestes versuchen.
Melde mich sobald ich weiter gekommen bin oder feststecke.
CABALxx - 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 - 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 - 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 - 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
Wolle92 - 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 - 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...). :mahn: :idea: ;)
cu
Narses
Wolle92 - 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 - 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... :roll:
- 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! :idea: :mahn:
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
Wolle92 - Di 14.08.07 16:54
Gibts irgendwo nen Tutorial dafür? :D
arj - Di 14.08.07 18:12
Narses hat folgendes geschrieben: |
Es gibt also keine dauerhafte TCP-Verbindung, die anzeigt, dass jemand den Webserver verwendet! :idea: :mahn: |
Aber durchaus die Möglichkeit, eine Verbindung aufrecht zu erhalten.
Zitat: |
Connection: Keep-Alive |
:mahn:
CABALxx - Di 14.08.07 19:58
Wenn er versuchen würde, wie ich an einem Port zu Horchen und alles aufzuschnappen, dann würde er ja alles daten und verbindungen mitkriegen ganz egal wie sporadisch oder kurz sie sind ( er horcht ja dann dauernd ).
Ich muss allerdings sagen, dass dieses Problem nicht so einfach zu lösen ist wie ich es mir vorgestellt hätte......
Wolle92 - Di 14.08.07 20:17
eben das Hardwarenahem programmieren...
Und DAS kann ich nur ansatzweise (seeeehr, sehr kleine Ansätze)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!