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

12

Se eu quiser descobrir qual processo está escutando em qual soquete, posso usar o netstat / TCPview e o vejo imediatamente. No entanto, é possível vincular a um endereço sem ouvir. Se isso for feito, ele não será exibido 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 está agora ligada e a tentativa de executar o mesmo código em uma segunda instância enquanto a primeira ainda estiver em execução resultará em um erro. No entanto, a menos que você realmente comece a ouvir nessa porta usando

s.listen(1)

a porta não aparece no netstat / TCPview.

A questão é: é possível ver quais portas estão ligadas (mas não estão escutando) e qual processo as está vinculando?

O fundo deste é que eu tinha uma faixa de movimento de 1976 portas que não podem ser vinculados , e eu 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 sobre a resposta a essa pergunta.

Edit: Devido ao pedido popular, aqui está o código que eu 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 canalizar a saída para grep e filtrar apenas FAIL)

Jan Schejbal
fonte
Você pode fazer um loop desse script de 0 a 65535, registrar as portas nas quais ele falha e comparar o resultado com as portas netstat. Os que não estão listados no netstat devem ser o que você está procurando. Não conheço nenhuma ferramenta ou técnica que mostre qual processo está por trás dessas portas, a menos que esteja escutando.
Kedar
@Kedar: Foi exatamente o que fiz para descobrir quais portas são afetadas.
Jan Schejbal
@Lizz: Código postado.
Jan Schejbal
você poderia publicá-lo como resposta? seria bom ter como referência :)
Lizz
@Lizz: Não é uma resposta para a pergunta. Mostra quais portas são afetadas, mas não o que as ocupa.
Jan Schejbal

Respostas:

1

você deveria usar

DWORD GetExtendedTcpTable (PVOID pTcpTable, PDWORD pdwSize, ORDEM BOOL, ULONG ulAf, TCP_TABLE_CLASS TableClass, ULONG reservado);

com

Valor de 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 da informação que você deseja recuperar

EDITAR:

TCP_TABLE_OWNER_PID_ALL retorna a estrutura MIB_TCPTABLE_OWNER_PID que é uma matriz de estruturas MIB_TCPROW_OWNER_PID onde cada uma dwStatedeve ter MIB_TCP_STATE_CLOSEDquando ligada e não escuta, essa 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;
Pat
fonte
Isso lista apenas os soquetes que estão vinculados e os que estão ouvindo, mas a pergunta foi especificamente sobre soquetes que estão vinculados, mas não estão ouvindo.
Luke Dunstan
você está afirmando ou perguntando ??? veja a edição
Pat
Quando eu executo pastebin.com/vaHMVRQR I get nada na mesa para ligação sem ouvir (Win7)
Luke Dunstan
As estruturas envolvidas têm alinhamentos específicos; você não deve redefini-las; você deve fazer referência aos que são definidos pelo MS. Além disso, se você deseja testar inicialmente uma API do MS Python, não é a ferramenta certa; você deve usar C / C ++.
Pat
o código exibido não fornece informações sobre soquetes que estão vinculados, mas não conectados; nas versões recentes do netstat agora existe uma linha de comando parâmetro -q que mostra esses soquetes
zentrunix
0

Nas versões recentes do netstat, agora existe 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 minha pergunta no StackOverflow .

zentrunix
fonte