• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Python实现的网络嗅探器100010784

武飞扬头像
神仙别闹
帮助3

基于C语言的网络嗅探器

一、引言

1.1 编写目的

通过编写网络嗅探器,可以提高编程能力,加深对网络协议的理解,培养团队协作能力,完成课程项目

二、功能概述

2.1 节 功能模块命名原则

使用英文进行命名

2.2 节 功能层次图

【底层模块】

LowLevel				1
main 				12
eth         			121
pppoe   				1211
ip					1212
arp					1213
pppoe_ip				12111
pppoe_other			12112
ip_tcp				12121
ip_udp				12122
ip_mp				12123
ip_tcp_http			121211
ip_tcp_ftp			121212
ip_tcp_telnet		121213

学新通

三、功能模块详述

3.1 节 底层模块

3.1.1 模块编号与中文注释

【说明】应与第二章第二节的表述一致。

模块编号 1

中文注释 底层模块

3.1.2 功能描述与性能描述

【说明】功能描述:本叶模块的主要功能。

性能描述:精度指标、响应速度指标、数据吞吐量指标……

功能描述:本模块主要实现对流量数据包的抓取与分析,实现对各层协议的具体分析,能够捕获使用 HTTP、FTP、TELNET 协议传输的用户名和密码。

性能描述:精度能够捕获每一个数据包;响应速度目前能够计时分析每一个数据包 在 100 条 printf 打印/S 的流量下能够顺利完成;数据吞吐量能够在 10MB/S 环境顺利完成分析任务

3.1.3 与本模块相关的代码表和表

【说明】

名称 中文注释 类型 类型 作用
名称 中文注释 代码表 作用
main 主文件     input
eth 以太网协议     input
ip ip 协议     input
arp arp 协议     input
tcp tcp 协议     input/output
mp icmp 和 igmp 协议     input
udp udp 协议     output
protocol_based_tcp 基于 tcp 的协议     output
protocol_based_udp 基于 udp 的协议     output
         

作用:input、 output 、update 等。

3.1.4 输入信息

【说明】参数(含参数名、中文注释、缺省值、格式)、数据文件的格式与权限、输入频度。使用特殊输入设备情况。输入时使用代码表与基本表的情况。

基于 pacap_next_ex()函数的内存数据

3.1.5 输出信息

【说明】参数(含参数名、中文注释、缺省值、格式)、数据文件的格式、输出频度、报表格式样张。使用特殊输出设备情况。输出时使用代码表与基本表的情况。

协议的内容、输出在标准输出上。

3.1.6 算法

【说明】包括计算公式与说明、某些设定的或必然的逻辑关系。对于函数,要着重说明。

main.c

代码思路

首先,对输入的参数,进行解析,提取用户的目的。

学新通

然后,选定网卡。这个过程中分为两部,根据输入的参数选定网卡,首先是获得所有网卡信息,然后遍历网卡信息,若与输入的网卡信息匹配,就将它选定。

学新通

然后,确定过滤信息。根据用户的输入,传给相应函数的参数。

学新通

然后,开始抓取数据包。

学新通

主要涉及的函数:

_get_all_devices ()[return the name of dev]->pcap_open_live()[open dev-file to be ready read file]-> pcap_compile()[compile the rule]->pcap_setfilter()[configurate the rule of filtering]->pcap_loop()[loop to capture the datagram]->pacap_close()[close the lib]
eth.c

对 eth 头部信息进行处理,然后根据它上层的协议类型将它的 payload 部分交给不同的函数,传递时,将 payload 的首地址交给协议函数进行处理。在 eth.h 中定义了以太头结构体和 PPPoe 头结构体,方便对数据包进行分析,还声明了相关的函数。

学新通

学新通

学新通

学新通

学新通

学新通

arp.c

主要是对 arp 协议的分析处理,首先在 arp.h 进行 arp 协议头部的结构体定义,然后定义 arp_prase 函数。在 arp_parse 函数中主要是获得源 MAC 的目的 MAC,源 IP 和目的 IP,然后打印他的 payload。没有对 arp 协议的 opcode 字段进行分析。

学新通

学新通

学新通

ip.c

