如何用Python捕获特定Windows进程(.exe)的网络流量?
捕获Windows特定进程的网络流量
要实现仅捕获特定.exe进程的网络流量,核心思路是先找到进程对应的本地端口,再针对这些端口进行嗅探——因为Scapy本身无法直接关联进程和数据包,需要结合Windows的网络连接信息完成映射。
具体步骤及代码实现
获取目标进程的PID
用psutil遍历系统进程,匹配目标进程名获取PID:import psutil target_process = "some_app.exe" process_pid = None for process in psutil.process_iter(['pid', 'name']): if process.info['name'].lower() == target_process.lower(): process_pid = process.info['pid'] break if not process_pid: print(f"未找到进程 {target_process}") exit()获取进程对应的本地端口
通过psutil的net_connections方法,筛选出该PID对应的所有TCP/UDP连接的本地端口:def get_process_ports(pid): ports = set() try: connections = psutil.Process(pid).connections(kind='inet') for conn in connections: # 收集本地端口,不受连接状态限制 ports.add(conn.laddr.port) except psutil.AccessDenied: print("权限不足,无法获取进程网络连接信息") return list(ports) process_ports = get_process_ports(process_pid) if not process_ports: print("该进程当前无活跃网络连接端口") exit()用Scapy针对目标端口嗅探流量
把获取到的端口拼接成过滤规则,传入Scapy的sniff函数:from scapy.all import * def capture_traffic(packet): if packet.haslayer(IP): # 区分TCP和UDP,打印关键流量信息 if packet.haslayer(TCP): print(f"TCP | 本地端口: {packet[TCP].dport} | 远程地址: {packet[IP].src}:{packet[TCP].sport}") elif packet.haslayer(UDP): print(f"UDP | 本地端口: {packet[UDP].dport} | 远程地址: {packet[IP].src}:{packet[UDP].sport}") # 构建过滤规则:匹配所有目标端口的TCP/UDP流量 port_filter = " or ".join([f"(tcp port {port} or udp port {port})" for port in process_ports]) sniff(filter=port_filter, prn=capture_traffic)
注意事项
- 权限要求:运行脚本需要管理员权限,否则无法获取进程的网络连接信息或进行数据包嗅探。
- 动态端口更新:如果进程后续新建网络连接(使用新端口),当前脚本不会自动捕获,需重新运行或添加定时刷新端口的逻辑。
- 流量方向控制:上述过滤规则会捕获目标端口的进出流量,若需区分方向,可在过滤规则中添加
src port或dst port的限定。
内容的提问来源于stack exchange,提问作者Programer Beginner
相关产品推荐
相关产品推荐

