tcp協(xié)議:
---Source Port是源端口,16位
---Destination Port是目的端口,16位
---Sequence Number是發(fā)送數(shù)據(jù)包中的第一個(gè)字節(jié)的序列號(hào),32位
---Acknowledgment Number是確認(rèn)序列號(hào),32位
---Data Offset是數(shù)據(jù)偏移,4位,該字段的值是TCP首部(包括選項(xiàng))長度除以4
---標(biāo)志位: 6位,URG表示Urgent Pointer字段有意義:
ACK表示Acknowledgment Number字段有意義
PSH表示Push功能,RST表示復(fù)位TCP連接
SYN表示SYN報(bào)文(在建立TCP連接的時(shí)候使用)
FIN表示沒有數(shù)據(jù)需要發(fā)送了(在關(guān)閉TCP連接的時(shí)候使用)
Window表示接收緩沖區(qū)的空閑空間,16位,用來告訴TCP連接對(duì)端自己能夠接收的最大數(shù)據(jù)長度
---Checksum是校驗(yàn)和,16位
---Urgent Pointers是緊急指針,16位,只有URG標(biāo)志位被設(shè)置時(shí)該字段才有意義,表示緊急數(shù)據(jù)相對(duì)序列號(hào)(Sequence Number字段的值)的偏移
IHL(Internet Header Length 報(bào)頭長度)是計(jì)算機(jī)名詞,位于IP報(bào)文的第二個(gè)字段,4位,表示IP報(bào)文頭部按32位字長(32位,4字節(jié))計(jì)數(shù)的長度,也即報(bào)文頭的長度等于IHL的值乘以4
涉及到python中的scapy庫
# -- coding: utf-8 --
from scapy.all import *
#數(shù)據(jù)包應(yīng)用層數(shù)據(jù)部分
data='mydata'
#發(fā)送端IP地址10.0.3.83 接收端ip 10.0.3.88
傳輸層的TCP并未指明數(shù)據(jù)包類型:syn fin ack 窗口大小 數(shù)據(jù)包如果分片,要指明序號(hào)
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í)需要注意,參數(shù)為字符串類型
arp = ARP(hwsrc=src_mac, psrc=src_ip, hwdst=dst_mac, pdst=dst_ip, op=2)
#src為源,dst為目標(biāo),op=2為響應(yīng)報(bào)文、1為請(qǐng)求
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個(gè) ? ?
RandMAC() ?任意MAC地址 ? ? ? ? ? ? ??
RandIP() ? 任意IP地址
構(gòu)建二層包:
(以Ether層開頭)?如:pkt=Ether/IP/ARP
構(gòu)建三層包:
(以IP層開頭)?如:pkt=IP/XY/SJ2.
只發(fā)送二層:
sendp() ?#給定網(wǎng)卡接口?
只發(fā)送三層:send() ? #自動(dòng)根據(jù)路由表進(jìn)行路由發(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 ? ?#超時(shí)1秒就丟棄,實(shí)際時(shí)間看程序處理能力而定
發(fā)送并返回?二層:? ?
srp() ? #發(fā)送包, 返回答復(fù)和沒有答復(fù)的包的數(shù)量? ? ?
srp1() #發(fā)送包, 返回只答復(fù)或者發(fā)送的包的詳細(xì)信息| .參數(shù),顯示這個(gè)參數(shù)的返回?cái)?shù)據(jù)?
三層:? ? ?
sr( ?) ?#發(fā)送包, 返回答復(fù)和沒有答復(fù)的包的數(shù)量? ? ?
sr1( ) #發(fā)送包, 返回只答復(fù)或者發(fā)送的包的詳細(xì)信息|.參數(shù),顯示這個(gè)參數(shù)的返回?cái)?shù)據(jù)?
如二層發(fā)收包:? ? ?
srp1(pkt,timeout=1,verbose=0 )?
參數(shù):? ? ? ?
pkt ? ? ? #構(gòu)建包的變量? ? ? ?
timeout=1 #超時(shí)1秒就丟棄,實(shí)際時(shí)間看程序處理能力而定? ? ? ?
verbose=0 #不顯示詳細(xì)信息
sniff嗅探函數(shù):
sniff(filter="",iface="any",prn=function,count=N)
#filter參數(shù)允許對(duì)Scapy嗅探的數(shù)據(jù)包指定一個(gè)BPF(Wireshark類型)的過濾器,也可以留空以嗅探所有的數(shù)據(jù)包。
#iface參數(shù)設(shè)置嗅探器所要嗅探的網(wǎng)卡,留空則對(duì)所有網(wǎng)卡進(jìn)行嗅探。
#prn參數(shù)指定嗅探到符合過濾器條件的數(shù)據(jù)包時(shí)所調(diào)用的回調(diào)函數(shù),這個(gè)回調(diào)函數(shù)以接受到的數(shù)據(jù)包對(duì)象作為唯一的參數(shù)。
# count參數(shù)指定需要嗅探的數(shù)據(jù)包的個(gè)數(shù),留空則默認(rèn)為嗅探無限個(gè)
haslayer(xxx) 是scapy的一個(gè)成員函數(shù),他會(huì)檢測(cè)XXX層是不是存在,存在的話,會(huì)將xxx層返回
xxx可以是 TCP,IP,ICMP
寫函數(shù):
scapy.wrpcap(‘filename’,list)
第一個(gè)參數(shù)是filename,第二個(gè)參數(shù)是一個(gè)list,保存報(bào)文的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ù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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