【毕业设计日记-4月】pcap编程之分析数据包

昨天看到了最重要的一部分,分析数据包。

这个分析UDP的程序基本上前面都能看得懂,主要还是对报文的分析这一部分。

在blog里找到的图,对于这个过程,反过来也就是:应用层数据,封装成UDP或者TCP报文,再加上IP首部,然后再加上以太网首部,就成为了可以在链路层传播的数据帧。

以太网驱动程序首先根据以太网首部中的“上层协议”字段确定该数据帧的有效载荷(payload,指除去协议首部之外实际传输的数据)是IP、ARP 还是RARP 协议的数据报,然后交给相应的协议处理。假如是IP 数据报,IP 协议再根据IP 首部中的“上层协议”字段确定该数据报的有效载荷是TCP、UDP、ICMP 还是IGMP,然后交给相应的协议处理。假如是TCP 段或UDP段,TCP 或UDP 协议再根据TCP 首部或UDP 首部的“端口号”字段确定应该将应用层数据交给哪个用户进程。IP 地址是标识网络中不同主机的地址,而端口号就是同一台主机上标识不同进程的地址,IP 地址和端口号合起来标识网络中唯一的进程。

虽然IP、ARP 和RARP 数据报都需要以太网驱动程序来封装成帧,但是从功能上划分,ARP 和RARP 属于链路层,IP 属于网络层。虽然ICMP、IGMP、TCP、UDP 的数据都需要IP 协议来封装成数据报,但是从功能上划分,ICMP、IGMP 与IP 同属于网络层,TCP 和UDP属于传输层。

所以这个程序里先捕获链路层的数据帧:

再看一下以太网帧的结构

以太网头部是14字节,14字节之后的部分为IP数据报,让这个ip首部指针 ih 指向ip数据报首部

再看一下ip首部结构

根据ip_header结构定义,ver_ihl是4位版本号+4位首部长度,现在要获取ip报文的首部长度  ip_len,然后用 ih 加上这个长度就得到了UDP报文的首部。那么只需要简单的用这个字节和0xf相与,就得到了低4位(注意是低4位,不是高4位)的首部长度。

这个就涉及到大小端的问题了,intel机器一般是小端存储,所以需要进行字节序列转换

在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题。这是就可能用到htons(), ntohl(), ntohs(),htons()这4个函数。
网络字节顺序与本地字节顺序之间的转换函数:
htonl()--"Host to Network Long"
ntohl()--"Network to Host Long"
htons()--"Host to Network Short"
ntohs()--"Network to Host Short"
之所以需要这些函数是因为计算机数据表示存在两种字节顺序:NBO与HBO
网络字节顺序NBO(Network Byte Order): 按从高到低的顺序存储,在网络上使用统一的网络字节顺序,可以避免兼容性问题。
主机字节顺序(HBO,Host Byte Order): 不同的机器HBO不相同,与CPU设计有关,数据的顺序是由cpu决定的,而与操作系统无关。
如 Intel x86结构下, short型数0x1234表示为34 12, int型数0x12345678表示为78 56 34 12 
如 IBM power PC结构下, short型数0x1234表示为12 34, int型数0x12345678表示为12 34 56 78
由于这个原因不同体系结构的机器之间无法通信,所以要转换成一种约定的数序,也就是网络字节顺序,其实就是如同power pc那样的顺序. 在PC开发中有ntohl和htonl函数可以用来进行网络字节和主机字节的转换.

对sport = ntohs( uh->sport); 这一句单步调试一下,

可见经过ntohs()函数处理之后,值44366变成了20141

转换成16进制,可见确实是把高低字节转换了一下,也就是说网络字节顺序中,从高到低存储,AD是高字节,4E是低字节,而在intel机器中,用小端存储,所以应该表示为4EAD(从低到高存储)。

最后是打印IP地址和UDP端口。

这个程序其实还是很简单,现在我需要在这个程序的基础上修改,以适用于毕设的需求。

时间: 2024-10-06 08:46:31

【毕业设计日记-4月】pcap编程之分析数据包的相关文章

tcpdump教程 - 从命令行抓取和分析数据包

前言 在介绍和使用tcpdump之前,请确保您已经掌握或者了解如下几个关键概念,否则后面的内容让你有点痛苦. 能够在Linux命令行下工作 理解OSI七层网络协议的概念 熟悉各层的协议头部,重点是IP/TCP/UDP 交换机和路由器对应于OSI的协议层 另外还需要注意的是: tcpdump是基于Unix系统的命令行式的数据包嗅探工具.如果要使用tcpdump抓取其他主机MAC地址的数据包,必须开启网卡混杂模式,所谓混杂模式,用最简单的语言就是让网卡抓取任何经过它的数据包,不管这个数据包是不是发给

