基于Python实现的网络嗅探器 ♻️ 资源大小6.01MB➡️资源下载https://download.csdn.net/download/s1t16/87450288基于C语言的网络嗅探器一、引言1.1 节 编写目的通过编写网络嗅探器可以提高编程能力加深对网络协议的理解培养团队协作能力完成课程项目文档结构说明文章结构分为编写背景以及功能概述与功能详述1.3.2 电子文档编写工具WPS Office1.3.3 参考资料【说明】格式作者[版本号]资料来源日期[起止页号]。其中《需求规格说明书》与《概要设计说明书》是必选的参考资料。二、功能概述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主文件inputeth以太网协议inputipip 协议inputarparp 协议inputtcptcp 协议input/outputmpicmp 和 igmp 协议inputudpudp 协议outputprotocol_based_tcp基于 tcp 的协议outputprotocol_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 端口其次选择包类型这里选择 TCPMD5 解码可以选择开启或者关闭保存数据为默认打开选项以上为所有需要输入的参数信息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 屏幕布局设计与说明整体布局类型为将整个界面分为左右两个部分每个部分分别使用网格布局单独设置整体效果如上左侧首先设置三个按钮分别对应最小化最大化关闭下面是顺序排列的几个按钮右侧首先是标题和简要使用说明下面是一个框体用来显示设置参数的结果。