我知道有很多应用程序可以做到这一点(比如 procexplorer),但是有没有办法访问 winapi(使用什么方法/参考)来检索每个应用程序或进程的网络流量(TCP、UDP 等)?
答案1
从您的评论中,我了解到您正在尝试从应用程序内部捕获由您正在开发的应用程序生成的网络流量。如果是这样,我认为这个问题可能更适合 StackOverflow,因为这是一个开发者社区。这种自省可能需要使用 ETW(Windows 事件跟踪),但我再次不确定。这个问题可能会有帮助。
暂时把这个放在一边,把注意力集中在管理方面(如果你在这里提问,你往往会得到这样的答案),我想把你的注意力转向命令netsh trace
和Microsoft 网络监视器 (Netmon)。您可以在需要时直接从 NetMon 进行捕获,或者也可以使用 netsh trace 命令自动触发,从而为自己提供更多灵活性。
如果您感兴趣的话,您可以执行以下操作:
netsh trace start capture=yes traceFile=c:\tracefolder\tracename.etl
开始捕获,然后:
netsh trace stop
当你准备好时。还有其他选项,因此您可以使用netsh trace /?
无论通过何种方式捕获到数据,您都可以使用 NetMon 来过滤应用程序的可执行文件,以检查在监控期间它生成的网络流量。
答案2
不确定 winapi 但是“Wireshark是全球领先的网络协议分析仪。它可以让您在微观层面上看到网络上发生的事情。它是许多行业和教育机构事实上(通常是法律上的)的标准。”
答案3
您可以使用libpcap
。Libpcap 是一个开源库,为网络数据包捕获系统提供高级接口。
这利布卡API 旨在从C
和中使用C++
,但也有许多包装器允许从Perl
、、、、Python
等Java
语言使用C#
它Ruby
。
Libpcap 可以在大多数类 Unix 操作系统上运行,还有一个视窗版本命名网卡(Win
道琼斯P
指数Cap
)。
查看Winpcap 的文档。
更新
遗憾的是,网络嗅探工具在网络堆栈的最低层工作,试图捕获所有内容,它完全不知道操作系统上运行的进程。找出某个调用的来源非常困难。数据包嗅探器最终可以(通过端口号)找出进程 ID。
这些情况下使用 pcap 可以做什么?
如果我们只想嗅探特定流量(例如:仅TCP/IP
数据包、仅发往端口的数据包23
等),我们必须创建一个规则集compile
并应用它。这是一个三阶段过程,所有阶段都密切相关。规则集保存在字符串中,并转换为 pcap 可以读取的格式(因此对其进行编译)。
编译实际上只是通过调用程序中的函数来完成的;它不涉及使用外部应用程序。然后我们告诉 pcap 将其应用于我们希望它过滤的任何会话。
更新 2
首先要了解的是 pcap 嗅探器的总体布局。代码流程如下:
我们首先确定要嗅探哪个接口。在 Linux 中,这可能是类似的东西
eth0
,在 BSD 中可能是xl1
,等等。我们可以用字符串定义此设备,也可以询问pcap 为我们提供了接口的名称就可以了。初始化 pcap。在这里我们实际上告诉 pcap 我们正在嗅探哪个设备。如果我们愿意,我们可以嗅探多个设备。我们如何区分它们?使用文件句柄。就像打开文件进行读取或写入一样,我们必须命名我们的嗅探,
session
以便我们能够将其与其他此类会话区分开来。如果我们只想嗅探特定流量(例如:仅 TCP/IP 数据包、仅发往端口 23 的数据包等),我们必须创建一个规则集、“编译”它并应用它。这是一个三阶段过程,所有阶段都密切相关。规则集保存在字符串中,并转换为 pcap 可以读取的格式(因此对其进行编译)。
编译实际上只是通过调用程序中的函数来完成的;它不涉及使用外部应用程序。然后我们告诉 pcap 将其应用于我们希望它过滤的任何会话。
最后,我们告诉 pcap 进入其主执行循环。在此状态下,pcap 会等待,直到它收到我们想要的任意数量的数据包。每次收到新数据包时,它都会调用我们已经定义的另一个函数。
它调用的函数可以做任何我们想要做的事情;它可以剖析数据包并将其打印给用户,可以将其保存在文件中,或者什么都不做。
在我们的嗅探需求得到满足后,我们关闭会话并完成。