Python编写网络嗅探器程序捕获和显示IP数据包的头部信息

Python编写网络嗅探器程序捕获和显示IP数据包的头部信息

抓取网络数据包并解析其中的IP首部信息,并通过GUI界面显示解析结果。程序展示了如何使用Python的socket和ctypes库来捕获和解析网络数据包,并使用Tkinter创建一个简单的GUI界面来显示捕获到的IP头部信息。这可以作为网络分析和监控工具的基础。

代码的主要部分包括以下几个类:

  1. IP类:使用ctypes库定义的数据结构,表示IP首部的各个字段。它包含了首部的各个字段,如版本、首部长度、区分服务、总长度、标识、片偏移、生存时间、协议、校验和等。它还具有解析IP地址的功能。
  2. Sniffer类:用于创建网络套接字,并通过原始套接字接收网络数据包。设置套接字的参数,以便在抓包时使用混杂模式。它还包含一个captureAPacket方法,用于抓取一个数据包并返回解析后的IP首部。
  3. SnifferWindow类:网络嗅探器类。使用tkinter库创建了一个窗口,并在窗口中添加了一个按钮和一些文本框。当点击按钮时,它会调用Sniffer类的方法抓取一个数据包,并将解析结果显示在文本框中。
    最后,代码通过创建一个SnifferWindow对象启动网络嗅探器的GUI界面。
    在这里插入图片描述

使用流程

1.敲代码,实现界面与网络嗅探功能

目标ip
192.168.1.112
2.在cmd命令行ping 192.168.1.112
在这里插入图片描述

3.运行程序获取信息

在这里插入图片描述

4.运行wireshark获取信息进行检验

在这里插入图片描述

5.对比信息可正常使用

在这里插入图片描述

详情

必要的库

  • socket: 用于创建原始套接字,捕获网络数据包
  • struct: 用于将原始数据转换为可读的格式
  • ctypes: 用于定义IP头部结构体
  • tkinter: 用于创建GUI界面
import socket
import struct
from ctypes import *
from tkinter import *

IP类:

继承自ctypes.Structure的结构体,用于表示IP数据包的头部信息。
定义了11个字段,分别对应IP头部的各个部分,如版本号、长度、协议、源IP地址和目标IP地址等。
在构造函数中,将IP地址从数字形式转换为点分十进制形式,并将协议号转换为对应的协议名称。

class IP(Structure):_fields_ = [("ihl", c_ubyte, 4),         # 头部长度(4位)("version", c_ubyte, 4),     # IP版本(4位)("tos", c_ubyte),            # 服务类型("len", c_ushort),           # 总长度("id", c_ushort),            # 标识("offset", c_ushort),        # 分片偏移("ttl", c_ubyte),            # 存活时间("protocol_num", c_ubyte),   # 协议号("sum", c_ushort),           # 校验和("src", c_uint32),           # 源IP地址("dst", c_uint32)            # 目标IP地址]def __new__(self, socket_buffer=None):return self.from_buffer_copy(socket_buffer)def __init__(self, socket_buffer=None):self.protocol_map = {1: "ICMP", 6: "TCP", 17: "UDP"}self.src_address = socket.inet_ntoa(struct.pack("@I", self.src))self.dst_address = socket.inet_ntoa(struct.pack("@I", self.dst))try:self.protocol= self.protocol_map[self.protocol_num]except :self.protocol = str(self.protocol_num)

Sniffer类

捕获网络数据包。
在构造函数中,创建一个原始套接字,并将其绑定到本地主机的所有网络接口上。
captureAPacket()方法用于捕获一个数据包,并返回一个IP对象,其中包含了IP头部的信息。

class Sniffer:def __init__(self):HOST = socket.gethostbyname(socket.gethostname())self.s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)self.s.bind((HOST, 0))self.s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)def captureAPacket(self):self.s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)bufferSize = 65565package = self.s.recvfrom(bufferSize)raw_buffer = package[0]ipHeader = IP(raw_buffer[0:20])self.s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)return ipHeader

SnifferWindow类

