Determinando qual processo vinculou uma porta (sem escutar) no Windows

Determinando qual processo vinculou uma porta (sem escutar) no Windows

Se eu quiser descobrir qual é o processoaudiçãoem qual soquete, posso usar netstat/TCPview e o verei imediatamente. No entanto, é possível vincular-se a um endereço sem escutar. Se isso for feito, ele não aparecerá no netstat/TCPview, mas bloqueará o soquete.

Exemplo de Python:

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

A porta agora está vinculada e a tentativa de executar o mesmo código em uma segunda instância enquanto a primeira ainda está em execução resultará em erro. No entanto, a menos que você realmente comece a escutar nessa porta usando

s.listen(1)

a porta não aparece no netstat/TCPview.

A questão é: É possível ver quais são as portasvinculado(mas não ouvindo), e qual processo os está vinculando?

O pano de fundo disso é que tive umfaixa móvel de portas de 1976 que não podem ser vinculadas, e quero saber o que causa isso. Enquanto isso, determinei por tentativa e erro que o Compartilhamento de Conexão com a Internet estava bloqueando essas portas, mas ainda estou curioso para saber a resposta a esta pergunta.

Editar:Devido à solicitação popular, aqui está o código que usei para encontrar essas portas:

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"

(você pode querer canalizar a saída para grep e filtrar apenas para FAIL)

Responder1

Eu tive que fazer exatamente isso hoje. O Powershell pode fazer isso com o Get-NetTCPConnection.

PS C:\WINDOWS\system32> Get-NetTCPConnection -LocalPort 53100

LocalAddress                        LocalPort RemoteAddress                       RemotePort State       AppliedSetting OwningProcess
------------                        --------- -------------                       ---------- -----       -------------- -------------
0.0.0.0                             53100     0.0.0.0                             0          Bound                      40120


PS C:\WINDOWS\system32> get-process -PID 40120

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
   2133    1331    13884      30740  30,955.31  40120   1 HWMonitorPro

Responder2

Nas versões recentes do netstat existe agora um parâmetro de linha de comando -q que mostra esses soquetes.

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

Exemplo 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 não existe uma API pública para obter os soquetes nessa situação. Veja meupergunta no StackOverflow.

Responder3

você deveria usar

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

com

Valor TableClass = TCP_TABLE_OWNER_PID_ALL "ou" TCP_TABLE_OWNER_PID_CONNECTIONS "ou" TCP_TABLE_OWNER_PID_LISTENER

Estrutura pTcpTable -> MIB_TCPTABLE_OWNER_PID

dependendo das informações que você deseja recuperar

EDITAR:

TCP_TABLE_OWNER_PID_ALL retorna a estrutura MIB_TCPTABLE_OWNER_PID que é um array de estruturas MIB_TCPROW_OWNER_PID onde cada uma dwStatedeve ter MIB_TCP_STATE_CLOSEDquando ligada e não escutando, esta estrutura também oferece dwLocalAddredwLocalPort

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;

informação relacionada