网络层就只处理 IP 协议。Ip_parse 函数首先检查是否是 IPV4,然后检查 IP 是否分片,如果分片了就不处理返回 NOT SOUPPORT。然后检查是否是到监听的网卡的包,然后在判断它的上层协议,最后在分别交给不同的协议函数处理,传参的时候还传递了长度等参数,这时要将网络字节顺序转换为主机字节顺序。在 ip.h 中定义了 ip 头部结构体,声明了 ip_parse 函数。

学新通

学新通

学新通

学新通

学新通

学新通

学新通

mp.c

这个文件主要是对 IGMP 和 ICMP 协议进行分析。对 IGMP 协议,本程序主要分析了 IGMP 头部 type 字段,以及源和目的 IP。对于 ICMP 协议,本程序主要分析了 icmp 报文类型,并打印出来。在 mp.h 头文件定义了相关的结构体,以及声明了相关的函数。

学新通

学新通

学新通

学新通

学新通

学新通

udp.c

对 UDP 协议进行处理。在 udp.h 定义 udp 协议的头部结构体,然后声明了 udp_parse 函数和 protocol_based_udp 函数对基于 udp 协议的协议进行进一步处理,这个判断的依据主要是根据端口。在本程序中我们只是对 DNS 和 DHCP 协议进行了分析。如果是其他的协议,本程序只是打印其数据,没有做具体分析。

学新通

学新通

学新通

学新通

tcp.c

这个 TCP 协议是本程序实现的重点和难点,涉及到 tcp 流数据的重组。

应用层向 TCP 层发送用于网间传输的数据流,TCP 则把数据流分割成适当长度的报文段,最大报文段大小(MSS)通常受以太网 MTU 限制;对于 TCP 来说应尽量避免 IP 分片,TCP 协议在实现的时候往往用 MTU 值减去 IP 数据包头部和 TCP 数据段头部长度代替 MSS,一般为 1460 字节;所以通常 TCP 分段不会再出现 IP 分片的情况。MSS 是 TCP 协议定义的一个选项,MSS 选项用于在 TCP 连接建立时,收发双方协商通信时每一个报文段所能承载的最大数据长度。

因为 TCP 使用 IP 来传递它的报文段,IP 不提供重复消除和保证次序正确的功能,所以 TCP 重组主要处理包失序和包重复等问题。TCP 是一个字节流协议,TCP 绝不会以杂乱的次序给接收应用程序发送数据。因此,TCP 接收端可能会被迫先保持大序列号的数据不交给应用程序,直到缺失的小序列号的报文段被填满,最终按序将数据提交给应用程序,这也是 TCP 重组的目的。

TCP 分段为什么要避免 IP 分片?

因为如果在 IP 层进行分片的话,如果其中的某片数据丢失了,对于保证可靠性的 TCP 协议来说,会增大重传数据包的机率,而且只能重传整个 TCP 分组(进行 IP 分片前的数据包),因为 TCP 层是不知道 IP 层进行分片的细节的,也不关心。

TCP 出现包部分重复的原因?

当 TCP 超时重传,它并不需要完全重传相同的报文段。TCP 允许执行重新组包,发送一个更大的报文段来提高性能,因此可能导致部分数据重复!

在 tcp.h 头文件中对 tcp 头部进行了一个结构体的定义,然后定义了 tcp 头部相关的标志位,然后声明了 tcp_parse 函数。在 tcp_parse 函数中,首先进行了 tcp 校验,这里是 check.c 文件处理,然后判断选项字段是否存在值,然后接着就是判断 tcp 包是否是重复或者乱序到达的,这里是转到了 link.c 文件处理。

然后就是对 tcp 标志位进行获得,按需打印。

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

link.c

这一部分主要是对 tcp 流重组实现。由于 pcap_next_ex()函数抓取的数据包是原始的数据包,所以这里必须对它进行分析。上面也提到,由于网络的原因,tcp 超时等原因,tcp 会进行重传等操作,以及会发生重复的数据的现象。这里用了 hash 来判断它是否重复,然后使用链表的方式对 tcp 头部的 seq 和 ack 字段进行分析,先暂存不按顺序到达的 tcp 数据包,然后和下一个 tcp 数据包进行分析,最后当这个超时处理完后,就释放这次链表操作。在这里处理完一个完整的数据包后,同时又对 tcp 的 payload 部分进行上层协议分析。

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

