2011-01-06 9 views
2

Kürzlich habe ich begonnen, an einem Programm zu arbeiten, das die Pakete eines meiner Open-Source-Programme überwachen wird, um mehr über Programmierung und Vernetzung zu erfahren. Außerdem möchte ich dem Programm zusätzliche Funktionen hinzufügen, ohne die Quelle zu bearbeiten, z. B. ein externes Bedienfeld.C# Eine Socket-ID finden?

(Ich benutzte WPE Pro, um Pakete zu filtern, falls Sie sich wundern, WireShark ist zu viel Aufwand für solch eine einfache Aufgabe.) Eine Sache stört mich jedoch, die Socket-ID.

Ich weiß, was es ist, und ich habe eine Frage davor gestellt, aber ich kann nicht herausfinden, wie man es benutzt/einen/einen absteckt.

Ohne die richtige Socket-ID, mein Programm wird nicht in der Lage sein, etwas zu tun, so meine Frage ist, wenn es möglich ist herauszufinden, welche Socket-ID ein Socket verwendet, sobald Sie das Paket erfassen?

Wenn nicht, gibt es andere Möglichkeiten? -oder mögliche andere Sprachen wie Visual Basic?

Vielen Dank für Ihre Zeit.

+0

Duplizieren von http://stackoverflow.com/questions/2742763/how-to-get-socket-id-handle-descriptor-for-an-ready-open-connection-net-c – dzendras

+0

Die Antwort dort ist falsch SharpPcap kann die Socket ID nicht bekommen. Wenn ich falsch liege, korrigiere mich bitte in Form einer Antwort, da ich genau danach suche. – Nick

Antwort

4

Wenn, nach Socket-ID, Sie den Rückgabewert eines erfolgreichen Anrufs zu Funktion meinen, glaube ich nicht, dass es einen Weg gibt.

Am nächsten kommt die Prozess-ID, da, wie Sie vielleicht bereits wissen, jedes IP-Paket ein vom Tupel (IP-Adresse, Port) beschriebenes Ziel hat und innerhalb eines Systems nur ein Socket erfolgreich gebunden werden kann zu diesem Tupel. Dienstprogramme wie TCPView sind in der Lage, ein IP-Tupel einem Prozess zuzuordnen, also existiert ein Weg , wenn diese Information für Sie genug ist.

Wenn das nicht der Fall ist, bin ich mir keiner Methode bewusst, die Socket-ID abzurufen, die Sie benötigen , wenn die Zielanwendung nicht kollaborativ ist.

+0

Zuerst, danke für Ihre Antwort. Wenn Sie WPE Pro zum Filtern von Paketen verwenden, hat jedes Paket die gleiche Socket-ID, um eine Verbindung eindeutig zu identifizieren. Wenn ich also richtig verstehe, besteht die Möglichkeit, dass diese Socket-ID der Prozess-ID des Programms entspricht, auch wenn sie sich im Laufe der Zeit ändern kann. Ich wünschte, der Quellcode des Programms würde mir helfen, aber ich kann nichts finden, das mit dem Erstellen der Socket-Verbindung im Zusammenhang steht. – Nick

+0

Nun, ich habe einen Blick auf WPE Pro geworfen und es scheint, dass es (auch) DLL-Injektion verwendet. Es erhält nicht die Socket-ID aus dem Paket. Das ist eine ganz andere Geschichte ... – Simone

+0

Ich sehe .. Ich fand zwar eine interessante Funktion: WSADuplicateSocket(), aber ich kann nirgendwo ein anständiges Beispiel finden. – Nick

0

gibt einen Dateideskriptor zurück, wenn dies eine Socket-ID ist, dann sind die Möglichkeiten, dies ohne die Zusammenarbeit des Prozesses unter Windows zu erreichen, begrenzt. FWIW auf offenen Linux-FDs werden im proc-Dateisystem aufgelistet.

Das Gesagte, das einzige, was Sie in der Lage sein könnten, mit der FD zu tun ist, senden Sie zusätzliche Informationen aus dem Sockel. Sie könnten auch vom fd lesen, aber alle auf diese Weise gelesenen Daten würden nicht an die Anwendung gesendet werden, die den Socket besitzt. Ohne eine gewisse Koordination wäre das wahrscheinlich nicht das, was Sie sich wünschen, da Sie nur Teile von Daten bekommen würden.

Wenn Sie nur in der Lage sein wollen, den Verkehr in Ihrem Programm zu hören, dann sollte etwas wie Paketfilterung ausreichend sein, also nehme ich an, Sie möchten tatsächlich wie ein Mann in der Mitte dafür sein können.

Wenn dies der Fall ist, dann wäre das Beste, Ihre Anwendung als Proxy für Ihren anderen Dienst einzurichten.

Damit meine ich, schreibe ein Programm, das einen Listening-Port öffnet und akzeptiert Verbindungen, wenn eine Verbindung initiiert wird, sollte es sofort seine eigene Verbindung zu einer vorkonfigurierten IP: Port-Kombination öffnen und Verkehr weiterleiten. Sobald dies geschrieben ist, ist es eine einfache Sache, den Verkehr vor der Weiterleitung zu inspizieren und möglicherweise zu modifizieren.

Wenn Ihr Programm ein Server ist, führen Sie es auf einem nicht standardmäßigen Port aus, konfigurieren Sie diese Anwendung, um den normalen Port des Servers zu öffnen, und leiten Sie dann die Verbindungen zu dem von Ihnen auf localhost eingerichteten nicht standardmäßigen Port weiter.

Wenn Ihr Programm ein Client ist, richten Sie einfach die Interceptor-Anwendung auf den Server und wählen Sie einen zufälligen Listen-Port auf Ihrer Box. Konfigurieren Sie dann den Client so, dass er sich mit diesem Listen-Port verbindet, als wäre er der Server.

Dies sollte für so ziemlich alles funktionieren. Der einzige Nachteil ist, wenn der Verkehr verschlüsselt ist, Sie (offensichtlich) nicht in der Lage sein werden, es zu prüfen/zu modifizieren. Dies ist praktisch das Gleiche, als wenn Sie Ihre Anwendung hinter eine NAT stellen.

1

Diese Bibliothek: SharpPcap verspricht das Erfassen, Injizieren, Analysieren und Erstellen von Paketen mit jeder beliebigen .NET-Sprache wie C# und VB.NET (more info).

Es ist die Bibliothek von Wireshark verwendet und es ist sicher, dass es erfassen und analysieren kann.

+0

Ja, das hat Cristian gesagt. Ich schätze Ihre Hilfe, aber SharpPcap hat leider keine solche Möglichkeit. – Nick

Verwandte Themen