Socket-Alternative? (Sniffer, IDS, ...)

Hai.

Ich programmiere vorrangig mit VB.Net und bin seit einiger Zeit auf der Suche nach einer Alternative für Sockets.
Sockets fand ich eigentlich immer recht schau, aber seitdem ich mich intensiver mit Protokollen und Datenverkehr in Netzwerken allgemein beschäftige, dann irgendwie doch nicht mehr.
Generell bin ich ein ziemlicher DIY-Fan und genau da kommt es nun zum Konflikt.

Mit Sockets kann man weder Packet-Sniffer programmieren (ausgehenden Traffic zu lesen wird blockiert), geschweige denn ein IDS.
Außerdem hab ich mir eine IP-Packet-Klasse geschrieben und wollte sie in Verbindung mit Raw-Sockets verwenden. Sobald ich allerdings eine TCP-Verbindung herstellen will, wird das blockiert. Alles, was ich bisher probiert habe, außer ICMP, wird blockiert. IP-Spoofing wird blockiert.
Permanent bevormundet mich mein eigenes Werkzeug! Das kann ja wohl nicht sein.

Nun habe ich mir sagen lassen, dass es sowieso nicht üblich ist, für Netzwerkprogrammierung Sockets zu verwenden. Ich solle lieber direkt über meinen Netzwerkkarten-Treiber herangehen. Schade nur, dass es für den keine Dokumentation gibt. Dependencywalker hat mir da auch nicht geholfen (oder ich war seiner Hilfe unwürdig).

Was gibt es für Möglichkeiten, ohne auf vorgefertigte Packages wie pcap zurückgreifen zu müssen oder selbst Treiber zu programmieren? Und selbst wenn es keine gibt: Was empfehlt ihr mir?

Danke fürs Lesen.
Greetings
 
Hai.
Ich programmiere vorrangig mit VB.Net und bin seit einiger Zeit auf der Suche nach einer Alternative für Sockets.

Hi freefall,

Netzwerk ist auch eins meiner Interessengebiete.

Eine Alternative für den eigentlichen Verwendungszweck des socket gibt es nicht! Im osi-Schichtemodell befinden wir uns bereits höher als die Transportschicht (tcp/upd etc.). Der socket wird benutzt um den Payload aus einem Transportschichtprotokoll zu lesen und zu schreiben, und da in möglichst einfacher Form, und das kann er gut wie ich finde.

Mit Sockets kann man weder Packet-Sniffer programmieren (ausgehenden Traffic zu lesen wird blockiert), geschweige denn ein IDS.

Der socket wird bereits in einer erfolgreich verbundenen Sitzung verwendet und hat somit keinen Zugriff auf andere Sitzungen und das ist auch gut so.

...da sind wir einem einem ganz anderen Bereich. Hier geht es Dir ja nicht mehr darum, produktiv Datenaustausch nach den Restriktionen des Transportschichtprotokolls durchzuführen. Um einen Paketsniffer zu schreiben solltest Du auf pcap zurückgreifen, warum nicht, alles wunderbar, sogar plattform unabhängig. Ansonsten schau dir den pcap Sourcecode doch mal an, wenn Du Ihn nachprogrammieren willst.

Außerdem hab ich mir eine IP-Packet-Klasse geschrieben und wollte sie in Verbindung mit Raw-Sockets verwenden. Sobald ich allerdings eine TCP-Verbindung herstellen will, wird das blockiert. Alles, was ich bisher probiert habe, außer ICMP, wird blockiert. IP-Spoofing wird blockiert.
Permanent bevormundet mich mein eigenes Werkzeug! Das kann ja wohl nicht sein.

Die sockets unter Windows erlauben keine Bestimmung des ip header, und tcp auch nicht.
Um einen derartigen header selbst zu schreiben benötigst Du einen ndis Treiber, z.B. unter:
Damit solltest Du mit Deiner IPPacket Klasse realtiv gut arbeiten können.
http://www.codeproject.com/KB/IP/sendrawpacket.aspx

Das icmp funktioniert, liegt daran, dass dies schon ein application layer Protokoll ist.

Wenn Du Windows nutzt, kannst Du Dir den Treiber mittels des DDK relativ einfach selbst basteln, habe ich mir auch mal angeschaut, die Schwierigkeit wird maßlos überschätzt.

Aber unter windows kannst Du sogar mit pcap Pakete senden, klasse!
Damit hättest Du schon alles was Du brauchst. Fertige IP/TCP/UDP etc Klassen in diesem Bereich sind in der pcap wrapper bibliothek sharppcap für .net sahnemäßig implementier. Falls Du es nicht kennst schau es Dir unbedingt an, ich liebe es:

http://sourceforge.net/projects/sharppcap/

Nun habe ich mir sagen lassen, dass es sowieso nicht üblich ist, für Netzwerkprogrammierung Sockets zu verwenden.
[/QUOTE]

Dann radiere das aus Deinem Gedächtnis wieder aus, denn das ist purer Blödsinn (siehe oben).
 
Zuletzt bearbeitet:
Heyho AngelDelivery!

Danke für die Antwort.

Ja, hätte mich auch gewundert, wenn Sockets nicht das Standard-Werkzeug für Netzwerkprogrammierung wären... Aber ok.

Es gibt ja die Raw-Sockets, mit denen keine Verbindung und auch keine Verknüpfung mit einem Transportprotokoll nötig ist - pures IP. Es gibt auch die Einstellung SIO_RCVALL / ReceiveAll, mit der es eigentlich möglich sein müsste auch gesendete Pakete zu lesen, aber wird halt künstlich "von oben" geblockt.

Auf pcap zurückgreifen... "warum nicht"?
Wie gesagt, bin ich eher der Selbermachen-Typ. Ich weiß, meine Programmiersprache passt nicht sehr dazu... ;P Aber ich will ja C++ lernen, so ist das ja nicht...
Ansonsten hab ich mir das ja schon angeschaut, aber ich musste halt feststellen, dass die auch Treiber verwenden.

Nichtsdestotrotz sehen deine Links (vor allem der erste) seeehr sehr spannend aus.

die Schwierigkeit wird maßlos überschätzt.
Klingt gut.

Dann werde ich das mal alles durchgehen. Danke.
Greez
 
Zurück
Oben