hash.c 和 check.c

这里就不对他们进行展示,因为这是开源的代码。

protocol_based_tcp.c

这也是本程序主要设计的功能之一。这个文件中实现了对 HTPP、FTP、TELNET 三个协议的分析并能抓取通过这三个协议传输的用户名和密码。在这个文件中,首先对 tcp 的端口进行判定,如果是 21 21 端口就说明这是 ftp 传输协议、如果是 23 端口就是 telnet 协议,http 协议是通过 payload 的字段数据来判断的。

假如判断这是 http 的数据包之后,,就会判断它是何种类型的,例如 GET、POST 或者其他的,然后假如是 POST,就会抓取 HTTP 协议的 payload 部分,将它全部写到 http.txt 中去。因为对于使用 http 协议登录的网站,有可能是明文传输,也有可能是 MD5 加密后的。

假如是 FTP 协议,通过对 FTP 协议的分析,发现它传输用户名和密码时会进行关键字提示,所以就根据关键字来定位用户名和密码,然后写到文件中去。

假如是 TELNET 协议,这个协议比较复杂,在网络良好的情况下,它会一个字符一个字符的传输用户名密码,假如 Ack 确认包丢失或者超时后,它会重发该字符并再加一个字符,所以这种情况就是两个字符。同时,telnet 服务器在收到用户名的字符后还会回传这个字符表示收到。但是对于密码的字符它就不会回传,只会最终确认。在对这个协议进行用户名和密码抓取时本程序使用了链表,因为考虑到多个用户同时登陆时两者的数据包会交叉接收,所以同股票 PORT 和 IP 来进行判断,同时利用\r\n 和其他关键字进行判断。

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

gaze.h 这是本程序自定义的返回类型

学新通

学新通

学新通

学新通

dlfcn.h

这是 win32 平台要包含的文件,里面主要是对网卡的识别。因为在所用的函数中,它不能明确指明这是以太网网卡还是无线网卡,这是 windows 下 npcap 函数的毛病,所以用了其他的方式来获得网卡更明确的称谓。

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

学新通

MakeFIle

这是本程序的编译的 makefile 文件,里面包含了在不同环境下的库文件的使用,根据不同的环境可以产生在不同平台的可执行文件。

学新通

学新通

3.1.7 处理流程

【说明】可采用框图 文字叙述或 PAD 图 文字叙述。只要表达得清晰准确即可。

3.1.8 应说明的问题与限制

【说明】说明使用视图和触发器的情况,出错信息(获取手段、分类编码)及处理方法,隐含的假设,容易出现二义性的概念,应该如何,不容许如何……

3.1.9 屏幕布局设计与说明

【说明】参看《概要设计说明书》。可采取两种方式:

  • 绘图:使用计算机绘图工具。
  • 拷贝屏幕:为减少文件的长度,应保存单色图形,但必须具有多级灰度,以保证显示与打印的效果。
  • 对屏幕中的组件,应逐一进行说明。

3.2 节 前端模块

3.2.1 模块编号与中文注释

【说明】应与第二章第二节的表述一致。

3.2.2 功能描述与性能描述

【说明】功能描述:本叶模块的主要功能。

性能描述:精度指标、响应速度指标、数据吞吐量指标……

前端模块的主要功能即为:实现一个前端界面,将前端界面与后台实现的核心功能进行连接,并且显示主要窗口,在窗口中显示我们程序的各种核心功能,比如抓包,更改各类参数等。这里前端大体分为几个部分,首先一个主要窗口,这个窗口有主要的设置信息,包括限制嗅探环境、设置 IP 地址、设置 PORT、设置包类型等。并且支持在进行一次嗅探后更改参数多次嗅探,主要界面如下图所示:

学新通

在主界面中,可以多次更改需要的参数,而直到点击最终的开始嗅探,所有的参数才会被确定,在本次嗅探结束前不可更改。

主界面的性能描述:这个界面不需要实时处理太多参数,最终显示的嗅探结果也不再这个界面上,因此只需要保证正常的输出不会导致界面卡死即可。

