一、进入scapy交互界面
在终端下输入:scapy ,进入交互界面:
二、查看scapy已经实现的网络协议
ls() 列出scapy中已实现的网络协议ls(协议类型) 查看某个协议头部字段格式lsc() 列出scapy中可以使用的命令或函数,比如嗅探时,我们经常会用到sniff()函数 IP().show() 显示包的IP信息 IP().display() 显示包的模板 dpkg = sniff(filter="tcp",count=4)dpkg[2].show() 显示包抓取到的tkpk的第3个数据包的的详细内容 dpkg[2].summary() 查看捕获到数据包的信息摘要 wrpcap("dpkgsniff.pcap",dpkg) 将嗅探到的packet内容写到pcap文件 dpkg_read = rdpcap("dpkgsniff.pcap") 读取pcap文件
三、构造数据包
#构造一个ip数据包dpkg = IP() #修改数据包的值 dpkg.ttl = 24
#构造一个ICMP数据包dpkg = ICMP() #构造一个TCP数据包 dpkg = TCP()
通过“/”来表示网络中各个层的组合
dpkg=Ether()/IP(dst="www.baidu.com")/TCP()/"GET /index.html HTTP/1.0 \n\n" dpkg.show() hexdump(dpkg)
sprintf()输出某一层某个参数的取值,如果不存在就输出”??”,具体的format格式是:%[[fmt][r],][layer[:nb].]field%
%[[fmt][r],][layer[:nb].]field%
layer: 协议层的名字,如Ether、IP、Dot11、TCP等。
filed: 需要显示的参数。
nb: 当有两个协议层有相同的参数名时,nb用于到达你想要的协议层。
r: 一个标志。当使用r标志时,意味着显示的是参数的原始值。
例如,TCP标志中使用人类可阅读的字符串’SA’表示SYN和ACK标志,而其原始值是18.
例子:pkt.sprintf("Etherent source: %Ether.src% IP src: %IP.src%")
或者:pkt.sprintf(
'%Raw.load%'
) #其中Raw为具体的协议层
显示具体的网络层的信息:
dpkg["IP"].show() 或者dpkg[IP].show() 也可以
dpkg["TCP"].show() dpkg["Raw"].show() #或者等价于 dpkg.getlayer(ip).show() dpkg.getlayer(TCP).show() dpkg.getlayer(Raw).show()
获取某个协议的具体字段值:
dpkg["Raw"].load dpkg.getlayer(TCP).window