Determinar qué proceso ha vinculado un puerto (sin escuchar) en Windows

12

Si quiero averiguar qué proceso está escuchando en qué socket, puedo usar netstat / TCPview y lo veré de inmediato. Sin embargo, es posible enlazar a una dirección sin escuchar. Si se hace esto, no aparece en netstat / TCPview, pero bloquea el socket.

Ejemplo de Python:

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

El puerto ahora está vinculado, e intentar ejecutar el mismo código en una segunda instancia mientras la primera aún se está ejecutando dará como resultado un error. Sin embargo, a menos que realmente comience a escuchar en ese puerto usando

s.listen(1)

el puerto no aparece en netstat / TCPview.

La pregunta es: ¿es posible ver qué puertos están vinculados (pero no están escuchando) y qué proceso los vincula?

El fondo de esto es que yo he tenido un rango de movimiento de 1976 puertos que no se pueden unir , y quiero saber lo que causa esto. Mientras tanto, determiné mediante prueba y error que la Conexión compartida a Internet estaba bloqueando esos puertos, pero todavía tengo curiosidad acerca de la respuesta a esta pregunta.

Editar: debido a una solicitud popular, aquí está el código que utilicé para encontrar esos puertos:

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"

(es posible que desee canalizar la salida a grep y filtrar solo para FAIL)

Jan Schejbal
fuente
Puede repetir este script de 0 a 65535, registrar los puertos en los que falla y comparar el resultado con los puertos netstat. Los que no figuran en netstat deben ser lo que está buscando. No conozco ninguna herramienta o técnica que le muestre qué proceso hay detrás de esos puertos, a menos que esté escuchando.
Kedar
@ Kedar: Eso es exactamente lo que hice para averiguar qué puertos están afectados.
Jan Schejbal
@Lizz: Código publicado.
Jan Schejbal
¿podrías publicarlo como la respuesta? sería bueno tener como referencia :)
Lizz
@Lizz: No es una respuesta a la pregunta. Muestra qué puertos están afectados, pero no qué los está ocupando.
Jan Schejbal

Respuestas:

1

Deberías usar

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

con

Valor de TableClass = TCP_TABLE_OWNER_PID_ALL "o" TCP_TABLE_OWNER_PID_CONNECTIONS "o" TCP_TABLE_OWNER_PID_LISTENER

pTcpTable structure -> MIB_TCPTABLE_OWNER_PID

dependiendo de la información que le gustaría recuperar

EDITAR:

TCP_TABLE_OWNER_PID_ALL devuelve la estructura MIB_TCPTABLE_OWNER_PID que es una matriz de estructuras MIB_TCPROW_OWNER_PID donde cada uno dwStatedebe tener MIB_TCP_STATE_CLOSEDcuando está vinculado y no escucha, esta estructura también ofrece dwLocalAddrydwLocalPort

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;
Palmadita
fuente
Esto solo enumera los zócalos que están vinculados y están escuchando, pero la pregunta era específicamente sobre los zócalos que están vinculados pero no están escuchando.
Luke Dunstan
¿estás afirmando o preguntando? ver la edición
Pat
Cuando ejecuto pastebin.com/vaHMVRQR no obtengo nada en la mesa para vincular sin escuchar (Win7)
Luke Dunstan
Las estructuras involucradas tienen alineaciones particulares, no debe redefinirlas; debe hacer referencia a los definidos por MS. Además, si desea probar inicialmente un MS API Python no es la herramienta adecuada; deberías usar C / C ++ en su lugar.
Pat
el código que se muestra no proporciona información sobre los sockets que están vinculados pero no conectados; en versiones recientes de netstat ahora hay un parámetro de línea de comando -q que muestra esos sockets
zentrunix
0

En versiones recientes de netstat ahora hay un parámetro de línea de comando -q que muestra esos 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.
  ...

Ejemplo de uso:

$ 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
  ...

Parece que no hay una API pública para obtener los sockets en esa situación. Vea mi pregunta en StackOverflow .

zentrunix
fuente