tcp協(xié)議:
---Source Port是源端口,16位
---Destination Port是目的端口,16位
---Sequence Number是發(fā)送數(shù)據(jù)包中的第一個字節(jié)的序列號,32位
---Acknowledgment Number是確認序列號,32位
---Data Offset是數(shù)據(jù)偏移,4位,該字段的值是TCP首部(包括選項)長度除以4
---標志位: 6位,URG表示Urgent Pointer字段有意義:
ACK表示Acknowledgment Number字段有意義
PSH表示Push功能,RST表示復位TCP連接
SYN表示SYN報文(在建立TCP連接的時候使用)
FIN表示沒有數(shù)據(jù)需要發(fā)送了(在關(guān)閉TCP連接的時候使用)
Window表示接收緩沖區(qū)的空閑空間,16位,用來告訴TCP連接對端自己能夠接收的最大數(shù)據(jù)長度
---Checksum是校驗和,16位
---Urgent Pointers是緊急指針,16位,只有URG標志位被設(shè)置時該字段才有意義,表示緊急數(shù)據(jù)相對序列號(Sequence Number字段的值)的偏移
IHL(Internet Header Length 報頭長度)是計算機名詞,位于IP報文的第二個字段,4位,表示IP報文頭部按32位字長(32位,4字節(jié))計數(shù)的長度,也即報文頭的長度等于IHL的值乘以4
涉及到python中的scapy庫
# -- coding: utf-8 --
from scapy.all import *
#數(shù)據(jù)包應用層數(shù)據(jù)部分
data='mydata'
#發(fā)送端IP地址10.0.3.83 接收端ip 10.0.3.88
傳輸層的TCP并未指明數(shù)據(jù)包類型:syn fin ack 窗口大小 數(shù)據(jù)包如果分片,要指明序號
pkt=IP(src='10.0.3.83',dst='10.0.3.88')/TCP(sport=12345,dport=5555)/data
#間隔一秒發(fā)送一次 總共發(fā)送5次 發(fā)送網(wǎng)卡口:enp1s0
send(pkt,inter=1,count=5,iface="enp1s0")
eth = Ether(src=src_mac, dst=dst_mac)#賦值src_mac時需要注意,參數(shù)為字符串類型
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)
構(gòu)建一層包:
#不同層之間用/分隔(常用)
Ether = Ether(src="源mac",dst="目的mac") ? ?#以太網(wǎng)層=二層
IP ? = IP(src="源ip",dst="目的ip或者URL") ? #IP層(三層)
XY ? = ICMP()、TCP()、UDP() [都可以用dport=目的端口,sport=源端口] #協(xié)議封裝在IP層 ?
ARP ?= ARP(hwsrc=‘二層源mac‘,psrc=‘三層源IP‘,hwdst=‘二層目的mac‘,pdst=‘三層目的IP‘) ? ?
SJ ? ?= padding(load=‘x‘*8) ? ? ? ? ? #數(shù)據(jù)位,填充 x乘8個 ? ?
RandMAC() ?任意MAC地址 ? ? ? ? ? ? ??
RandIP() ? 任意IP地址
構(gòu)建二層包:
(以Ether層開頭)?如:pkt=Ether/IP/ARP
構(gòu)建三層包:
(以IP層開頭)?如:pkt=IP/XY/SJ2.
只發(fā)送二層:
sendp() ?#給定網(wǎng)卡接口?
只發(fā)送三層:send() ? #自動根據(jù)路由表進行路由發(fā)送?
如發(fā)二層包:? ? ?
sendp(pkt,iface="eth0",loop=1,inter=1 ) ??
參數(shù):
pkt ? ? ? #構(gòu)建包的變量
iface="eth0" #選擇網(wǎng)卡為eth0
loop=1 ? ? ? #循環(huán)發(fā)送
inter=1 ? ? ?#每隔1秒發(fā)送
timeout=1 ? ?#超時1秒就丟棄,實際時間看程序處理能力而定
發(fā)送并返回?二層:? ?
srp() ? #發(fā)送包, 返回答復和沒有答復的包的數(shù)量? ? ?
srp1() #發(fā)送包, 返回只答復或者發(fā)送的包的詳細信息| .參數(shù),顯示這個參數(shù)的返回數(shù)據(jù)?
三層:? ? ?
sr( ?) ?#發(fā)送包, 返回答復和沒有答復的包的數(shù)量? ? ?
sr1( ) #發(fā)送包, 返回只答復或者發(fā)送的包的詳細信息|.參數(shù),顯示這個參數(shù)的返回數(shù)據(jù)?
如二層發(fā)收包:? ? ?
srp1(pkt,timeout=1,verbose=0 )?
參數(shù):? ? ? ?
pkt ? ? ? #構(gòu)建包的變量? ? ? ?
timeout=1 #超時1秒就丟棄,實際時間看程序處理能力而定? ? ? ?
verbose=0 #不顯示詳細信息
sniff嗅探函數(shù):
sniff(filter="",iface="any",prn=function,count=N)
#filter參數(shù)允許對Scapy嗅探的數(shù)據(jù)包指定一個BPF(Wireshark類型)的過濾器,也可以留空以嗅探所有的數(shù)據(jù)包。
#iface參數(shù)設(shè)置嗅探器所要嗅探的網(wǎng)卡,留空則對所有網(wǎng)卡進行嗅探。
#prn參數(shù)指定嗅探到符合過濾器條件的數(shù)據(jù)包時所調(diào)用的回調(diào)函數(shù),這個回調(diào)函數(shù)以接受到的數(shù)據(jù)包對象作為唯一的參數(shù)。
# count參數(shù)指定需要嗅探的數(shù)據(jù)包的個數(shù),留空則默認為嗅探無限個
haslayer(xxx) 是scapy的一個成員函數(shù),他會檢測XXX層是不是存在,存在的話,會將xxx層返回
xxx可以是 TCP,IP,ICMP
寫函數(shù):
scapy.wrpcap(‘filename’,list)
第一個參數(shù)是filename,第二個參數(shù)是一個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
更多文章、技術(shù)交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

