pcap_loop和pcap_dispatch之间究竟有什么区别?
TL; DR:为什么cap_net_raw,cap_net_admin功能只能在/usr/bin(或/usr/sbin)中工作,而不能在其他地方工作?这可以在某个地方配置吗?
我在使用Ubuntu 14.04中的libpcap为我的C程序分配功能时遇到了问题.即使在使用setcap(8)和使用它来分配功能之后getcap(8),我仍然会收到权限错误.似乎功能仅适用于\usr\bin朋友中的可执行文件.
我的程序test.c如下:
#include <stdio.h>
#include <pcap.h>
int main(int argc, char **argv) {
if (argc != 2) {
printf("Specify interface \n");
return -1;
}
char errbuf[PCAP_ERRBUF_SIZE];
struct pcap* pcap = pcap_open_live(argv[1], BUFSIZ, 1, 0, errbuf);
if (pcap == NULL) {
printf("%s\n", errbuf);
return -1;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并编译
gcc test.c -lpcap
Run Code Online (Sandbox Code Playgroud)
生成a.out可执行文 我设置了功能:
sudo setcap cap_net_raw,cap_net_admin=eip ./a.out
Run Code Online (Sandbox Code Playgroud)
并检查它是否正确: …
我试图在Mac OS X上编译一个使用AF_PACKET套接字和libpcap的C程序,OS X中的等价物是什么?
我有一个python脚本使用dpkt捕获以太网上的数据包,但我如何区分哪些数据包是tcp和哪些数据包是udp.
最终,我希望在该时间间隔内建立每个tcp连接的数据包列表.
我的代码是:
import dpkt
import pcapy
cap=pcap.open_live('eth0',100000,1,0)
(header,payload)=cap.next()
while header:
eth=dpkt.ethernet.Ethernet(str(payload))
ip=eth.data
tcp=ip.data
# i need to know whether it is a tcp or a udp packet here!!!
(header,payload)=cap.next()
Run Code Online (Sandbox Code Playgroud) 我写的只是简单的pcap"实时"捕获引擎,但pcap_dispatch的数据包处理回调实现应该花费相对较长的时间进行处理.pcap是否在单独的线程中运行每个"pcap_handler"回调?如果是,"pcap_handler"是否是线程安全的,还是应该注意保护关键部分?或者,pcap_dispatch回调是否以串行方式工作?例如,只有在数据包1的"pcap_handler"完成后才调用数据包2的"pcap_handler"?如果是这样,是否有办法避免累积延迟?谢谢,-V
我正在尝试在Ubuntu 12.04 32bit上构建reaver.我已经构建并安装了libpcap.
运行./configure,我收到以下错误:
在-lpcap中检查pcap_open_live ...没有
错误:找不到pcap库!
任何帮助解决这个问题都非常感谢.
编辑:这是配置脚本中的检查:
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pcap_open_live in -lpcap" >&5
$as_echo_n "checking for pcap_open_live in -lpcap... " >&6; }
if test "${ac_cv_lib_pcap_pcap_open_live+set}" = set; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
Run Code Online (Sandbox Code Playgroud) 我想捕获发往本地端口的UDP数据包,过滤表达式就像udp port 20000.我注意到如果UDP数据包上存在IP分片,libpcap只能捕获第一个IP分片.我猜的原因是第二个IP片段没有UDP头(我认为它与TCP相同),所以libpcap无法使用filter express捕获它们udp port 20000.
这有什么解决方法吗?或任何其他可以捕获发往特定本地端口的数据包的库?
谢谢!
当我arping用来发送ARP请求(我知道睡觉的iPhone没有回复ICMP ping)来睡觉的iPhone/Androids(意味着它们打开但是屏幕很暗)连接在同一个wifi上时,iPhone回复给我这样的:
ARPING 10.109.201.139
Timeout
Timeout
Timeout
42 bytes from e0:ac:cb:b0:22:5b (10.109.201.139): index=0 time=20.201 msec
Timeout
Timeout
Timeout
Timeout
Timeout
Timeout
Timeout
Timeout
Timeout
Timeout
42 bytes from e0:ac:cb:b0:22:5b (10.109.201.139): index=1 time=65.401 msec
Timeout
Run Code Online (Sandbox Code Playgroud)
但有时,iPhone会不断回复.有时它根本不回答arping.Android答案如下:
ARPING 10.109.201.119
Timeout
42 bytes from c0:ee:fb:01:f4:fd (10.109.201.119): index=0 time=78.345 msec
42 bytes from c0:ee:fb:01:f4:fd (10.109.201.119): index=1 time=148.228 msec
42 bytes from c0:ee:fb:01:f4:fd (10.109.201.119): index=2 time=217.777 msec
42 bytes from c0:ee:fb:01:f4:fd (10.109.201.119): index=3 time=84.933 msec
Timeout
42 bytes from c0:ee:fb:01:f4:fd (10.109.201.119): index=4 time=174.140 …Run Code Online (Sandbox Code Playgroud) 我正在使用libpcap作为lib来编写一个C程序来赶上即将来临的IP。我的代码段如下:
struct bpf_program filter;
pcap_compile(pcap_handle, &filter, "icmp[icmptype]=0 and '(dst 16.11.26.100 or dst 16.11.27.100)'", 1, 0);
pcap_setfilter(pcap_handle, &filter);
Run Code Online (Sandbox Code Playgroud)
但这没有用,我仍然可以看到其他目标Ips,而不仅仅是上述两个Ips。
我正在尝试使用ctypes在python3中使用libpcap.
在C中给出以下功能
pcap_lookupnet(dev, &net, &mask, errbuf)
Run Code Online (Sandbox Code Playgroud)
在python我有以下内容
pcap_lookupnet = pcap.pcap_lookupnet
mask = ctypes.c_uint32
net = ctypes.c_int32
if(pcap_lookupnet(dev,net,mask,errbuf) == -1):
print("Error could not get netmask for device {0}".format(errbuf))
sys.exit(0)
Run Code Online (Sandbox Code Playgroud)
我得到的错误是
File "./libpcap.py", line 63, in <module>
if(pcap_lookupnet(dev,net,mask,errbuf) == -1):
ctypes.ArgumentError: argument 2: <class 'TypeError'>: Don't know how to convert parameter 2
Run Code Online (Sandbox Code Playgroud)
你如何应对&blah价值观?