python提取数据包中的文件_Python-对Pcap文件进行处理,获取指定TCP流
通過對TCP/IP協(xié)議的學(xué)習(xí),本人寫了一個可以實現(xiàn)對PCAP文件中的IPV4下的TCP流提取,以及提取指定的TCP流,鑒于為了學(xué)習(xí),沒有采用第三方包解析pcap,而是對bytes流進行解析,其核心思想為:若想要提取TCP Content,需在下層的IPV4協(xié)議中判斷Protocol是否為TCP,然后判斷下層的以太網(wǎng)協(xié)議的Type是否為IPV4協(xié)議(此處的IPV4判斷,只針對本人所寫項目);對于指定流需要獲取Client以及Server的[IP,PORT]。
一、Pcap文件解析
對于一個Pcap文件,其結(jié)構(gòu)為文件頭,數(shù)據(jù)包頭,數(shù)據(jù)包數(shù)據(jù),數(shù)據(jù)包頭,數(shù)據(jù)包數(shù)據(jù)……,文件頭為24字節(jié),如下:
Magic:4Byte:標記文件開始,并用來識別文件自己和字節(jié)順序
Major:2Byte:?當(dāng)前文件主要的版本號
Minor:2Byte:?當(dāng)前文件次要的版本號
ThisZone:4Byte:當(dāng)?shù)氐臉藴蕰r間,如果用的是GMT則全零,一般都直接寫?0000 0000
SigFigs:4Byte:時間戳的精度
SnapLen:4Byte:最大的存儲長度
LinkType:4Byte:鏈路類型
數(shù)據(jù)報頭為16字節(jié),如下:
Timestamp 4Byte:被捕獲時間的高位,精度為seconds
Timestamp 4Byte:被捕獲時間的低位,精度為microseconds
Caplen 4Byte:當(dāng)前數(shù)據(jù)區(qū)的長度,即抓取到的數(shù)據(jù)幀長度,不包括Packet?Header本身的長度,單位是?Byte?,由此可以得到下一個數(shù)據(jù)幀的位置。
Len 4Byte:離線數(shù)據(jù)長度:網(wǎng)絡(luò)中實際數(shù)據(jù)幀的長度,一般不大于caplen,多數(shù)情況下和Caplen數(shù)值相等。
Packet?Data
在數(shù)據(jù)包頭之后,就是數(shù)據(jù)包的數(shù)據(jù)了,數(shù)據(jù)長度就是Caplen個Byte,在此之后是一個新的Packet?Header,新的Packet?Data,如此循環(huán)。
二、以太網(wǎng)協(xié)議解析
以太網(wǎng)協(xié)議為14Byte,6Byte Destination,6Byte?Source,2Byte?Type
三、IPV4協(xié)議解析
不同的IP協(xié)議各有不同,本項目只選用IPV4下的TCP流
Version 4bit:對于IPv 4,這總是等于4
IHL 4bit:數(shù)據(jù)報協(xié)議頭長度,表示協(xié)議頭具有32位字長的數(shù)量。該字段的最小值為5,它表示長度為5×32位=160位=20字節(jié)。作為一個4位字段,最大值為15字(15×32位,或480位=60字節(jié))
DSCP 6bit:差分服務(wù)代碼點
ECN 2bit:顯式擁塞通知
Total?Length 2Byte:這個16位字段定義了整個IP數(shù)據(jù)包大小(以字節(jié)為單位),包括報頭和數(shù)據(jù),最小大小為20字節(jié)(沒有數(shù)據(jù)的頭),最大為65535字節(jié)。
Identification 2Byte:該字段是一個標識字段,主要用于唯一標識單個IP數(shù)據(jù)報的片段組。
Flags 3bit:用于控制或識別片段
Fragment Offset 13bit:片段偏移字段以8字節(jié)塊為單位進行測量。它有13位長,并指定特定片段相對于原始未分段ip數(shù)據(jù)報開頭的偏移量。第一個片段的偏移量為零。這允許最大偏移量(2**13-1)×8=65528字節(jié),這將超過包含報頭長度(65528+20=65548字節(jié))的最大IP數(shù)據(jù)包長度65535字節(jié)。
Time To Live (TTL) 1Byte:一段8位的存活時間有助于防止數(shù)據(jù)報在互聯(lián)網(wǎng)上持久化
Protocol 1Byte:此字段定義IP數(shù)據(jù)報的數(shù)據(jù)部分中使用的協(xié)議
Header Checksum 2Byte:16位IPV4頭校驗和字段用于對標頭進行錯誤檢查
Source address 4Byte:此字段是數(shù)據(jù)包發(fā)件人的IPV4地址。
Destination address 4Byte:該字段是數(shù)據(jù)包接收方的IPV4地址
Options:選項字段不常使用。
四、TCP協(xié)議解析
Source port (16 bits):標識發(fā)送端口
Destination port (16 bits):標識接收端口
Sequence number (32 bits):序列號,具有雙重作用,如果syn被設(shè)置成1,標志這是初始序列號,如果syn被設(shè)置成0,表示這是初始序列號,如果syn被設(shè)置成0,表示這是當(dāng)前會話的此段的第一個數(shù)據(jù)字節(jié)的累積序列號
Acknowledgment number (32 bits):如果設(shè)置ACK標志,則此字段的值是ACK發(fā)送方期望的下一個序列號
Data offset (4 bits):指定以32位為單位的tcp報頭的大小。最小標頭為5字,最大為15字,從而使其最小為20字節(jié),最大為60字節(jié),允許在標題中設(shè)置多達40字節(jié)的選項
Reserved (3 bits):供將來使用,并應(yīng)設(shè)置為零
Flags (9 bits) (aka Control bits):包含9個標志位
NS?(1 bit): ECN-nonce -?隱藏保護
CWR?(1 bit):?發(fā)送主機設(shè)置擁塞窗口減少(Cwr)標志,以表明它收到了設(shè)置了ecc標志的tcp段,并在擁塞控制機制中作出了響應(yīng)
ECE?(1 bit):?ECN-Echo具有雙重角色,這取決于SYN標志的值
URG?(1 bit):?指示緊急指針字段是有效的
ACK?(1 bit):?指示確認字段是有效的??蛻舳税l(fā)送的初始SYN數(shù)據(jù)包之后的所有數(shù)據(jù)包都應(yīng)該設(shè)置此標志
PSH?(1 bit):?推送功能,請求將緩沖數(shù)據(jù)推送到接收應(yīng)用程序
RST?(1 bit):重置連接
SYN?(1 bit):?同步序列號。只有從每一端發(fā)送的第一個數(shù)據(jù)包應(yīng)該設(shè)置此標志。其他一些標志和字段根據(jù)此標志更改含義,有些只有在設(shè)置1時才有效,而另一些則在0時才有效
FIN?(1 bit):?來自發(fā)送方的最后一包
Window size (16 bits):接收窗口的大小
Checksum (16 bits):16位校驗和字段用于對報頭、有效載荷和偽頭進行錯誤檢查
Urgent pointer (16 bits):如果設(shè)置了URG標志,則此16位字段與表示最后一個緊急數(shù)據(jù)字節(jié)的序列號之間的偏移量
Options (Variable 0–320 bits, divisible by 32):該字段的長度由數(shù)據(jù)偏移字段決定
五、處理文件
部分核心代碼如下:
此部分是對pcap(bytes)文件讀入,將每一個數(shù)據(jù)包數(shù)據(jù)作為一幀,判斷為IPV4-TCP數(shù)據(jù)后,將TCP里面的[src, dst,src_port,dst_port, seq, ack, flags, content]一幀幀提取,存儲在tcp_stream,此處即為提取pcap文件中所有的TCP流
此處是對于上面?zhèn)魅氲膖cp_stream,提取出我們想要指定的Tcpstream,如果flags_ack,flages_push為1時,即有Client或Server進行http請求,若此包被確認接收,則進行存儲(避免重傳,丟包的情況),判斷flags_fin為1時,結(jié)束循環(huán),返回指定的Tcp流。
六、完整代碼
TCP學(xué)習(xí):https://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_segment_structure
IPV4學(xué)習(xí):https://en.wikipedia.org/wiki/IPv4#Packet_structure
完整代碼:https://github.com/sunpudding/python,里面不僅有完整項目代碼,還有單元測試,歡迎下載,一起學(xué)習(xí)交流。
總結(jié)
以上是生活随笔為你收集整理的python提取数据包中的文件_Python-对Pcap文件进行处理,获取指定TCP流的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么我共享的文件别人看不到_【零基础学
- 下一篇: websocket python爬虫_p