【问题标题】:Cocoa Monitor Packets On Ports端口上的 Cocoa 监控数据包
【发布时间】:2012-09-19 00:43:48
【问题描述】:

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

【问题讨论】:

  • 修正了一个潜在的拼写错误:“我将不胜感激有关我无法用于实现此目的的库和方法的任何信息。” - 我可以给你很多例子,你是如何不能做到的。我想到了香蕉和食盐。 ;-)

标签: macos cocoa packet-sniffers packets kernel-extension


【解决方案1】:

“监控数据包”是什么意思?

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

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

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

如果你想为 pcap 使用 Cocoa 包装器,我不久前进行的 Google 搜索发现 packetsnifferCapKit;我没有用过这两个,所以我不能推荐一个。

【讨论】:

  • 感谢您的回答。我正在尝试通过使用 pcap 读取 HTTP 请求和响应,我得到的是一个 u_char *packet,由于 IP 数据包和...,我发现它很难阅读,是否有任何适当的方法可以使用 pcap 提取 HTTP 请求和响应?
  • @AbcdEfg 也许你所追求的实际上是一个透明的 HTTP 代理?
  • Pcap 不会为您完成所有工作。如果您指定“tcp”的捕获过滤器,它将为您完成识别 TCP 段的工作,但您仍然必须跳过链路层、IP 和 TCP 标头以获取有效负载,并且从负载中提取 HTTP 消息。
  • 而且,是的,如果您想更改请求或响应,以便来自浏览器的用户请求在到达服务器之前被修改,或者来自服务器的响应在到达浏览器之前被修改, pcap 不会帮助你,因为它只做被动监控。根据 pmjordan 的评论,您需要实现某种 HTTP 代理。
【解决方案2】:

你见过Apple's overview documentation on Network Kernel Extensions吗?这应该让你开始。

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

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

【讨论】:

  • 感谢您的回答,但在我开始使用 KEXT 之前,我想知道如果在应用程序运行时中没有 KEXT,我是否不能这样做?
  • 正如我所说,您也许可以使用现有的内核->用户空间数据包监视器,例如底层的 Wireshark。我认为你不能实时修改数据包,除非你直接在内核中进行。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 2013-12-25
    • 2012-08-29
    相关资源
    最近更新 更多