Ermitteln, welcher Prozess einen Port unter Windows gebunden hat (ohne ihn abzuhören)

12

Wenn ich herausfinden will, welcher Prozess auf welchem ​​Socket lauscht , kann ich netstat / TCPview verwenden und sehe es sofort. Es ist jedoch möglich, eine Verbindung zu einer Adresse herzustellen, ohne sie abzuhören. In diesem Fall wird es nicht in netstat / TCPview angezeigt, sondern blockiert den Socket.

Python-Beispiel:

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

Der Port ist jetzt gebunden, und der Versuch, denselben Code in einer zweiten Instanz auszuführen, während die erste noch ausgeführt wird, führt zu einem Fehler. Es sei denn, Sie lauschen tatsächlich über diesen Port

s.listen(1)

Der Port wird in netstat / TCPview nicht angezeigt.

Die Frage ist: Ist es möglich zu sehen, welche Ports gebunden sind (aber nicht abhören) und welcher Prozess sie bindet?

Der Hintergrund dafür ist , dass ich habe einen hatte Bewegungsbereich von 1976 Ports , die nicht gebunden werden können , und ich möchte wissen , was dies verursacht. In der Zwischenzeit habe ich durch Ausprobieren festgestellt, dass die gemeinsame Nutzung der Internetverbindung diese Ports blockiert, bin aber immer noch neugierig auf die Antwort auf diese Frage.

Bearbeiten: Auf vielfachen Wunsch ist hier der Code, mit dem ich diese Ports gefunden habe:

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"

(Möglicherweise möchten Sie die Ausgabe an grep leiten und nur nach FAIL filtern.)

Jan Schejbal
quelle
Sie können dieses Skript in einer Schleife von 0 bis 65535 ausführen, die Ports protokollieren, an denen es fehlschlägt, und das Ergebnis mit den netstat-Ports vergleichen. Diejenigen, die nicht in netstat aufgeführt sind, sollten das sein, wonach Sie suchen. Ich kenne keine Tools oder Techniken, die Ihnen zeigen, welcher Prozess sich hinter diesen Ports befindet, es sei denn, er hört zu.
Kedar
@Kedar: Genau das habe ich gemacht, um herauszufinden, welche Ports betroffen sind.
Jan Schejbal
@ Lizz: Code gepostet.
Jan Schejbal
könntest du es als Antwort posten? wäre gut, als Referenz zu haben :)
Lizz
@ Lizz: Es ist keine Antwort auf die Frage. Es wird angezeigt, welche Ports betroffen sind, aber nicht, was sie belegt.
Jan Schejbal

Antworten:

1

du solltest benutzen

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

mit

TableClass-Wert = TCP_TABLE_OWNER_PID_ALL "oder" TCP_TABLE_OWNER_PID_CONNECTIONS "oder" TCP_TABLE_OWNER_PID_LISTENER "

pTcpTable-Struktur -> MIB_TCPTABLE_OWNER_PID

Abhängig von den Informationen, die Sie abrufen möchten

BEARBEITEN:

TCP_TABLE_OWNER_PID_ALL gibt MIB_TCPTABLE_OWNER_PID Struktur , die ein Array von MIB_TCPROW_OWNER_PID Strukturen ist , wo jeder dwStatehaben sollte , MIB_TCP_STATE_CLOSEDwenn gebunden und nicht hören, diese Struktur auch Angebote dwLocalAddrunddwLocalPort

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;
Klopfen
quelle
Dies listet nur Sockets auf, die sowohl gebunden sind als auch lauschen, aber die Frage betraf speziell Sockets, die gebunden sind, aber nicht lauschen.
Luke Dunstan
behauptest du oder fragst du ??? siehe die Bearbeitung
Pat
Wenn ich pastebin.com/vaHMVRQR ausführe, bekomme ich nichts zum Binden in der Tabelle, ohne zuzuhören (Win7)
Luke Dunstan
Die beteiligten Strukturen haben bestimmte Ausrichtungen. Sie sollten sie nicht neu definieren. Sie sollten sich auf diejenigen beziehen, die von MS definiert wurden. Auch wenn Sie eine MS-API zum ersten Mal testen möchten, ist Python nicht das richtige Tool. Sie sollten stattdessen C / C ++ verwenden.
Pat
Der angezeigte Code gibt keine Informationen über Sockets an, die gebunden, aber nicht verbunden sind. in neueren versionen von netstat gibt es jetzt einen
befehlszeilenparameter
0

In neueren Versionen von netstat gibt es jetzt einen Befehlszeilenparameter -q, der diese Sockets anzeigt.

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

Anwendungsbeispiel:

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

Es scheint, dass es in dieser Situation keine öffentliche API gibt, um die Sockets abzurufen. Siehe meine Frage in StackOverflow .

zentrunix
quelle