我的问题只涉及C语言和Python中的套接字之间的性能差异.由于我的Python构建是CPython,我认为它是相似的,但我很好奇是否有人实际上有"真正的"基准,或者至少是一个基于证据的观点.
我的逻辑是这样的:
我敢肯定有人会想知道上下文或好奇心.我计划为自己构建一种代理(不用于互联网浏览,匿名等),并将我想要使用的应用程序绑定到特定端口.然后,所述端口上的所有数据包将排队,修改地址头,然后发送等等.
提前致谢.
看来,filter的sniff功能不能正常工作.
我用以下过滤器执行嗅探
a=sniff(count=1,filter="tcp and host 192.168.10.55 and port 14010")
Run Code Online (Sandbox Code Playgroud)
但是sniff有时候抓住这样的UDP包:
>>> a=sniff(count=1,filter="tcp and host 192.168.10.55 and port 14010")
>>> a
<Sniffed: TCP:0 UDP:1 ICMP:0 Other:0>
Run Code Online (Sandbox Code Playgroud)
有时候sniff捕获带有错误端口的TCP数据包:
>>> a=sniff(count=1,filter="tcp and host 192.168.10.55 and port 14010")
>>> a
<Sniffed: TCP:1 UDP:0 ICMP:0 Other:0>
>>> a[0]
<Ether dst=00:26:55:cb:3b:10 src=00:22:64:55:c8:89 type=0x800 |<IP version=4L ihl=5L tos=0x10 len=92 id=8683 flags=DF frag=0L ttl=64 proto=tcp chksum=0x9484 src=192.168.1.71 dst=192.168.1.133 options=[] |<TCP sport=ssh dport=1874 seq=350107599 ack=2484345720 dataofs=5L reserved=0L flags=PA window=254 …Run Code Online (Sandbox Code Playgroud) 我有大约 10GB 的 pcap 数据和 IPv6 流量来分析存储在 IPv6 标头和其他扩展标头中的信息。为此,我决定使用 Scapy 框架。我试过rdpcap函数,但对于这么大的文件,不推荐使用。它试图将所有文件加载到内存中并在我的情况下卡住。我在网上发现在这种情况下建议使用嗅探,我的代码如下:
def main():
sniff(offline='traffic.pcap', prn=my_method,store=0)
def my_method(packet):
packet.show()
Run Code Online (Sandbox Code Playgroud)
在名为my_method 的函数中,我分别接收每个数据包,我可以解析它们,但是....当我使用内置框架方法调用show函数时,我得到了这样的东西:

在wireshark中打开时,我得到了正确的数据包:

你能告诉我如何在 scapy 中解析这个数据包以获得正确的结果吗?
编辑:根据评论中的讨论,我找到了一种用 Python 解析 PCAP 文件的方法。在我看来,最简单的方法是使用 pyshark 框架:
import pyshark
pcap = pyshark.FileCapture(pcap_path) ### for reading PCAP file
Run Code Online (Sandbox Code Playgroud)
可以使用 for 循环轻松迭代读取文件
for pkt in pcap:
#do what you want
Run Code Online (Sandbox Code Playgroud)
对于解析 IPv6 标头,以下方法可能有用:
pkt['ipv6'].tclass #Traffic class field
pkt['ipv6'].tclass_dscp #Traffic class DSCP field
pkt['ipv6'].tclass_ecn #Traffic class ECN field
pkt['ipv6'].flow #Flow label …Run Code Online (Sandbox Code Playgroud) 我在 Wireshark 中捕获了一些数据包,需要以任何方式再次重放这些数据包。
我可以使用scapy将图像或文档(以MB为单位)作为数据插入数据包吗?
这就是我发送数据的方法.
data = "University of texas at San Antonio"
a = IP(dst="129.132.2.21")/TCP()/data
send(a)
Run Code Online (Sandbox Code Playgroud) 在Scapy(或者甚至只是Python,为此),如何获得给定数据包的字节大小?我很想使用这个功能,len但我不确定它在数据包的情况下究竟会返回什么.
>>> len(IP(dst="www.google.com"))
20
>>> len(IP(dst="www.google.com")/TCP(dport=80))
40
Run Code Online (Sandbox Code Playgroud) 我正在使用Scapy,并希望根据目标mac地址进行过滤.
但是,我收到的数据包显示目标MAC地址不是过滤器中指定的地址.
这是一个代码snippit:
from scapy.all import *
sniff(iface="eth1", filter="ether dst host 91:e0:f0:01:00:00",
count=3, prn=lambda x: x.show())
Run Code Online (Sandbox Code Playgroud)
我正在运行Scapy 2.2.0
关于这个问题的任何想法吗?
所以,我在Ubuntu中为scapy编写了一个小脚本.
#!/usr/bin/env python
import sys
#from scapy.all import *
try
import scapy
except ImportError:
del scapy
from scapy import all as scapy
i= IP()
t= TCP()
i.dst='192.168.56.100'
t.dport=22
pakket=i/t
answered,unanswered=sr(pakket)
answered.nsummary()
Run Code Online (Sandbox Code Playgroud)
我写了'尝试',因为这里有另一个主题(尝试它作为解决方案).我使用此代码的当前输出如下
Traceback (most recent call last):
File "./scapy.py", line 5, in <module>
import scapy
File "/home/nicholas/scapy.py", line 9, in <module>
i=IP()
NameError: name 'IP' is not defined
Run Code Online (Sandbox Code Playgroud)
当尝试从scapy.all导入*没有'尝试'时.
Traceback (most recent call last):
File "./scapy.py", line 3, in <module>
from scapy.all import *
File "/home/nicholas/scapy.py", line 3, in <module> …Run Code Online (Sandbox Code Playgroud) 在此示例中,是用于为Proberequests创建应答机的代码。结果是 AP正在设备上显示。以下是我的代码。为了使它正常工作,我不得不进行一些更改。
import sys
import os
import time
from scapy.all import *
os.sys.path.append('/usr/lib/python2.7/dist-packages')
conf.iface = "wlan0mon"
class ProbeRequest_am(AnsweringMachine):
function_name = "pram"
mac = "00:11:22:33:44:55"
def is_request(self, pkt):
return Dot11ProbeReq in pkt
def make_reply(self, req):
rep = RadioTap()
rep /= Dot11(addr1=req.addr2, addr2=self.mac, addr3=self.mac, ID = RandShort(), SC= RandShort())
rep /= Dot11ProbeResp(cap="ESS", timestamp=int(time.time()))
rep /= Dot11Elt(ID="SSID",info ="Scapy !")
rep /= Dot11Elt(ID="Rates", info=b'\x82\x84\x0b\x16\x96')
rep /= Dot11Elt(ID="DSset", info=chr(10))
return rep
ProbeRequest_am()()
Run Code Online (Sandbox Code Playgroud)
首先,AP在我拥有的任何设备上都不可见。但是输出与我的设备在家里寻找我的AP有关。AFAIK我的智能手机(iOS 12.2)不会将其实际的MAC用于Proberequest,并且该程序仅应对Proberequest作出反应。但这是运行脚本的输出(我的iPhone的实际MAC,但已更改为发布= d0:c5:f3:00:00:00):
RadioTap / 802.11 Management 4 d0:c5:f3:00:00:00 > ff:ff:ff:ff:ff:ff …Run Code Online (Sandbox Code Playgroud)