创建一个GUI界面,显示捕获到的IP数据包的头部信息。
在构造函数中,创建了一个Tkinter窗口,并添加了一个"抓包"按钮。
还创建了多个标签和文本框显示IP头部的各个字段,如版本号、首部长度、服务类型、总长度、标识、片偏移、生存时间、协议、校验和,以及源IP地址和目标IP地址。
show()方法被"抓包"按钮的command属性调用,它创建一个Sniffer对象,并调用其captureAPacket()方法来捕获一个数据包。然后,它将捕获到的IP头部信息显示在GUI窗口中。

class SnifferWindow:def __init__(self):window = Tk()window.title("网络嗅探器")button1 = Button(window, text="抓包", command=self.show)button1.pack()frame1 = Frame(window)frame1.pack(pady=15)labelVersion = Label(frame1, text="版本: ")labelVersion.grid(row=1, column=1, sticky="E")self.version = StringVar()entryVersion = Entry(frame1, textvariable=self.version, width=50)entryVersion.grid(row=1, column=2, padx=15, sticky="WE")labelHeadlen = Label(frame1, text="首部长度: ")labelHeadlen.grid(row=2, column=1, sticky="E")self.headlen = StringVar()entryHeadlen = Entry(frame1, textvariable=self.headlen)entryHeadlen.grid(row=2, column=2, padx=15, sticky="WE")labelTypeOfService = Label(frame1, text="区分服务: ")labelTypeOfService.grid(row=3, column=1, sticky="E")self.typeOfService = StringVar()entryTypeOfService = Entry(frame1, textvariable=self.typeOfService)entryTypeOfService.grid(row=3, column=2, padx=15, sticky="WE")labelLength = Label(frame1, text="总长度: ")labelLength.grid(row=4, column=1, sticky="E")self.length = StringVar()entryLength = Entry(frame1, textvariable=self.length)entryLength.grid(row=4, column=2, padx=15, sticky="WE")labelId = Label(frame1, text="标识: ")labelId.grid(row=5, column=1, sticky="E")self.id = StringVar()entryId = Entry(frame1, textvariable=self.id)entryId.grid(row=5, column=2, padx=15, sticky="WE")labelOffSet = Label(frame1, text="片偏移: ")labelOffSet.grid(row=6, column=1, sticky="E")self.offSet = StringVar()entryOffSet = Entry(frame1, textvariable=self.offSet)entryOffSet.grid(row=6, column=2, padx=15, sticky="WE")labelTtl = Label(frame1, text="生存时间: ")labelTtl.grid(row=7, column=1, sticky="E")self.ttl = StringVar()entryTtl = Entry(frame1, textvariable=self.ttl)entryTtl.grid(row=7, column=2, padx=15, sticky="WE")labelProtocol = Label(frame1, text="协议: ")labelProtocol.grid(row=8, column=1, sticky="E")self.protocol = StringVar()entryProtocol = Entry(frame1, textvariable=self.protocol)entryProtocol.grid(row=8, column=2, padx=15, sticky="WE")labelSum = Label(frame1, text="校验和: ")labelSum.grid(row=9, column=1, sticky="E")self.sum = StringVar()entrySum = Entry(frame1, textvariable=self.sum)entrySum.grid(row=9, column=2, padx=15, sticky="WE")labelSrcAddress = Label(frame1, text="源IP地址: ")labelSrcAddress.grid(row=10, column=1, sticky="E")self.srcAddress = StringVar()entrySrcAddress = Entry(frame1, textvariable=self.srcAddress)entrySrcAddress.grid(row=10, column=2, padx=15, sticky="WE")labelDstAddress = Label(frame1, text="目的IP地址: ")labelDstAddress.grid(row=11, column=1, sticky="E")self.dstAddress = StringVar()entryDstAddress = Entry(frame1, textvariable=self.dstAddress)entryDstAddress.grid(row=11, column=2, padx=15, sticky="WE")window.mainloop()def show(self):sniffer = Sniffer()ipHeader = sniffer.captureAPacket()self.version.set(str(ipHeader.version))self.headlen.set(str(ipHeader.ihl))self.typeOfService.set(str(ipHeader.tos))self.length.set(str(ipHeader.len))self.id.set(str(ipHeader.id))self.offSet.set(str(ipHeader.offset))self.ttl.set(str(ipHeader.ttl))self.protocol.set(str(ipHeader.protocol_num) + "(" + ipHeader.protocol + ")")self.sum.set(str(ipHeader.sum))self.srcAddress.set(str(ipHeader.src) + "(" + ipHeader.src_address + ")")self.dstAddress.set(str(ipHeader.dst) + "(" + ipHeader.dst_address + ")")