其次是一个显示网卡的界面的主要功能:这个界面主要为了使用户确定自己需要嗅探的网卡,这个程序支自定义持网卡,这也是十分关键的一部分,如果用户不输入网卡参数,会使用默认网卡进行嗅探,可能会导致得到与用户期望不符的数据,因此不论进行什么类型包的嗅探工作,都建议首先执行此功能进行网卡查看与选择,这里点击后会跳转到另一个 python 程序中,这个程序会新建一个全新的界面,对本机的网卡进行扫描,并返回扫描到的结果,将其打印在窗口中,并且,会在这个窗口中将各个网卡进行命名,可以根据命名的数字结果进行选择。

选择网卡的界面如下图:

学新通

显示网卡的性能描述:这里显示的网卡功能,仅仅在程序开始时需要执行一次,确定网卡后如果不需要更改则无需重新打开这个界面,因此对性能要求并不高,能够正常执行并显示参数即可。

最后一个界面是开始嗅探的界面:这个界面的功能就是在用户选择完成相应参数信息后,可以选择这个功能开始嗅探工作,就会跳转到这个页面对刚才用户的选择结果的对应包进行嗅探工作,这里首先和上面一样需要一个能够显示信息的窗口,用来接收嗅探的结果,这里采用和上面一样的窗口,接受的数据由 shell 中获得,即将 shell 中本应显示的数据显示在这个界面上,在停止这个功能后本窗口就关闭回到主页面等待下次执行。

显示嗅探界面如下:

学新通

开始嗅探界面性能描述:对于这个界面,是本项目几个界面中要求最够的一个界面,j 不仅需要在窗口实时显示各种类型的数据包的内容,将这些打印数据从 shell 中重定向到这个界面,而且还需要保证在数据量极大的情况下这个窗口依旧能够准确接收每个包的内容,不能发生卡死的情况,这里仅使用一个管道加重定向数据流的方式不足以接收这个大量的数据内容,因此我们采取了一种更少见但是有效的方式,使用了队列来接收内容,首先定义一个队列,结合线程来使用缓存部分接收读取到的内容,当内容达到一定数量的时候,就将缓存中的数据进行打印,并更新缓存重新接受内容,使用这个方式就完美的解决了当数据量大时无法及时打印的问题

3.2.3 与本模块相关的代码表和表

【说明】

名称 中文注释 类型 类型 作用
名称 中文注释 代码表 作用
main.py 主界面     这是程序的主界面,显示各种参数
showDevice.py 显示网卡     这是显示网卡界面
beginSniff.py 开始嗅探     这是显示嗅探的界面

作用:input、 output 、update 等。

3.2.4 输入信息

【说明】参数(含参数名、中文注释、缺省值、格式)、数据文件的格式与权限、输入频度。使用特殊输入设备情况。输入时使用代码表与基本表的情况。

这里定义了需要显示的所有参数,首先在开始执行这个程序的时候不需要定义任何额外参数,就可以打开主界面,如下:

学新通

随后按照执行顺序,首先需要选择:嗅探环境选择按钮,对当前的嗅探环境进行定义,这里可以选择两种支持的嗅探环境:Linux 和 Windows 环境:

学新通

默认使用 Windows 环境,随后必须选择显示网卡界面,查看当前环境下的所有网卡信息,这里的信息会根据顺序由数字标识:

学新通

这里选择使用的 6 号网卡,随后需要在选择网卡界面输入确定的网卡的数字,如果这里不输入信息,将按照默认使用 1 号网卡

学新通

剩下的所有输入信息均为可选输入,如果均不输入则为默认状态

这里一个一个地进行演示,首先输入 IP 信息:

学新通

可以选择对端口进行限制,这里选择 443 端口:

学新通

其次选择包类型,这里选择 TCP:

学新通

MD5 解码,可以选择开启或者关闭:

学新通

保存数据为默认打开选项

以上为所有需要输入的参数信息

3.2.5 输出信息

【说明】参数(含参数名、中文注释、缺省值、格式)、数据文件的格式、输出频度、报表格式样张。使用特殊输出设备情况。输出时使用代码表与基本表的情况。

本模块所有输出均在界面上,包括主界面的输出,显示网卡的输出和嗅探结果的输出,这里分别进行展示

学新通

学新通

