Python学习:scapy库的Packet与str相互转换

本文详细介绍了如何在Python的scapy库中处理抓取的Packet,包括将其转换为字符串和从字符串还原为Packet类型。同时讨论了在网络中传输和报文解析的问题,并提供了解决方案,以及如何通过json格式判断报文类型。
摘要由CSDN通过智能技术生成

1.问题

python的scapy库,是构造TCP/IP报文的利器,并且支持asn.1,搞过电路交换协议的人一定会明白基于asn.1协议的描述复杂度。

使用中遇到的一个比较麻烦的问题,scapy抓到的Packet如何在网络中传输,如何在使用端还原到Packet类型。

2.方案

2.1.Packet转换为str

Packet转换为str很简单,直接上代码:

from scapy.all import *

pkts = sniff('eth1', count=1, timeout=5)
pkts[0].show()
pkt_str = str(raw(pkts[0]))
print(pkt_str)

2.2.str转换为Packet

str转换为Packet看上去不那么容易,遇到过两个问题:

  • 还原到Packet类型,需要bytesstr转换为bytes一直没有试成功;
  • 还原到Packet类型,调用show方法,没有解析出席完整的报文结构;

对于问题1的方法:

from scapy.all import *

pkts = sniff('eth1', count=1, timeout=5)
pkts[0].show()
pkt_str = str(raw(pkts[0]))
print(pkt_str)
pkt_bytes = eval(pkt_str)
print(pkt_bytes)

利用eval方法,str转换到bytes很容易,不需要对str的编码格式设置,比较方便。

对于问题2的方法:

from scapy.all import *

pkts = sniff('eth1', count=1, timeout=5)
pkts[0].show()
pkt_str = str(raw(pkts[0]))
print(pkt_str)
pkt_bytes = eval(pkt_str)
pkt_old = Ether(pkt_bytes)
pkt_old.show()

scapy解析报文的时候,需要指定第一层什么时候结构,不然无法进行完整的解析,不明白sniff的原理,如果知道报文是以太网结构,直接使用类型Ether构造报文Packet,再调用show方法就能完整的解析了。

解决了上述两个问题,就可以方便在网络中传输scapyPacket结构。

3.讨论

既然使用scapy是网络方面的库,系统往往不是单一进程就能完成的,会涉及到网络传输,Packetstr相互转换的问题解决了,就离正式的方案不远了。本文讨论的方法,网上还是比较难找到一个完整的方法,所以贴上来供大家学习使用。

上述的方法,还有一个问题使用sniff抓到的包,如何确定首层是什么报文呢?这里再附送一个方法,把Packet转换成json格式,这样就容易判断了,代码如下:

def packet2json(pkt: Packet):
    js = dict()
    for key in pkt.fields.keys():
        js[key] = str(pkt.fields[key])

    if isinstance(pkt.payload, NoPayload):
        return js
    js[pkt.payload.name] = packet2json(pkt.payload)
    return js

enjoy!!!

好的,你的问题是关于Python3利用Scapy局域网实现自动多线程ARP扫描功能。 首先,你需要安装Scapy,可以使用以下命令: ``` pip install scapy ``` 然后,你可以使用以下Python代码实现ARP扫描功能: ```python from scapy.all import * from threading import Thread def arp_scan(ip): arp = ARP(pdst=ip) ether = Ether(dst="ff:ff:ff:ff:ff:ff") packet = ether/arp result = srp(packet, timeout=3, verbose=0)[0] if result: return {'IP': result[0][1].psrc, 'MAC': result[0][1].hwsrc} else: return {'IP': ip, 'MAC': 'N/A'} def scan_network(target_ip, threads): ips = [target_ip + str(i) for i in range(1, 255)] print("Scanning in progress...") scan_results = [] for ip in ips: t = Thread(target=lambda result_list: result_list.append(arp_scan(ip)), args=(scan_results,)) t.start() if threading.activeCount() > threads: t.join() print("Scan complete.") return scan_results if __name__ == '__main__': target_ip = '192.168.1.' threads = 50 results = scan_network(target_ip, threads) for result in results: print(result['IP'], result['MAC']) ``` 在这个示例中,我们定义了两个函数,arp_scan()和scan_network()。arp_scan()函数用于扫描单个IP地址,并返回IP地址和MAC地址。scan_network()函数用于扫描整个网络,并返回所有扫描结果。 我们还使用了Python的多线程功能来加快扫描速度,并限制了线程数以避免过度消耗系统资源。 最后,我们使用主函数来设置目标IP地址和线程数,然后调用scan_network()函数来执行扫描,并打印扫描结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值