程序展示了如何使用Python的socket和ctypes库来捕获和解析网络数据包,并使用Tkinter创建一个简单的GUI界面来显示捕获到的IP头部信息。这可以作为网络分析和监控工具的基础。

总代码

import socket
import struct
from ctypes import *
from tkinter import *# IP头部结构
class IP(Structure):_fields_ = [("ihl", c_ubyte, 4),         # 头部长度(4位)("version", c_ubyte, 4),     # IP版本(4位)("tos", c_ubyte),            # 服务类型("len", c_ushort),           # 总长度("id", c_ushort),            # 标识("offset", c_ushort),        # 分片偏移("ttl", c_ubyte),            # 存活时间("protocol_num", c_ubyte),   # 协议号("sum", c_ushort),           # 校验和("src", c_uint32),           # 源IP地址("dst", c_uint32)            # 目标IP地址]def __new__(self, socket_buffer=None):return self.from_buffer_copy(socket_buffer)def __init__(self, socket_buffer=None):self.protocol_map = {1: "ICMP", 6: "TCP", 17: "UDP"}self.src_address = socket.inet_ntoa(struct.pack("@I", self.src))self.dst_address = socket.inet_ntoa(struct.pack("@I", self.dst))try:self.protocol= self.protocol_map[self.protocol_num]except :self.protocol = str(self.protocol_num)
class Sniffer:def __init__(self):HOST = socket.gethostbyname(socket.gethostname())self.s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)self.s.bind((HOST, 0))self.s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)def captureAPacket(self):self.s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)bufferSize = 65565package = self.s.recvfrom(bufferSize)raw_buffer = package[0]ipHeader = IP(raw_buffer[0:20])self.s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)return ipHeaderclass SnifferWindow:def __init__(self):window = Tk()window.title("网络嗅探器")button1 = Button(window, text="抓包", command=self.show)button1.pack()frame1 = Frame(window)frame1.pack(pady=15)labelVersion = Label(frame1, text="版本: ")labelVersion.grid(row=1, column=1, sticky="E")self.version = StringVar()entryVersion = Entry(frame1, textvariable=self.version, width=50)entryVersion.grid(row=1, column=2, padx=15, sticky="WE")labelHeadlen = Label(frame1, text="首部长度: ")labelHeadlen.grid(row=2, column=1, sticky="E")self.headlen = StringVar()entryHeadlen = Entry(frame1, textvariable=self.headlen)entryHeadlen.grid(row=2, column=2, padx=15, sticky="WE")labelTypeOfService = Label(frame1, text="区分服务: ")labelTypeOfService.grid(row=3, column=1, sticky="E")self.typeOfService = StringVar()entryTypeOfService = Entry(frame1, textvariable=self.typeOfService)entryTypeOfService.grid(row=3, column=2, padx=15, sticky="WE")labelLength = Label(frame1, text="总长度: ")labelLength.grid(row=4, column=1, sticky="E")self.length = StringVar()entryLength = Entry(frame1, textvariable=self.length)entryLength.grid(row=4, column=2, padx=15, sticky="WE")labelId = Label(frame1, text="标识: ")labelId.grid(row=5, column=1, sticky="E")self.id = StringVar()entryId = Entry(frame1, textvariable=self.id)entryId.grid(row=5, column=2, padx=15, sticky="WE")labelOffSet = Label(frame1, text="片偏移: ")labelOffSet.grid(row=6, column=1, sticky="E")self.offSet = StringVar()entryOffSet = Entry(frame1, textvariable=self.offSet)entryOffSet.grid(row=6, column=2, padx=15, sticky="WE")labelTtl = Label(frame1, text="生存时间: ")labelTtl.grid(row=7, column=1, sticky="E")self.ttl = StringVar()entryTtl = Entry(frame1, textvariable=self.ttl)entryTtl.grid(row=7, column=2, padx=15, sticky="WE")labelProtocol = Label(frame1, text="协议: ")labelProtocol.grid(row=8, column=1, sticky="E")self.protocol = StringVar()entryProtocol = Entry(frame1, textvariable=self.protocol)entryProtocol.grid(row=8, column=2, padx=15, sticky="WE")labelSum = Label(frame1, text="校验和: ")labelSum.grid(row=9, column=1, sticky="E")self.sum = StringVar()entrySum = Entry(frame1, textvariable=self.sum)entrySum.grid(row=9, column=2, padx=15, sticky="WE")labelSrcAddress = Label(frame1, text="源IP地址: ")labelSrcAddress.grid(row=10, column=1, sticky="E")self.srcAddress = StringVar()entrySrcAddress = Entry(frame1, textvariable=self.srcAddress)entrySrcAddress.grid(row=10, column=2, padx=15, sticky="WE")labelDstAddress = Label(frame1, text="目的IP地址: ")labelDstAddress.grid(row=11, column=1, sticky="E")self.dstAddress = StringVar()entryDstAddress = Entry(frame1, textvariable=self.dstAddress)entryDstAddress.grid(row=11, column=2, padx=15, sticky="WE")window.mainloop()def show(self):sniffer = Sniffer()ipHeader = sniffer.captureAPacket()self.version.set(str(ipHeader.version))self.headlen.set(str(ipHeader.ihl))self.typeOfService.set(str(ipHeader.tos))self.length.set(str(ipHeader.len))self.id.set(str(ipHeader.id))self.offSet.set(str(ipHeader.offset))self.ttl.set(str(ipHeader.ttl))self.protocol.set(str(ipHeader.protocol_num) + "(" + ipHeader.protocol + ")")self.sum.set(str(ipHeader.sum))self.srcAddress.set(str(ipHeader.src) + "(" + ipHeader.src_address + ")")self.dstAddress.set(str(ipHeader.dst) + "(" + ipHeader.dst_address + ")")
SnifferWindow()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/43405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

