最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python使用DPKT實(shí)現(xiàn)分析數(shù)據(jù)包

 更新時(shí)間:2023年10月22日 09:38:17   作者:lyshark  
dpkt項(xiàng)目是一個(gè)Python模塊,主要用于對網(wǎng)絡(luò)數(shù)據(jù)包進(jìn)行解析和操作,z這篇文章主要為大家介紹了python如何利用DPKT實(shí)現(xiàn)分析數(shù)據(jù)包,有需要的可以參考下

dpkt項(xiàng)目是一個(gè)Python模塊,主要用于對網(wǎng)絡(luò)數(shù)據(jù)包進(jìn)行解析和操作。它可以處理多種協(xié)議,例如TCP、UDP、IP等,并提供了一些常用的網(wǎng)絡(luò)操作功能,例如計(jì)算校驗(yàn)和、解析DNS數(shù)據(jù)包等。由于其簡單易用的特性,dpkt被廣泛應(yīng)用于網(wǎng)絡(luò)安全領(lǐng)域,例如流量分析、漏洞利用、入侵檢測等。使用該庫可以快速解析通過各類抓包工具抓到的數(shù)據(jù)包,從而提取分析包內(nèi)的參數(shù)。

安裝DPKT工具:pip install dpkt

在分析數(shù)據(jù)包之前我們需要抓取特定數(shù)據(jù)包并保存為*.pcap格式,通常情況下這種數(shù)據(jù)包格式可通過WireShark等工具抓取到,當(dāng)然也可以使用上一篇提到的Scapy庫實(shí)現(xiàn),該庫中存在一個(gè)sniff函數(shù),該函數(shù)可以實(shí)現(xiàn)網(wǎng)絡(luò)抓包功能,如下一個(gè)演示案例我們分別通過sniff(count=2)函數(shù)抓取兩個(gè)數(shù)據(jù)包并使用wrpcap()函數(shù)將其保存到文件內(nèi),當(dāng)需要分析時(shí)可通過調(diào)用rdpcap()函數(shù)打開數(shù)據(jù)包即可實(shí)現(xiàn)分析。

>>> from scapy.all import *
>>>
>>> packets = sniff(count=2)                            # 動態(tài)抓取2個(gè)數(shù)據(jù)包
>>>
>>> wrpcap("d://lyshark.pcap",packets)                  # 保存數(shù)據(jù)包
>>> pcap_packets = rdpcap("d://lyshark.pcap")           # 讀取數(shù)據(jù)包
>>>
>>> pcap_packets
<lyshark.pcap: TCP:2 UDP:0 ICMP:0 Other:0>
>>>
>>> pcap_packets.show()
0000 Ether / IP / TCP 192.168.1.101:63995 > 172.217.24.10:https S
0001 Ether / IP / TCP 192.168.1.101:63907 > 103.235.46.191:https A / Raw
>>>
>>> pcap_packets.summary()
Ether / IP / TCP 192.168.1.101:63995 > 172.217.24.10:https S
Ether / IP / TCP 192.168.1.101:63907 > 103.235.46.191:https A / Raw
>>>
>>> pcap_packets[0].dst
'FF:2d:1e:0f:1e:a1'
>>>
>>> pcap_packets[0].src
'a4:7e:33:ee:cc:b3'
>>>
# 如下分別代表: 鏈路層 [Ethernet]、網(wǎng)絡(luò)層[IP]、傳輸層[TCP/UDP]、應(yīng)用層[RAW]
>>> pcap_packets[0].show()
>>>
# 抓包后直接輸出
>>> sniff(prn=lambda x: x.show(), count=1)

通過上方的抓包流程讀者即可實(shí)現(xiàn)簡單的抓包功能,當(dāng)然sniff函數(shù)參數(shù)眾多我們完全可以在抓包時(shí)增加不同的抓包條件,同時(shí)該函數(shù)也支持回調(diào)函數(shù),當(dāng)由新的請求被觸發(fā)時(shí)則自動執(zhí)行回調(diào)函數(shù),如下則是使用Scapy抓包的完整案例,該案例展示了抓取60秒數(shù)據(jù)包,并將其保存至d://lyshark.pcap目錄。

from scapy.all import *
import scapy.all as scapy

# 數(shù)據(jù)包回調(diào)函數(shù)
def packet_callback(packet):
    if packet[TCP].payload:
        m_packet = str(packet[TCP].payload)
        print("主機(jī)地址: {} ---> 數(shù)據(jù)包內(nèi)容: {}".format(packet[IP].dst,packet[TCP].payload))

if __name__ == "__main__":
    # 抓取80端口的數(shù)據(jù)包并輸出到屏幕
    # sniff(filter="tcp port 80", prn=packet_callback, store=0)

    # 抓取 過濾出tcp協(xié)議 抓取1分鐘后保存到文件中
    package=sniff(filter="tcp", timeout=60, prn=packet_callback, store=1)
    wrpcap("d://lyshark.pcap", package)

