การกำหนดกระบวนการที่ผูกพอร์ต (โดยไม่ฟัง) บน Windows


12

หากฉันต้องการทราบว่ากระบวนการใดกำลังฟังซ็อกเก็ตใดฉันสามารถใช้ netstat / TCPview และจะเห็นทันที อย่างไรก็ตามมันเป็นไปได้ที่จะผูกที่อยู่โดยไม่ต้องฟัง หากทำเสร็จแล้วจะไม่ปรากฏใน netstat / TCPview แต่จะบล็อกซ็อกเก็ต

ตัวอย่าง Python:

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

ขณะนี้พอร์ตถูกผูกไว้และการพยายามเรียกใช้รหัสเดียวกันในอินสแตนซ์ที่สองในขณะที่พอร์ตแรกยังทำงานอยู่จะส่งผลให้เกิดข้อผิดพลาด อย่างไรก็ตามเว้นแต่คุณจะเริ่มฟังพอร์ตนั้นโดยใช้

s.listen(1)

พอร์ตไม่ปรากฏขึ้นใน netstat / TCPview

คำถามคือ: เป็นไปได้ไหมที่จะเห็นว่าพอร์ตใดถูกผูกไว้ (แต่ไม่ฟัง) และกระบวนการใดที่ผูกมัดพวกเขา

พื้นหลังของเรื่องนี้ก็คือว่าผมได้มีช่วงการเคลื่อนย้าย 1976 พอร์ตที่ไม่สามารถจะผูกพันและฉันต้องการที่จะรู้ว่าสิ่งที่ทำให้เกิดนี้ ในระหว่างนี้ฉันพิจารณาจากการลองผิดลองถูกที่ Internet Connection Sharing กำลังบล็อกพอร์ตเหล่านั้น แต่ฉันก็ยังสงสัยเกี่ยวกับคำตอบของคำถามนี้

แก้ไข:เนื่องจากคำขอยอดนิยมนี่คือรหัสที่ฉันใช้ในการค้นหาพอร์ตเหล่านั้น:

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"

(คุณอาจต้องการไพพ์เอาต์พุตเป็น grep และตัวกรองสำหรับ FAIL เท่านั้น)


คุณสามารถวนลูปสคริปต์นี้จาก 0 ถึง 65535 ล็อกพอร์ตที่ล้มเหลวและเปรียบเทียบผลลัพธ์กับพอร์ต netstat สิ่งที่ไม่ปรากฏใน netstat ควรเป็นสิ่งที่คุณกำลังมองหา ฉันไม่รู้เครื่องมือหรือเทคนิคใด ๆ ที่จะแสดงให้คุณเห็นว่ากระบวนการใดที่อยู่เบื้องหลังพอร์ตเหล่านั้นเว้นแต่ว่ากำลังรับฟังอยู่
Kedar

@Kedar: นั่นคือสิ่งที่ฉันทำเพื่อค้นหาพอร์ตที่ได้รับผลกระทบ
Jan Schejbal

@Lizz: รหัสโพสต์
Jan Schejbal

คุณสามารถโพสต์ไว้เป็นคำตอบได้ไหม? จะเป็นการดีถ้ามีการอ้างอิง :)
Lizz

@Lizz: มันไม่ใช่คำตอบสำหรับคำถาม แสดงพอร์ตที่ได้รับผลกระทบ แต่ไม่ใช่สิ่งที่ครอบครอง
Jan Schejbal

คำตอบ:


1

คุณควรใช้

DWORD GetExtendedTcpTable (PVOID pTcpTable, PDWORD pdwSize, BOOL bOrder, ULONG ulAf, TCP_TABLE_CLASS TableClass, ULONG ที่สงวนไว้);

กับ

TableClass value = TCP_TABLE_OWNER_PID_ALL "หรือ" TCP_TABLE_OWNER_PID_CONNECTIONS "หรือ" TCP_TABLE_OWNER_PID_LISTENER "

pTcpTable โครงสร้าง -> MIB_TCPTABLE_OWNER_PID

ขึ้นอยู่กับข้อมูลที่คุณต้องการดึง

แก้ไข:

TCP_TABLE_OWNER_PID_ALL ส่งคืนโครงสร้าง MIB_TCPTABLE_OWNER_PID ที่เป็นอาร์เรย์ของโครงสร้าง MIB_TCPROW_OWNER_PID ที่แต่ละdwStateควรมีMIB_TCP_STATE_CLOSEDเมื่อถูกผูกไว้และไม่ฟังโครงสร้างนี้ยังมีdwLocalAddrและdwLocalPort

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

เมื่อฉันเรียกใช้pastebin.com/vaHMVRQRฉันไม่ได้อะไรเลยในการผูกโดยไม่ต้องฟัง (Win7)
ลุคดันสแตน

โครงสร้างที่เกี่ยวข้องมีการจัดตำแหน่งเฉพาะคุณไม่ควรกำหนดโครงสร้างเหล่านั้นอีกครั้ง คุณควรอ้างอิงสิ่งที่ MS กำหนดไว้ นอกจากนี้หากคุณต้องการทดสอบ MS API Python ในขั้นต้นไม่ใช่เครื่องมือที่เหมาะสม คุณควรใช้ C / C ++ แทน
Pat

รหัสตามที่แสดงไม่ได้ให้ข้อมูลเกี่ยวกับซ็อกเก็ตที่ถูกผูกไว้ แต่ไม่ได้เชื่อมต่อ ใน netstat เวอร์ชันล่าสุดขณะนี้มีพารามิเตอร์บรรทัดคำสั่ง -q ที่แสดงซ็อกเก็ตเหล่านั้น
zentrunix

0

ใน netstat เวอร์ชันล่าสุดขณะนี้มีพารามิเตอร์บรรทัดคำสั่ง -q ที่แสดงซ็อกเก็ตเหล่านั้น

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

ตัวอย่างการใช้งาน:

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

ดูเหมือนว่าจะไม่มี API สาธารณะสำหรับรับซ็อกเก็ตในสถานการณ์นั้น ดูของฉันคำถามใน StackOverflow

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.