日志服务SLS入门指南

日志服务SLS入门指南 什么是日志服务SLSNginx日志采集部署Nginx创建Logstore接入数据 数据脱敏创建脱敏Logstore数据加工 告警设置添加告警规则查看告警 写在最后 什么是日志服务SLS 在说到日志服务SLS之前,首先了解一下什么是日志服务SLS?日志服务SLS是…

PHP项目中的前端页面随意点击卡片后会重定向到首页或登录页

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

pycharm使用micropython

一、打开设置 2、搜索micropython、安装、重启 3、第5步需要设置成你插的电脑USB口,一个一个试 4、 5、 6、OK

jEasyUI 合并单元格

jEasyUI 合并单元格 jEasyUI 是一个基于 jQuery 的框架,用于创建交互式的 Web 应用程序。它提供了一系列的 UI 组件,如表格(datagrid)、树(tree)、下拉列表(combobox)等,使得用户能够轻松地构建具有丰富用户界面的应用程序。在本文中,我们将重点讨论如何在 jEasyUI …

ES6 Reflect 详解(三)

Reflect 对象与Proxy 对象一样,也是 ES6 为了操作对象而提供的新 API。 Reflect 对象的设计目的有 4 个。 将 Object 对象的一些明显属于语言内部的方法(比如 Object.defineProperty ),放到 Reflect 对象上。现阶段,某…

手机数据恢复篇:优秀的 iPhone 数据恢复汇总

如果您不幸遭遇 iPhone 死机、进水或死机,一切还不算晚。您可以使用 iPhone 数据恢复应用恢复文件、照片、应用数据、消息等。 使用以下选项,您可以恢复 iPhone 上的少量内容、特定项目或所有内容。有些应用程序甚至提供修复工具来修复最初导致数据丢失…

这组杭州亚运会可视化大屏,绝对引领了时代。

本期分享杭州亚运会的可视化大屏,非常的震撼,杭州不愧为我国互联网最发达的的城市之一。 怒赞!!!