運(yùn)行上方抓包程序,讀者可看到如下圖所示的輸出結(jié)果,等待60秒后即可看到d://lyshark.pcap文件。

當(dāng)讀者抓取到這些數(shù)據(jù)包之后,下一步則是解析這些數(shù)據(jù)包,解析的方法有許多可以使用DPKT解析,也可以使用scapy自帶的工具解析,本章首先介紹如何使用Scapy工具實(shí)現(xiàn)解析數(shù)據(jù)包內(nèi)的HTTP請求,并輸出的功能,如下是完整的代碼實(shí)現(xiàn);

from scapy.all import *
import scapy.all as scapy

# 解析獲取到的數(shù)據(jù)包
def get_http_pcap(pcap_path):
    pcap_infos = list()
    packets = scapy.rdpcap(pcap_path)
    for p in packets:
        if p.haslayer("IP"):
            src_ip = p["IP"].src
            dst_ip = p["IP"].dst
        if p.haslayer("TCP"):
            raw_http = p["TCP"].payload.original
            sport = p["TCP"].sport
            dport = p["TCP"].dport
        if p.haslayer("HTTPRequest"):
            host = p["HTTPRequest"].Host
            uri = p["HTTPRequest"].Path
            http_fields = p["HTTPRequest"].fields
            # print("主機(jī)地址: {} --> URI: {}".format(host,uri))
        print("原IP地址: {}:{} --> 目標(biāo)IP地址: {}:{}".format(src_ip,sport,dst_ip,dport))

if __name__ == "__main__":
    get_http_pcap("d://lyshark.pcap")

讀者可自行運(yùn)行上述代碼,并傳入剛才抓取到的lyshark.pcap數(shù)據(jù)包,此時(shí)則可解析出當(dāng)前數(shù)據(jù)包中所有HTTP訪問數(shù)據(jù),如下圖所示;

對于數(shù)據(jù)包的解包功能,Dpkt工具包也可以很好的完成,對于使用Dpkt解包而言,首先需要通過open()打開數(shù)據(jù)包,接著調(diào)用dpkt.pcap.Reader(fp)將文件內(nèi)的字節(jié)轉(zhuǎn)化為PCAP格式,最后調(diào)用自定義函數(shù)GetDpkt根據(jù)字段進(jìn)行解析即可。

import dpkt
import socket

def GetDpkt(pcap):
    for timestamp,packet in pcap:
        try:
            eth = dpkt.ethernet.Ethernet(packet)
            ip = eth.data
            tcp = ip.data

            src = socket.inet_ntoa(ip.src)
            dst = socket.inet_ntoa(ip.dst)
            sport = tcp.sport
            dport = tcp.dport
            print("[+] 源地址: {}:{} --> 目標(biāo)地址:{}:{}".format(src,sport,dst,dport))
        except Exception:
            pass

# 檢測主機(jī)是否被DDOS攻擊了
def FindDDosAttack(pcap):
    pktCount = {}
    for timestamp,packet in pcap:
        try:
            eth = dpkt.ethernet.Ethernet(packet)
            ip = eth.data
            tcp = ip.data
            src = socket.inet_ntoa(ip.src)
            dst = socket.inet_ntoa(ip.dst)
            sport = tcp.sport
            # 累計(jì)判斷各個(gè)src地址對目標(biāo)地址80端口訪問次數(shù)
            if dport == 80:
                stream = src + ":" + dst
                if pktCount.has_key(stream):
                    pktCount[stream] = pktCount[stream] + 1
                else:
                    pktCount[stream] = 1
        except Exception:
            pass
    for stream in pktCount:
        pktSent = pktCount[stream]
        # 如果超過設(shè)置的檢測閾值500,則判斷為DDOS攻擊行為
        if pktSent > 500:
            src = stream.split(":")[0]
            dst = stream.split(":")[1]
            print("[+] 源地址: {} 攻擊: {} 流量: {} pkts.".format(src,dst,str(pktSent)))

# FindPcapURL 監(jiān)控提取數(shù)據(jù)包中的所有URL
def FindPcapURL(pcap):
    Url = []
    for timestamp,packet in pcap:
        try:
            eth = dpkt.ethernet.Ethernet(packet)
            ip = eth.data
            src = socket.inet_ntoa(ip.src)
            tcp = ip.data
            http = dpkt.http.Request(tcp.data)
            if(http.method == "GET"):
                UrlHead = http.headers
                for key,value in UrlHead.items():
                    url = re.findall('^https*://.*',str(value))
                    if url:
                        print("[+] 源地址: %10s --> 訪問URL: %-80s"%(src, url[0]))
        except Exception:
            pass
    return set(Url)

