Autor Beitrag
CABALxx
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 174


D7 Ent
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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:

_________________
There are 10 types of people - those who understand binary and those who don´t.
CABALxx Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 174


D7 Ent
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
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
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 174


D7 Ent
BeitragVerfasst: 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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
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
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 174


D7 Ent
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 174


D7 Ent
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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
Einloggen, um Attachments anzusehen!
_________________
There are 10 types of people - those who understand binary and those who don´t.
CABALxx Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 174


D7 Ent
BeitragVerfasst: Di 07.08.07 13:41 
Danke danke


Ich werd meim bestes versuchen.

Melde mich sobald ich weiter gekommen bin oder feststecke.
CABALxx Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 174


D7 Ent
BeitragVerfasst: 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:



ausblenden 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 = NILthen 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1296

Windows Vista Home Premium
Delphi 7 PE, Delphi 7 Portable, bald C++ & DirectX
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 174


D7 Ent
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 13.08.07 09:42 
Moin!

user profile iconCABALxx 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1296

Windows Vista Home Premium
Delphi 7 PE, Delphi 7 Portable, bald C++ & DirectX
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
Wolle92
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1296

Windows Vista Home Premium
Delphi 7 PE, Delphi 7 Portable, bald C++ & DirectX
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 14.08.07 16:46 
Moin!

user profile iconWolle92 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:

user profile iconWolle92 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?

user profile iconWolle92 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1296

Windows Vista Home Premium
Delphi 7 PE, Delphi 7 Portable, bald C++ & DirectX
BeitragVerfasst: Di 14.08.07 16:54 
Gibts irgendwo nen Tutorial dafür? :D