2

我想监视 Mac OS X 中特定端口上的数据包。能够读取它们的内容并有时更改它们的内容(如果可能的话)。我想知道是否可以通过编写 KEXT 或者我可以在应用程序中执行此操作并立即显示结果。我将不胜感激有关我可以用来实现这一目标的库和方法的任何信息。

4

3 回答 3

2

“监控包”是什么意思?

如果您的意思是“观察发送到或来自特定 TCP 或 UDP 端口的数据包”或“在特定网络接口上发送或接收哪些数据包”,您将使用pcap 库,就像在其他 UN*Xes 上一样。libpcap/WinPcap 是 Wireshark 和 tcpdump 使用的库;在 OS X 上,它使用的底层内核机制是 BPF(伯克利包过滤器),它内置在 XNU 中(它是开源的 - 请参阅 XNU 源代码中的bsd/net/bpf.cbsd/net/bpf_filter.c文件以及它们包含的头文件)并且不不需要kext。(Wireshark 没有自己的 kext;它使用 libpcap/WinPcap,因此它可以在 Linux 和 OS X 和 *BSD 和 Solaris 和 HP-UX 和 AIX 和 Tru64 UNIX 和 IRIX 等等,以及在 Windows 上运行,如果WinPcap 已安装,因此,在 OS X 和 *BSD 上,它最终使用 BPF。)

除 Linux 外,Libpcap/WinPcap 不允许您使用一个“句柄”捕获所有接口;您必须使用pcap_findalldevs()查找所有当前可用的接口,然后为每个接口打开单独的句柄。如果“端口”是指“网络端口”,那么一个“端口”是您的以太网端口,另一个是您的 Wi-Fi 适配器,您必须单独打开要捕获的所有“端口”。

如果“端口”是指 TCP 或 UDP 端口,并且您只想查看进出特定端口的流量,则必须指定“过滤器”表达式,使用 将其转换为“BPF 代码” pcap_compile(),然后使其特定 libpcap/WinPcap 句柄的过滤器,带有pcap_setfilter().

如果您想为 pcap 使用 Cocoa 包装器,我不久前进行的 Google 搜索发现了packetnifferCapKit;我没有使用过其中任何一个,所以我不能推荐其中一个。

于 2012-09-28T01:30:57.903 回答
1

您是否看过Apple 关于网络内核扩展的概述文档?那应该让你开始。

本书的可下载源代码还包含一些网络堆栈不同级别的包过滤示例 NKE。(这本书当然也在第 13 章中详细解释了这些东西)

您还可以重新使用现有的开源 kext 进行纯监控:Wireshark 应用程序已经这样做了,您应该能够连接到它的 kext。对于实际修改数据包流,您可能必须纯粹在内核中执行此操作。

于 2012-09-27T16:52:58.290 回答
0

因为 OS X 和 iOS 是 Unix 而 Objective-C 是 C,所以答案是,“就像你在 C 中的 Unix 上做的一样”——Cocoa 是高级的,而你想做的是低级的。我在 SO 上找不到问题,但有人建议查看MenuMeters的源代码作为网络监控的示例。

于 2012-09-27T13:58:31.860 回答