暑期旅游怎么玩?开发旅游小程序让出行变简单

暑假正值旅游旺季,旅游小程序的出现为旅行带来了许多便利。随着移动互联网的发展,旅游行业也在不断寻求创新与变革。旅游小程序为游客提供了更加便捷的旅行体验,通过旅游小程序,用户可以了解旅游信息、旅游服务、在线咨询等&#…

从 Github 安装 R packages 不完全指南

前言 R语言,一个被广泛使用的统计计算和数据分析工具。在日常使用过程中,需要安装实现各种功能、来自各种渠道的工具包(packages)比如:CRNA或者Github。很多包已经发布在 CRAN 上,使用 install.packages(&q…

【Dison夏令营 Day 13】使用 Python 创建扫雷游戏

在本文中,我们将介绍如何使用 Python 语言创建自己的基于终端的扫雷程序。 关于游戏 1992年4月6日,扫雷和纸牌、空当接龙等小游戏搭载在Windows 3.1系统中与用户见面,主要目的是让用户训练使用鼠标。扫雷是一款单人游戏,这个游戏…

Linux系统下anaconda的安装与Pytorch环境的下载

首先,在命令行通过cd命令,进入用户文件夹 cd xxx/xxx/username进入anaconda官网https://repo.anaconda.com/archive/,寻找anaconda下载包资源,这里选择最新的anaconda下载包 Anaconda3-2024.06-1-Linux-x86_64.sh 在命令行执行安…

Python爬虫-获取懂车帝“指定车型”的销量数据

前言 本文是该专栏的第33篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏之前,笔者有详细介绍关于懂车平台的相关爬虫,如下所示: 1. Python爬虫-新能源汽车对应的“年份月份”销量榜 2. Python爬虫-懂车帝城市销量榜单 3. Python爬虫-新能源汽车销量榜 4. Pyth…

:-1: error: ninja: build stopped: subcommand failed.

错误解释: 这个错误通常出现在使用Ninja构建系统进行软件编译时。Ninja是一个小型的构建系统,它比make更快,因为它直接调用指定的命令来执行构建,而不是像make那样通过一套复杂的规则和依赖关系来进行。如果在Ninja构建过程中遇到…

气膜建筑如何在文化旅游行业中应用—轻空间

一、气膜建筑简介 气膜建筑是一种新型建筑形式,其主要结构由高强度膜材、空气支撑系统和固定系统组成。通过不断向膜体内部充气,使其形成稳定的内部压力来支撑整个建筑结构。气膜建筑因其建设速度快、成本相对较低、环保节能等优点,近年来在各…

阶段三:项目开发---大数据开发运行环境搭建:任务3:安装配置Hadoop集群

任务描述 知识点:安装配置Hadoop 重 点: 安装配置Hadoop 难 点:无 内 容: Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威…

Linux系统编程——线程控制

目录 一,关于线程控制 二,线程创建 2.1 pthread_create函数 2.2 ps命令查看线程信息 三,线程等待 3.1 pthread_join函数 3.2 创建多个线程 3.3 pthread_join第二个参数 四,线程终止 4.1 关于线程终止 4.2 pthread_exit…

【软件设计师】九、数据流图、UML图

知识点1:数据流图 数据路流图亦称为数据流程图,一种便于用户理解,分析系统数据流称的图形工具;买哦书系统的功能,输入,输出,数据存储等; 知识点2:数据字典 数据流&…

深度学习 - 模型剪枝技术详解

模型剪枝简介 模型剪枝(Model Pruning)是一种通过减少模型参数来降低模型复杂性的方法,从而加快推理速度并减少内存消耗,同时尽量不显著降低模型性能。这种技术特别适用于资源受限的设备,如移动设备和嵌入式系统。模型…

提示词工程课程,白嫖A100活动课程

扫下面二维码即可参加 免费使用A100,学习大模型相关知识! 前置知识: 内容来源:Docs 模型设置 在使用提示词的时候,您会通过 API 或者网页版与大语言模型进行交互,将这些参数、设置调整到最佳程度会提高使…

面试题 12. 矩阵中的路径

矩阵中的路径 题目描述示例 题解 题目描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成&#xff0…