2012-09-27 26 views
1

我想在Mac OS X的特定端口上监控包。能够读取其内容并有时更改其内容(如果可能)。我想知道是否可以写一个KEXT,或者我可以在应用程序中做到这一点,并立即显示结果。我会很感激任何有关图书馆和我可以用来实现这一目标的方法的信息。端口上的可可监控包

+0

修复了一个潜在的拼写错误的磁贴:“我将不胜感激任何有关图书馆的信息和我无法用**来实现这一目标的方法。” - 我可以给你很多例子,你如何做不到。想起香蕉和食盐。 ;-) –

回答

1

“监控数据包”在什么意义上?

如果您的意思是“查看发往或来自特定TCP或UDP端口的数据包”或“在特定网络接口上发送或接收什么数据包”,您可以使用pcap library,就像其他UN * Xes一样。 libpcap/WinPcap是Wireshark和tcpdump的使用库;在OS X上,它使用的基础内核机制是BPF(Berkeley数据包过滤器),它是内置于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上运行if WinPcap已安装,因此,在OS X和* BSD上,它最终使用BPF。)

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

如果“端口”你的意思是TCP或UDP端口,而您只想要观看流量或特定的端口,你必须指定一个“过滤器”的表达,翻译为“BPF代码”与pcap_compile() ,然后使其成为pcap_setfilter()的特定libpcap/WinPcap句柄的过滤器。

如果您想为pcap使用可可包装,我之前做过的Google搜索发现了packetsnifferCapKit;我没有使用过这些,所以我不能推荐一个或另一个。

+0

谢谢你的回答。我试图读取HTTP请求和响应,通过使用pcap我得到的是一个'u_char *包',我发现很难阅读,因为IP包和...,有没有任何适当的方式来提取HTTP请求和响应用pcap? –

+0

@AbcdEfg也许你想要的实际上是一个透明的HTTP代理? – pmdj

+0

Pcap不会为你做所有的工作。如果你指定一个捕获过滤器“tcp”,它会为你识别TCP段的工作,但你仍然必须跳过链接层,IP和TCP头来获取有效载荷,并且从有效负载中提取HTTP消息。 – 2012-09-28 19:27:43

0

由于OS X和iOS是Unix并且Objective-C是C,所以答案是“在C中的Unix上使用相同的方式” - Cocoa是高级别的,而您想要做的是低级别的。我找不到SO的问题,但有人建议将MenuMeters作为网络监控的示例。

1

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

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

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

+0

谢谢你的回答,但是在我开始研究KEXT之前,我想知道如果我在应用程序运行时没有KEXT就无法做到这一点? –

+0

正如我所说的,您可以使用现有的内核 - >用户空间数据包监视器,例如Wireshark。我认为你不能实时修改**数据包,除非你直接在内核中进行修改。 – pmdj