学新通

3.2.6 算法

【说明】包括计算公式与说明、某些设定的或必然的逻辑关系。对于函数,要着重说明。

这里详细说明实现这个界面的核心算法部分:

首先创建一个新窗口,定义相关部件,比如定义左侧按钮,以及按钮上的字,和相应的点击函数

学新通

定义整个窗口为两个部分,分为左右,两部分分别使用网格布局,在右侧布局上面首先写入几个简单的使用说明,在说明下面需要创建一个可以滚动的多行文本框,设置不可输入,这里用来显示各种定义后的参数信息。

学新通

随后设置整个窗口的相关参数,使得整体窗口的美观得以提升

学新通

为两个点开后有新的单选框的按钮函数创建新类,并且设置相关的点击结果,这个类是定义的选择嗅探环境,默认选择为 Windows 环境,当点击另一个按钮的时候,会把这个参数传进一个全部变量,方便其他函数进行调用

学新通

是否需要 MD5 加密的按钮与上一个按钮类同理:

学新通

最后在窗口类中完善每一个点击函数,包括各种参数设置的函数,点击后都将对参数进行保存,在嗅探时统一调用使用

学新通

学新通

最后实现一个开始函数,创建整个程序的起始地点:

学新通

对于点击开始嗅探的函数:

首先接收对于前面 main.py 中的各种参数,随后根据参数对调用的 c 文件的命令行进行构造

学新通

在开始前首先需要初始化队列和线程以及相应的重定向输出的函数

学新通

重写部分类,使得输出能够成功打印在指定框中

学新通

简单设计一个窗口,支持上下滑动,并且能够接收相应的数据

学新通

对于开启显示网卡的文件:

同样首先定义相应的队列和重定向函数

学新通

接收传过来的参数,这里由于 Linux 和 windows 在处理逻辑上不同,因此需要在使用这个函数之前首先确定嗅探环境,否则可能导致程序崩溃,重写类和重定向函数

学新通

3.2.7 处理流程

【说明】可采用框图 文字叙述或 PAD 图 文字叙述。只要表达得清晰准确即可。

这里说明一下整个系统的运转流程:首先启动 main.py 即开始整个系统的工作,此时仅仅 main.py 进行工作,在这里进行相应参数设置,当选择显示网卡时,showDevice.py 被调用打开,显示一个新窗口,在新窗口中调用一个 C 语言文件显示网卡信息,关闭这个窗口就关闭这两个文件,返回主函数窗口,点击开始嗅探即调用 beginSniff.py 文件,对刚才传进来的参数进行处理并且开始嗅探功能,嗅探功能连接到一个 C 语言文件进行处理,返回的结果在这个新窗口中显示。关闭这个窗口后返回主界面继续等待,主界面可以一直进行参数修改多次进行嗅探。

3.2.8 应说明的问题与限制

【说明】说明使用视图和触发器的情况,出错信息(获取手段、分类编码)及处理方法,隐含的假设,容易出现二义性的概念,应该如何,不容许如何……

说明:这里对主界面的几个关键部分进行说明:首先在打开嗅探或者显示网卡的工作时,主界面将被挂起等待,这时不能提供任何功能或者选择任何参数,如果需要对参数进行修改,那么需要将打开的窗口关闭后才能继续设置。

另外,由于上文所说,主界面在执行其他功能时会被挂起,因此在关闭新窗口后需要适当等待几秒钟,待挂起结束后方可对主界面进行操作,如果出现未响应请勿关闭窗口,会导致程序崩溃,等待几秒钟后就可恢复正常运行。

3.2.9 屏幕布局设计与说明

整体布局类型为将整个界面分为左右两个部分,每个部分分别使用网格布局单独设置

学新通

整体效果如上,左侧首先设置三个按钮,分别对应最小化最大化关闭,下面是顺序排列的几个按钮,右侧首先是标题和简要使用说明,下面是一个框体,用来显示设置参数的结果。

♻️ 资源

学新通

大小: 6.01MB
➡️ 资源下载:https://download.csdn.net/download/s1t16/87450288
注:如当前文章或代码侵犯了您的权益,请私信作者删除!

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfiackb
系列文章
更多 icon
同类精品
更多 icon
继续加载