2011-01-06 11 views
2

Récemment, j'ai commencé à travailler sur un programme qui surveillera les paquets d'un de mes programmes open-source dans le but d'en apprendre plus sur la programmation et la mise en réseau. En outre, je veux ajouter des fonctionnalités supplémentaires au programme sans modifier la source, comme un panneau de contrôle externe.C# Trouver un ID de socket?

(J'ai utilisé WPE Pro pour filtrer les paquets au cas où vous vous demanderiez, WireShark est trop compliqué pour une tâche aussi simple.) Une chose me dérange cependant, l'ID Socket.

Je sais ce que c'est, et j'ai déjà posé une question à ce sujet, mais je n'arrive pas à comprendre comment l'utiliser/assigner un/intercepter un.

Sans le bon ID de socket, mon programme ne pourra rien faire, donc ma question est de savoir s'il est possible de trouver quel ID de socket une socket utilise, une fois que vous avez capturé le paquet?

Sinon, existe-t-il d'autres façons de faire? -ou d'autres langues possibles comme Visual Basic?

Nous vous remercions de votre temps.

+0

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

+0

La réponse est incorrecte , SharpPcap ne peut pas obtenir l'ID Socket. Si je me trompe, corrigez-moi s'il vous plaît sous la forme d'une réponse, puisque c'est ce que je recherche. – Nick

Répondre

4

Si, par ID de socket, vous voulez dire la valeur de retour d'un appel réussi à la fonction socket(), je ne pense pas qu'il existe un moyen. Le plus proche, vous pouvez obtenir l'ID de processus car, comme vous le savez peut-être, chaque paquet IP a une destination qui est décrite par le tuple (adresse IP, port) et à l'intérieur d'un seul socket peut être lié avec succès à ce tuple. Les utilitaires comme TCPView sont capables de mapper un tuple IP à un processus, donc il existe un moyen si cette information est suffisante pour vous.

Si ce n'est pas le cas, je ne connais aucune méthode pour récupérer l'ID de socket dont vous avez besoin si l'application cible n'est pas collaborative.

+0

D'abord, merci pour votre réponse. Lors de l'utilisation de WPE Pro pour filtrer les paquets, chaque paquet a le même «identifiant de socket» pour identifier de manière unique une connexion. Donc, si je comprends bien, il y a une chance que cet ID de socket soit égal à l'ID de processus du programme, même s'il peut changer au fil du temps? Je souhaite que le code source du programme m'aiderait, mais je ne peux pas trouver quelque chose à distance liée à la création de la connexion socket. – Nick

+0

Eh bien, j'ai jeté un oeil à WPE Pro et il semble qu'il utilise (aussi) l'injection de DLL. Il n'obtient pas l'ID de socket du paquet. C'est une histoire complètement différente ... – Simone

+0

Je vois .. J'ai trouvé une fonction intéressante cependant: WSADuplicateSocket(), mais je ne peux pas trouver un exemple décent n'importe où. – Nick

0

socket()socket() renvoie un descripteur de fichier si c'est ce que vous appelez un ID de socket, alors les moyens de l'obtenir sans la collaboration du processus sous Windows sont limités. FWIW sur Linux FD ouverts sont énumérés dans le système de fichiers proc. Cela étant dit, la seule chose que vous pourriez faire avec le fd est d'envoyer des informations supplémentaires à partir du socket. Vous pouvez également lire à partir du fd, mais toutes les données lues de cette manière ne seront pas envoyées à l'application propriétaire du socket. Sans une certaine coordination, ce ne serait probablement pas ce que vous désirez, car vous obtiendriez simplement des bribes de données. Si vous voulez juste être capable d'écouter le trafic de votre programme, alors quelque chose comme le filtrage de paquets devrait être suffisant, donc je suppose que vous voulez vraiment être comme un homme au milieu pour cela.

Si c'est le cas, alors la meilleure chose à faire serait de configurer votre application comme proxy pour votre autre service. J'entends par là un programme qui ouvre un port d'écoute et accepte les connexions lorsqu'une connexion est établie, il doit immédiatement ouvrir sa propre connexion à une combinaison IP: port préconfigurée et commencer à transférer le trafic. Une fois que cela est écrit, il est très simple d'inspecter le trafic avant de le transférer et éventuellement de le modifier.

Si votre programme est un serveur, exécutez-le sur un port non standard, configurez cette application pour ouvrir le port normal du serveur, puis transférez les connexions vers le port non standard que vous avez configuré sur localhost.

Si votre programme est un client, pointez simplement l'application d'intercepteur sur le serveur et choisissez un port d'écoute aléatoire sur votre boîte. Configurez ensuite le client pour qu'il se connecte à ce port d'écoute comme s'il s'agissait du serveur.

Cela devrait fonctionner pour à peu près n'importe quoi. Le seul inconvénient est que si le trafic est crypté, vous ne pourrez (évidemment) pas l'inspecter/le modifier. Cela revient à placer votre application derrière un NAT.

1

Cette bibliothèque: SharpPcap promet de capturer, d'injecter, d'analyser et de générer des paquets en utilisant n'importe quel langage .NET tel que C# et VB.NET (more info).

C'est la bibliothèque utilisée par Wireshark et il est certain qu'elle peut capturer et analyser.

+0

Oui, c'est ce que Cristian a dit. J'apprécie votre aide, mais SharpPcap n'a pas une telle option malheureusement. – Nick