我使用libpcap通过ctypes将我的嗅探器从C移植到Python。下面是python代码:
import ctypes, sys
from ctypes.util import find_library
if sys.platform == "darwin":
_pcap = ctypes.cdll.LoadLibrary(find_library("libpcap"))
elif sys.platform == "linux2":
_pcap = ctypes.cdll.LoadLibrary("libpcap.so")
errbuf = ctypes.create_string_buffer(256)
pcap_lookupdev = _pcap.pcap_lookupdev
pcap_lookupdev.restype = ctypes.c_char_p
dev = pcap_lookupdev(errbuf)
print dev
# create handler
pcap_create = _pcap.pcap_create
handle = pcap_create(dev, errbuf)
print handle
if not handle:
print "failed creating handler:",errbuf
exit()
# monitor mode
pcap_can_set_rfmon = _pcap.pcap_can_set_rfmon
print "can rfmon:",pcap_can_set_rfmon(handle)
在Linux上它工作得非常好,但是在macosx上,当我使用handle时,它会遇到一个分段错误。handle even的值有时为负,有时为正。我已经尝试过将pcap_create的返回类型改为unsigned int,但这没用,但我认为它在OSX下返回了错误的类型。。。在
我用C语言在两个系统上都做了printf("size of pcap_t: %zu\n", sizeof(pcap_t *));
,以获得pcap_t handler类型的大小。在Linux上是4,在OS X 8上是4。但我不知道从现在开始我不知道该怎么做。。。在
还是我走错了路?有人有主意吗?在
我真的很想来这里发帖,因为我在OSX上也有这个问题。我在你的代码中发现的问题是:
handle = pcap_create(dev, errbuf)
您需要设置restype,下面是我的示例,因为这可能会对您中的一些人有所帮助:https://github.com/killswitch-GUI/NIX-Sniffer-Examples
数据类型很重要。在
您需要告诉ctypes,
pcap_create()
的返回值是一个指针,并且您需要告诉它pcap_can_set_rfmon()
的参数是一个指针。在你这样做
在
^{pr2}$以及
这里需要行。此代码将同时使用32位和64位指针,因此您可以在32位和64位Linux、32位和64位OS X(以及32位和64位Solaris、32位和64位FreeBSD和…)上使用它,只要对代码进行任何更改就可以加载库-在大多数Un*xes上,共享库的名称都以“.so”结尾,因此,如果您不想在其他Un*xes上使用
find_library
,那么Linux代码就足够了)。在相关问题 更多 >
编程相关推荐