# 動態(tài)保存pcap文件(每1024字節(jié)保存一次pcap文件),并讀取出其中的網(wǎng)址解析出來
def write_cap(pkt):
    global pkts
    global count
    pkts.append(pkt)
    count += 1
    if count == 1024:
        wrpcap("data.pcap",pkts)
        fp = open("./data.pcap","rb")
        pcap = dpkt.pcap.Reader(fp)
        FindPcapURL(pcap)
        fp.close()
        pkts,count = [],0

if __name__ == "__main__":
    fp = open("d://lyshark.pcap","rb")
    pcap = dpkt.pcap.Reader(fp)
    GetDpkt(pcap)

運(yùn)行上述代碼,同樣可以輸出這些IP信息,如下圖所示;

到此這篇關(guān)于Python使用DPKT實(shí)現(xiàn)分析數(shù)據(jù)包 的文章就介紹到這了,更多相關(guān)Python DPKT內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python 中yaml文件用法大全

    python 中yaml文件用法大全

    本文主要是總結(jié)yaml常用的一些數(shù)據(jù)形式,對于我們正常的項(xiàng)目使用,已經(jīng)足夠用了,接下來通過本文給大家分享python 中yaml文件用法,需要的朋友參考下吧
    2021-07-07
  • Pytorch實(shí)驗(yàn)常用代碼段匯總

    Pytorch實(shí)驗(yàn)常用代碼段匯總

    這篇文章主要介紹了Pytorch實(shí)驗(yàn)常用代碼段匯總,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • 用Python編寫一個(gè)高效的端口掃描器的方法

    用Python編寫一個(gè)高效的端口掃描器的方法

    這篇文章主要介紹了用Python編寫一個(gè)高效的端口掃描器的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-12-12
  • 將.ipynb文件轉(zhuǎn)換成.py文件詳細(xì)步驟(一看就會)

    將.ipynb文件轉(zhuǎn)換成.py文件詳細(xì)步驟(一看就會)

    這篇文章主要給大家介紹了關(guān)于如何將.ipynb文件轉(zhuǎn)換成.py文件的詳細(xì)步驟,文中通過圖文介紹的非常詳細(xì),大家基本一看就會,需要的朋友可以參考下
    2023-07-07
  • python變量類型、輸入、輸出運(yùn)算符介紹舉例

    python變量類型、輸入、輸出運(yùn)算符介紹舉例

    Python是一種功能強(qiáng)大的編程語言,支持多種數(shù)據(jù)類型和運(yùn)算符,它強(qiáng)調(diào)代碼的可讀性和簡潔性,變量在Python中是動態(tài)類型的,不需要顯式聲明類型,這篇文章主要介紹了python變量類型、輸入、輸出運(yùn)算符的相關(guān)資料,需要的朋友可以參考下
    2024-11-11
  • 手機(jī)使用python操作圖片文件(pydroid3)過程詳解

    手機(jī)使用python操作圖片文件(pydroid3)過程詳解

    這篇文章主要介紹了手機(jī)使用python操作圖片文件(pydroid3)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Python線程指南詳細(xì)介紹

    Python線程指南詳細(xì)介紹

    本文介紹了Python對于線程的支持,包括學(xué)會多線程編程需要掌握的基礎(chǔ)以及Python兩個(gè)線程標(biāo)準(zhǔn)庫的完整介紹及使用示例
    2017-01-01
  • python小技巧——將變量保存在本地及讀取

    python小技巧——將變量保存在本地及讀取

    這篇文章主要介紹了python小技巧——如何將變量保存在本地及讀取,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-11-11
  • python數(shù)據(jù)庫操作mysql:pymysql、sqlalchemy常見用法詳解

    python數(shù)據(jù)庫操作mysql:pymysql、sqlalchemy常見用法詳解

    這篇文章主要介紹了python數(shù)據(jù)庫操作mysql:pymysql、sqlalchemy常見用法,結(jié)合實(shí)例形式分析了Python mysql操作庫pymysql、sqlalchemy基本使用技巧與操作注意事項(xiàng),需要的朋友可以參考下
    2020-03-03
  • 詳解Python中列表數(shù)據(jù)的保存與讀取

    詳解Python中列表數(shù)據(jù)的保存與讀取

    列表是一種非常靈活的數(shù)據(jù)結(jié)構(gòu),它可以包含多種類型的元素,本文將介紹如何將一組列表保存到txt文件中,并提供相應(yīng)的讀取方法,希望對大家有所幫助
    2024-04-04

最新評論

茶陵县| 盘山县| 承德县| 竹溪县| 新干县| 托里县| 鲁山县| 迁西县| 邹城市| 大同市| 杨浦区| 扎囊县| 伊金霍洛旗| 景德镇市| 香港| 乐平市| 麻城市| 万宁市| 惠来县| 灌阳县| 那坡县| 靖西县| 郸城县| 沛县| 温州市| 平舆县| 烟台市| 吉水县| 深圳市| 沁阳市| 宜都市| 乌兰察布市| 黄梅县| 富锦市| 梁河县| 从江县| 吴川市| 安国市| 汝城县| 靖宇县| 得荣县|