Określanie, jaki proces związał port (bez nasłuchiwania) w systemie Windows

12

Jeśli chcę dowiedzieć się, jaki proces nasłuchuje na jakim gnieździe, mogę użyć netstat / TCPview i natychmiast go zobaczę. Możliwe jest jednak powiązanie z adresem bez odsłuchiwania. Jeśli to zrobisz, nie pojawi się w netstat / TCPview, ale zablokuje gniazdo.

Przykład w języku Python:

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

Port jest teraz powiązany, a próba wykonania tego samego kodu w drugiej instancji, gdy pierwsza jest nadal uruchomiona, spowoduje błąd. Jednak dopóki nie zaczniesz nasłuchiwać na tym porcie za pomocą

s.listen(1)

port nie pojawia się w netstat / TCPview.

Pytanie brzmi: czy można zobaczyć, które porty są powiązane (ale nie nasłuchują) i który proces je wiąże?

Tłem tego jest to, że miałem ruchomy zakres portów z 1976 r., Których nie można związać , i chcę wiedzieć, co to powoduje. W międzyczasie ustaliłem metodą prób i błędów, że Udostępnianie połączenia internetowego blokuje te porty, ale nadal jestem ciekawy odpowiedzi na to pytanie.

Edycja: Z powodu popularnego żądania, oto kod, którego użyłem do znalezienia tych portów:

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"

(możesz przesłać dane wyjściowe do grep i filtrować tylko dla FAIL)

Jan Schejbal
źródło
Możesz zapętlić ten skrypt od 0 do 65535, zarejestrować porty, na których się nie powiedzie i porównać wynik z portami netstat. Te, których nie ma na liście w netstat, powinny być tym, czego szukasz. Nie znam żadnego narzędzia ani techniki, która pokazałaby proces za tymi portami, chyba że nasłuchuje.
Kedar
@Kedar: Właśnie to zrobiłem, aby dowiedzieć się, których portów dotyczy.
Jan Schejbal,
@Lizz: opublikowano kod.
Jan Schejbal
czy możesz to opublikować jako odpowiedź? dobrze byłoby mieć jako odniesienie :)
Lizz
@Lizz: To nie jest odpowiedź na pytanie. Pokazuje, których portów dotyczy, ale nie zajmuje ich.
Jan Schejbal

Odpowiedzi:

1

powinieneś użyć

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

z

TableClass value = TCP_TABLE_OWNER_PID_ALL ”lub„ TCP_TABLE_OWNER_PID_CONNECTIONS ”lub„ TCP_TABLE_OWNER_PID_LISTENER

Struktura pTcpTable -> MIB_TCPTABLE_OWNER_PID

w zależności od informacji, które chcesz odzyskać

EDYTOWAĆ:

TCP_TABLE_OWNER_PID_ALL zwraca strukturę MIB_TCPTABLE_OWNER_PID, która jest tablicą struktur MIB_TCPROW_OWNER_PID, w których każdy dwStatepowinien mieć, MIB_TCP_STATE_CLOSEDgdy jest związany i nie nasłuchuje, ta struktura oferuje również dwLocalAddridwLocalPort

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;
Poklepać
źródło
To tylko lista gniazd, które są jednocześnie powiązane i nasłuchują, ale pytanie dotyczyło konkretnie gniazd, które są powiązane, ale nie nasłuchują.
Luke Dunstan
twierdzisz czy pytasz? patrz edycja
Pat
Kiedy uruchamiam pastebin.com/vaHMVRQR, nie widzę nic w tabeli do wiązania bez słuchania (Win7)
Luke Dunstan
Zaangażowane struktury mają określone wyrównania, nie należy ich ponownie definiować; powinieneś odwołać się do tych, które są zdefiniowane przez stwardnienie rozsiane. Także jeśli chcesz początkowo przetestować MS API Python nie jest właściwym narzędziem; zamiast tego powinieneś użyć C / C ++.
Pat
wyświetlany kod nie podaje informacji o gniazdach, które są powiązane, ale niepodłączone; w ostatnich wersjach netstat istnieje teraz parametr wiersza polecenia -q, który pokazuje te gniazda
zentrunix
0

W najnowszych wersjach netstat istnieje teraz parametr wiersza polecenia -q, który pokazuje te gniazda.

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

Przykład zastosowania:

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

Wygląda na to, że nie ma publicznego interfejsu API do pobierania gniazd w takiej sytuacji. Zobacz moje pytanie w StackOverflow .

zentrunix
źródło