一、進入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