tcp協議:
---Source Port是源端口,16位
---Destination Port是目的端口,16位
---Sequence Number是發送數據包中的第一個字節的序列號,32位
---Acknowledgment Number是確認序列號,32位
---Data Offset是數據偏移,4位,該字段的值是TCP首部(包括選項)長度除以4
---標志位: 6位,URG表示Urgent Pointer字段有意義:
ACK表示Acknowledgment Number字段有意義
PSH表示Push功能,RST表示復位TCP連接
SYN表示SYN報文(在建立TCP連接的時候使用)
FIN表示沒有數據需要發送了(在關閉TCP連接的時候使用)
Window表示接收緩沖區的空閑空間,16位,用來告訴TCP連接對端自己能夠接收的最大數據長度
---Checksum是校驗和,16位
---Urgent Pointers是緊急指針,16位,只有URG標志位被設置時該字段才有意義,表示緊急數據相對序列號(Sequence Number字段的值)的偏移
IHL(Internet Header Length 報頭長度)是計算機名詞,位于IP報文的第二個字段,4位,表示IP報文頭部按32位字長(32位,4字節)計數的長度,也即報文頭的長度等于IHL的值乘以4
涉及到python中的scapy庫
# -- coding: utf-8 --
from scapy.all import *
#數據包應用層數據部分
data='mydata'
#發送端IP地址10.0.3.83 接收端ip 10.0.3.88
傳輸層的TCP并未指明數據包類型:syn fin ack 窗口大小 數據包如果分片,要指明序號
pkt=IP(src='10.0.3.83',dst='10.0.3.88')/TCP(sport=12345,dport=5555)/data
#間隔一秒發送一次 總共發送5次 發送網卡口:enp1s0
send(pkt,inter=1,count=5,iface="enp1s0")
eth = Ether(src=src_mac, dst=dst_mac)#賦值src_mac時需要注意,參數為字符串類型
arp = ARP(hwsrc=src_mac, psrc=src_ip, hwdst=dst_mac, pdst=dst_ip, op=2)
#src為源,dst為目標,op=2為響應報文、1為請求
pkt = eth / arp
endp(pkt)
構建一層包:
#不同層之間用/分隔(常用)
Ether = Ether(src="源mac",dst="目的mac") ? ?#以太網層=二層
IP ? = IP(src="源ip",dst="目的ip或者URL") ? #IP層(三層)
XY ? = ICMP()、TCP()、UDP() [都可以用dport=目的端口,sport=源端口] #協議封裝在IP層 ?
ARP ?= ARP(hwsrc=‘二層源mac‘,psrc=‘三層源IP‘,hwdst=‘二層目的mac‘,pdst=‘三層目的IP‘) ? ?
SJ ? ?= padding(load=‘x‘*8) ? ? ? ? ? #數據位,填充 x乘8個 ? ?
RandMAC() ?任意MAC地址 ? ? ? ? ? ? ??
RandIP() ? 任意IP地址
構建二層包:
(以Ether層開頭)?如:pkt=Ether/IP/ARP
構建三層包:
(以IP層開頭)?如:pkt=IP/XY/SJ2.
只發送二層:
sendp() ?#給定網卡接口?
只發送三層:send() ? #自動根據路由表進行路由發送?
如發二層包:? ? ?
sendp(pkt,iface="eth0",loop=1,inter=1 ) ??
參數:
pkt ? ? ? #構建包的變量
iface="eth0" #選擇網卡為eth0
loop=1 ? ? ? #循環發送
inter=1 ? ? ?#每隔1秒發送
timeout=1 ? ?#超時1秒就丟棄,實際時間看程序處理能力而定
發送并返回?二層:? ?
srp() ? #發送包, 返回答復和沒有答復的包的數量? ? ?
srp1() #發送包, 返回只答復或者發送的包的詳細信息| .參數,顯示這個參數的返回數據?
三層:? ? ?
sr( ?) ?#發送包, 返回答復和沒有答復的包的數量? ? ?
sr1( ) #發送包, 返回只答復或者發送的包的詳細信息|.參數,顯示這個參數的返回數據?
如二層發收包:? ? ?
srp1(pkt,timeout=1,verbose=0 )?
參數:? ? ? ?
pkt ? ? ? #構建包的變量? ? ? ?
timeout=1 #超時1秒就丟棄,實際時間看程序處理能力而定? ? ? ?
verbose=0 #不顯示詳細信息
sniff嗅探函數:
sniff(filter="",iface="any",prn=function,count=N)
#filter參數允許對Scapy嗅探的數據包指定一個BPF(Wireshark類型)的過濾器,也可以留空以嗅探所有的數據包。
#iface參數設置嗅探器所要嗅探的網卡,留空則對所有網卡進行嗅探。
#prn參數指定嗅探到符合過濾器條件的數據包時所調用的回調函數,這個回調函數以接受到的數據包對象作為唯一的參數。
# count參數指定需要嗅探的數據包的個數,留空則默認為嗅探無限個
haslayer(xxx) 是scapy的一個成員函數,他會檢測XXX層是不是存在,存在的話,會將xxx層返回
xxx可以是 TCP,IP,ICMP
寫函數:
scapy.wrpcap(‘filename’,list)
第一個參數是filename,第二個參數是一個list,保存報文的list
?
參考:
https://www.jianshu.com/p/c42578889ba1
https://blog.csdn.net/hjxzb/article/details/79299121
https://blog.csdn.net/shichimiyasatone/article/details/79712976
https://blog.csdn.net/singleyellow/article/details/79737473
https://blog.csdn.net/qq_41185868/article/details/80396915
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
