Determinare quale processo ha associato una porta (senza ascolto) su Windows


12

Se voglio scoprire quale processo è in ascolto su quale socket, posso usare netstat / TCPview e lo vedrò immediatamente. Tuttavia, è possibile associare un indirizzo senza ascoltare. In questo caso, non viene visualizzato in netstat / TCPview, ma blocca il socket.

Esempio Python:

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

La porta è ora associata e il tentativo di eseguire lo stesso codice in una seconda istanza mentre la prima è ancora in esecuzione comporterà un errore. Tuttavia, a meno che tu non inizi effettivamente ad ascoltare su quella porta usando

s.listen(1)

la porta non viene visualizzata in netstat / TCPview.

La domanda è: è possibile vedere quali porte sono collegate (ma non in ascolto) e quale processo le sta vincolando?

Lo sfondo di questo è che ho ho avuto una serie commovente di 1976 porte che non possono essere legati , e voglio sapere che cosa provoca questo. Nel frattempo, ho scoperto, attraverso prove ed errori, che la Condivisione connessione Internet stava bloccando quelle porte, ma sono ancora curioso di sapere la risposta a questa domanda.

Modifica: a causa della richiesta popolare, ecco il codice che ho usato per trovare quelle porte:

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"

(potresti voler reindirizzare l'output a grep e filtrare solo per FAIL)


È possibile eseguire il looping di questo script da 0 a 65535, registrare le porte su cui non funziona e confrontare il risultato con le porte netstat. Quelli non elencati in netstat dovrebbero essere quello che stai cercando. Non conosco nessuno strumento o tecnica che ti mostrerà quale processo è dietro quelle porte, a meno che non sia in ascolto.
Kedar,

@Kedar: Questo è esattamente quello che ho fatto per scoprire quali porte sono interessate.
Jan Schejbal,

@Lizz: codice pubblicato.
Jan Schejbal,

potresti postarlo come risposta? sarebbe bello avere come riferimento :)
Lizz

@Lizz: non è una risposta alla domanda. Mostra quali porte sono interessate, ma non ciò che le sta occupando.
Jan Schejbal,

Risposte:


1

dovresti usare

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

con

Valore TableClass = TCP_TABLE_OWNER_PID_ALL "o" TCP_TABLE_OWNER_PID_CONNECTIONS "o" TCP_TABLE_OWNER_PID_LISTENER

pTcpTable table -> MIB_TCPTABLE_OWNER_PID

a seconda delle informazioni che desideri recuperare

MODIFICARE:

TCP_TABLE_OWNER_PID_ALL restituisce la struttura MIB_TCPTABLE_OWNER_PID che è una matrice di strutture MIB_TCPROW_OWNER_PID in cui ognuna dwStatedovrebbe avere una MIB_TCP_STATE_CLOSEDvolta associata e non in ascolto, questa struttura offre anche 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;

Questo elenca solo socket che sono sia associati che in ascolto, ma la domanda riguardava specificamente i socket che sono associati ma non in ascolto.
Luke Dunstan,

stai affermando o chiedendo ??? vedi la modifica
Pat

Quando eseguo pastebin.com/vaHMVRQR non ottengo nulla nella tabella per il bind senza ascoltare (Win7)
Luke Dunstan

Le strutture coinvolte hanno particolari allineamenti, non è necessario ridefinirle; dovresti fare riferimento a quelli definiti dalla SM. Inoltre, se si desidera testare inizialmente un'API MS Python non è lo strumento giusto; dovresti usare invece C / C ++.
Pat

il codice visualizzato non fornisce informazioni sui socket associati ma non connessi; nelle recenti versioni di netstat ora esiste un parametro della riga di comando -q che mostra quei socket
zentrunix,

0

Nelle versioni recenti di netstat esiste ora un parametro della riga di comando -q che mostra quei socket.

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

Esempio di utilizzo:

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

Sembra che non ci siano API pubbliche per ottenere i socket in quella situazione. Vedi la mia domanda in StackOverflow .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.