Wireshark抓包分析---分析数据包

Wireshark数据抓包教程之认识捕获分析数据包 认识Wireshark捕获数据包 当我们对Wireshark主窗口各部分作用了解了,学会捕获数据了,接下来就该去认识这些捕获的数据包了.Wireshark将从网络中捕获到的二进制数据按照不同的协议包结构规范,显示在Packet Details面板中.为了帮助用户能够清楚的分析数据,本节将介绍识别数据包的方法. 在Wireshark中关于数据包的叫法有三个术语,分别是帧.包.段.下面通过分析一个数据包,来介绍这三个术语.在Wireshark中捕获

使用winpcap多线程抓包,以及简单的分析数据包

刚开始使用winpcap数据包的时候,我在抓包的时候使用了 pcap_loop(adhandle, 0, packet_handler, NULL); 这个回调函数进行抓包.同时在回调函数中分析IP地址后加入了新的线程进行分析数据包. pthread_create(&thread[threadnum], NULL,thread, &thread_ins); 我的新线程函数大致是这样的: void* thread(void *) { /*省略...*/ while((res = pcap_n

Linux程序设计学习笔记----网络编程之网络数据包拆封包与字节顺序大小端

网络数据包的封包与拆包 过程如下: 将数据从一台计算机通过一定的路径发送到另一台计算机.应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation),如下图所示: 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据包(packet),在链路层叫做帧(frame).数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理. 上图对应两台计算机在同一网段中的情况,

Wireshark数据抓包教程之认识捕获分析数据包

Wireshark数据抓包教程之认识捕获分析数据包 认识Wireshark捕获数据包 当我们对Wireshark主窗口各部分作用了解了,学会捕获数据了,接下来就该去认识这些捕获的数据包了.Wireshark将从网络中捕获到的二进制数据按照不同的协议包结构规范,显示在Packet Details面板中.为了帮助用户能够清楚的分析数据,本节将介绍识别数据包的方法. 在Wireshark中关于数据包的叫法有三个术语,分别是帧.包.段.下面通过分析一个数据包,来介绍这三个术语.在Wireshark中捕获

【毕业设计日记-4月】已经破解密文

今天进度比较快. 上午对着书用wireshark找上次抓过的包,分析信息,我之前一直以为传递的数据信息会在 这个请求报文里,没想到其实在响应报文里. 看到这些熟悉的标识符就知道找对了,因为源程序中最后发送出去的内容也是msgContent,这两个密文也符合之前的明文"hi" "hey man"(字符串长度差,第一个字符一样). 今天主要最困惑的是之前这个函数 不知道他的用处到底是什么,之前还猜想是对汉字这种特殊编码进行转换.今天请教了实验室一个学长,他说这个就是把字

【毕业设计日记-4月】WINCAP程序框架

今天又看了一下WINCAP技术文档的第七篇——处理脱机堆文件.把其中两个程序综合了一下,再使用前面讲到的filter,自己捣鼓出来了一个程序的基本框架. 目前我这个做得还很基本,可以抓到相应的数据包,但仍存在两个问题: 1.只能人工设定先捕获多少个数据包到堆文件,再从中一个个读取 2.我抓的包(如下右)只有HTTP包的内容,没有json的内容,我不懂json和HTTP数据包到底是什么关系,json的内容并没有接在HTTP报文后面 问题2比较关键,亟待解决.问题1的话算是一个提升,现在设想是开两个

【毕业设计日记-4月】mark小尝成果

千辛万苦,终于可以把消息提出来了!!! 对之后的工作提几点: 1.加上图形界面(虽然没什么好用图形界面的但是还是好看一点) 2.过滤器还需要优化,例如发送比较长的消息的时候不能简单设置 less 1500 3.偶尔出现程序崩溃情况,还不知道原因 4.中文还不能在控制台显示,只能显示英文和其他字符 粗糙代码如下: 1 #ifdef _MSC_VER 2 /* 3 * we do not want the warnings about the old deprecated and unsecure

C语言分析数据包程序

#include <pcap.h> #include <stdlib.h> #include <malloc.h> #include <stdio.h> #include <string.h> #include <signal.h> #include <time.h> #include <sys/socket.h> #include <unistd.h> #include <sys/types