大家好,我是黄伟。今天要和大家聊聊Python的网络收发包模块--------scapy。前言众所周知,我们每天上网都会有大量的数据包需要发送,然后进行处理、接收和发送。这样一个循环的过程,这里展示了很多数据包的发送和接收数据。那么,什么是包?一起来看看吧。数据包是网络通信传输中的一个数据单元,一般称为数据包,主要由源地址、目的地址和载荷数据组成。包括header和body,header是定长的,body的长度不变。简单了解一下包的定义,再来看看打包工具scapy的用法。(参考来源:百度百科-数据包)一、常用命令1、ls():显示所有支持的数据包对象,带参数或不带参数。参数可以是任何特定的包。可以看出它包含了所有的内容。如果我们要详细查看某个模块的内容,比如我要查看ARP和tcp,可以这样:这里要告诉大家的是,一定要注意大小写,这样ls(ARP)可以得到正确的结果,ls(arp)是错误的。2.lsc():用英文列出所有函数,我头都大了,不知道此时此刻大家是什么心情,哈哈哈哈。3.hide_defaults():用于删除用户提供的一些与默认值相同的项a=IP()print(a.hide_defaults())4.display():可以简单查看各个参数的值当前数据包的情况,a=IP()a.display()5.更多命令commandfunctionshow_interfaces()显示网卡信息str(pkt)组装数据包hexdump(pkt)十六进制转储ls(pkt)显示字段值列表pkt.summary()的一行摘要pkt.show()数据包的扩展视图pkt.show2()显示聚合数据包(例如,计算的校验和)pkt.sprintf()withpacketfields填写格式字符串pkt.decode_payload_as()改变payload的解码方式pkt.psdump()画一个解释的PostScript图pkt.pdfdump()画一个解释的PDFpkt.command()返回可以生成数据包的Scapy命令nsummary()如上,但指定数量ofpacketsconversations()显示对话图filter()返回lambda过滤的数据包列表hexdump()返回所有数据包的hexdumpimport_hexcap()将hexdump重新导入Scapyhexraw()返回所有数据包Rawlayer的hexdumppadding()返回一个带有填充的数据包hexdumpnzpadding()返回一个带有非零填充的数据包hexdumpplot()计划一个lambda函数根据lambda函数申请一个包列表maketable()显示形式traceroute("baidu.com")查看IP路径的traceroute函数export_object()数据包转化为base64编码的Python数据结构import_object()可以重新导入输出save_session()saveallsessionvariablesload_session()read取保存的sessionfuzz()并更改一些没有计算的默认值(比如checksums和checksums)。改变的值是随机的,但它符合字段的值。2.从scapy.allimport*pkt=sniff(iface="RealtekPCIeGBEFamilyController",count=3,filter='tcp',prn=lambdax:x.sprintf('{IP:%IP.src%->%IP.dst%\n}{Raw:%Raw.load%\n}'))filter:过滤条件iface:网卡接口名称count:数据包个数prn:回调函数,通常配合lambda控制sprintf()function输入信息抓取源地址为192.168.3.3、端口为80的tcp包:sniff(filter="ipsrc192.168.3.3andtcpandtcpport80",prn=lambdax:x.summary())抓取目的地址网段是192.168。3.3/24包:sniff(filter="dstnet192.168",prn=lambdax:x.summary())捕获非ICMP包:sniff(filter="noticmp",prn=lambdax:x.summary())打印输出捕获数据包的摘要:sniff(filter="icmp",prn=lambdax:x.summary(),count=10)打印出所有IP数据包的源地址:sniff(filter="icmp",prn=lambdax:x[IP].src,count=10)3.构造数据包pkt=Ether()/IP(dst='192.168.1.2')/TCP(dport=80)说到数据包,我得谈论各种协议。说到协议,自然会想到osi的七层模型。OSI七层网络模型TCP/IP四层概念模型对应网络协议应用层(Application)应用层HTTP、TFTP、FTP、NFS、WAIS、SMTP表示层(Presentation)应用层Telnet、Rlogin、SNMP,Gopher会话层(Session)应用层SMTP,DNS传输层(Transport)传输层TCP,UDP网络层(Network)网络层IP,ICMP,ARP,RARP,AKP,UUCP数据链路层(DataLink)数据链路层FDDI,Ethernet,Arpanet,PDN,SLIP,PPP,Physicallayer(Physical)数据链路层IEEE802.1A,IEEE802.2toIEEE802.11以上就是各个网络协议对应的osi模型,那么各个协议的用途是什么呢?一起来看看吧。四、各协议的使用1.构造一个IP包并传入一些参数#构造一个IP包并传入一些参数pkt=IP(dst="192.168.1.2",ttl=10)ls(pkt)version:Versionnumberihl:报头长度tos:服务类型len:IP数据包总长度id:标识符flags:标志flag:切片偏移ttl:生存时间proto:协议类型chksum:报头检查src:源IP地址dst:目标IP地址options:Optional2.构造ARP包#构造ARP包ARP(op=1,hwdst="ff:ff:ff:ff:ff:ff",pdst=ip_address)#arp类的构造函数列表:ls(ARP)hwtype:XShortField=(1)1的值表示以太网地址,其他也可能表示令牌环地址ptype:XShortEnumField=(2048)0x0800表示IP地址,其他也可能是ICMP/IGMPPhwlen:ByteField=(6)在ARP报文中,其值为6plen:ByteField=(4)在ARP报文中,其值为4op:ShortEnumField=(1)值为1或2,代表ARP请求或响应包。1.ARP请求,2.ARP响应,3.RARP请求,4.RARP响应hwsrc:ARPSourceMACField=(None)发送方的Mac地址。psrc:SourceIPField=(无)发件人IP地址。hwdst:MACField=('00:00:00:00:00:00')目标Mac地址。pdst:IPField=('0.0.0.0')目标IP地址。3.构造以太#ConstructEtherEther(dst="ff:ff:ff:ff:ff:ff")ls(Ether)dst:DestMACField=(None)DestinationMACsrc:SourceMACField=(None)SourceMACtype:XShortEnumField=(36864)构造以太网数据包通常需要指定目标MAC地址和源MAC地址。如果不指定,广播包默认发送ff:ff:ff:ff:ff:ff4。构造TCP数据包#构造TCP数据包sport:ShortEnumField=20(20)目的端口dport:ShortEnumField=80(80)源端口seq:IntField=0(0)ack:IntField=0(0)dataofs:BitField(4bits)=None(None)reserved:BitField(3bits)=0(0)flags:FlagsField(9bits)=
