我通过ctypes使用libpcap将嗅探器从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上,它工作得很好,但是在Mac OS X上,当我使用handle时,它会遇到分段错误。 handle的值有时为负,有时为正。我已经尝试将pcap_create的返回类型更改为unsigned int,但这没有帮助,但是我认为它在OS X下返回了错误的类型...

我在C中的两个系统上都做了一个printf("size of pcap_t: %zu\n", sizeof(pcap_t *));以获取pcap_t处理程序类型的大小。在Linux上,它表示4,在OS X 8上,但是我不知道如何继续。

还是我走错了路?有人有主意吗?

最佳答案

数据类型很重要。

您需要告诉ctypes pcap_create()的返回值是一个指针,并且需要告诉它pcap_can_set_rfmon()的参数是一个指针。

你这样做

# create handler
pcap_create = _pcap.pcap_create
pcap_create.restype = ctypes.c_void_p
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
pcap_can_set_rfmon.argtypes = [ctypes.c_void_p]
print "can rfmon:",pcap_can_set_rfmon(handle)




pcap_create.restype = ctypes.c_void_p




pcap_can_set_rfmon.argtypes = [ctypes.c_void_p]


这里需要行。该代码可同时用于32位和64位指针,因此您可以在32位和64位Linux以及32位和64位OS X(以及32位和64位Solaris)上使用它以及32位和64位FreeBSD以及...,对加载库的代码进行了任何更改-在大多数Un * xes共享库中,名称都以“ .so”结尾,因此如果您不想在其他Un * xes上使用find_library,Linux代码可能就足够了)。

关于python - 通过ctypes使用pcap的python段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13275038/

10-09 20:24
查看更多