Déterminer quel processus a lié un port (sans écouter) sous Windows

12

Si je veux savoir quel processus écoute sur quel socket, je peux utiliser netstat / TCPview et le verrai immédiatement. Cependant, il est possible de se lier à une adresse sans l'écouter. Si cela est fait, il n'apparaît pas dans netstat / TCPview, mais bloque le socket.

Exemple Python:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0',12345))

Le port est maintenant lié et toute tentative d'exécution du même code dans une seconde instance alors que la première est toujours en cours d'exécution entraînera une erreur. Cependant, à moins que vous ne commenciez réellement à écouter sur ce port en utilisant

s.listen(1)

le port n'apparaît pas dans netstat / TCPview.

La question est: est-il possible de voir quels ports sont liés (mais pas à l'écoute), et quel processus les lie?

L'arrière - plan de c'est que j'ai eu une gamme mobile de ports de 1976 qui ne peuvent être liés , et je veux savoir ce qui cause cela. Dans l'intervalle, j'ai déterminé par essais et erreurs que le partage de connexion Internet bloquait ces ports, mais je suis toujours curieux de savoir la réponse à cette question.

Edit: En raison de la demande populaire, voici le code que j'ai utilisé pour trouver ces ports:

import time
import socket

for i in range(0,65536):
    try:
        print "Listening on port", i, '...', 
        serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        serversocket.bind(('0.0.0.0', i))
        serversocket.listen(5)
        #time.sleep(0.1)
        serversocket.close()
        print "ok"
    except:
        print "FAIL"

(vous voudrez peut-être diriger la sortie vers grep et filtrer pour FAIL uniquement)

Jan Schejbal
la source
Vous pouvez boucler ce script de 0 à 65535, consigner les ports sur lesquels il échoue et comparer le résultat avec les ports netstat. Celles qui ne figurent pas dans netstat devraient être ce que vous recherchez. Je ne connais aucun outil ou technique qui vous montrera quel processus se trouve derrière ces ports, sauf s'il écoute.
Kedar
@Kedar: C'est exactement ce que j'ai fait pour savoir quels ports sont affectés.
Jan Schejbal
@Lizz: Code publié.
Jan Schejbal
pourriez-vous l'afficher comme réponse? serait bien d'avoir comme référence :)
Lizz
@Lizz: Ce n'est pas une réponse à la question. Il montre quels ports sont affectés, mais pas ce qui les occupe.
Jan Schejbal

Réponses:

1

Tu devrais utiliser

DWORD GetExtendedTcpTable (PVOID pTcpTable, PDWORD pdwSize, BOOL bOrder, ULONG ulAf, TCP_TABLE_CLASS TableClass, ULONG Reserved);

avec

Valeur TableClass = TCP_TABLE_OWNER_PID_ALL "ou" TCP_TABLE_OWNER_PID_CONNECTIONS "ou" TCP_TABLE_OWNER_PID_LISTENER

Structure de pTcpTable -> MIB_TCPTABLE_OWNER_PID

en fonction des informations que vous souhaitez récupérer

ÉDITER:

TCP_TABLE_OWNER_PID_ALL renvoie la structure MIB_TCPTABLE_OWNER_PID qui est un tableau de structures MIB_TCPROW_OWNER_PID où chacune dwStatedevrait avoir une MIB_TCP_STATE_CLOSEDfois liée et non à l'écoute, cette structure offre également dwLocalAddretdwLocalPort

typedef struct _MIB_TCPROW_OWNER_PID {
  DWORD dwState;
  DWORD dwLocalAddr;
  DWORD dwLocalPort;
  DWORD dwRemoteAddr;
  DWORD dwRemotePort;
  DWORD dwOwningPid;
} MIB_TCPROW_OWNER_PID, *PMIB_TCPROW_OWNER_PID;
Tapoter
la source
Cela répertorie uniquement les sockets qui sont à la fois liées et à l'écoute, mais la question portait spécifiquement sur les sockets qui sont liées mais pas à l'écoute.
Luke Dunstan
affirmez-vous ou demandez-vous ??? voir le montage
Pat
Lorsque je lance pastebin.com/vaHMVRQR, je ne reçois rien dans le tableau pour bind sans écouter (Win7)
Luke Dunstan
Les structures impliquées ont des alignements particuliers, vous ne devez pas les redéfinir; vous devez référencer ceux qui sont définis par MS. De plus, si vous voulez tester initialement un MS API, Python n'est pas le bon outil; vous devriez plutôt utiliser C / C ++.
Pat
le code tel qu'il est affiché ne donne pas d'informations sur les sockets qui sont liées mais non connectées; dans les versions récentes de netstat, il y a maintenant un paramètre de ligne de commande -q qui montre ces sockets
zentrunix
0

Dans les versions récentes de netstat, il existe désormais un paramètre de ligne de commande -q qui affiche ces sockets.

$ netstat -?

Displays protocol statistics and current TCP/IP network connections.

NETSTAT [-a] [-b] [-e] [-f] [-n] [-o] [-p proto] [-r] [-s] [-x] [-t] [interval]

  -a            Displays all connections and listening ports.
  -b            Displays the executable involved in creating...
  ...
  -p proto      Shows connections for the protocol specified...
  -q            Displays all connections, listening ports, and bound
                nonlistening TCP ports. Bound nonlistening ports may or may not
                be associated with an active connection.
  -r            Displays the routing table.
  ...

Exemple d'utilisation:

$ netstat -nq -p tcp

Active Connections

  Proto  Local Address          Foreign Address        State
  TCP    0.0.0.0:7              0.0.0.0:0              LISTENING
  TCP    0.0.0.0:9              0.0.0.0:0              LISTENING
  TCP    0.0.0.0:13             0.0.0.0:0              LISTENING
  ...

 TCP    192.168.122.157:50059  54.213.66.195:443      ESTABLISHED
  TCP    0.0.0.0:49676          0.0.0.0:0              BOUND
  TCP    0.0.0.0:49700          0.0.0.0:0              BOUND
  TCP    0.0.0.0:49704          0.0.0.0:0              BOUND
  TCP    0.0.0.0:49705          0.0.0.0:0              BOUND
  ...

Il semble qu'il n'y ait pas d'API publique pour obtenir les sockets dans cette situation. Voir ma question dans StackOverflow .

zentrunix
la source