【C语言】Linux平台下解析pcap文件

开发环境是readhat、ubuntu、kali

在wireshark上抓包需要使用 Wireshark/tcpdump/ 且 文件后缀名为.pcap 方式保存

效果如下:

引入俩文件如下。

my_pcap.h
#pragma once
#include <netinet/in.h>#define PCAP_MAGIC 0xa1b2c3d4typedef struct pcap_file_header
{uint32_t magic;       /* 0xa1b2c3d4 */uint16_t version_major;   /* magjor Version 2 */uint16_t version_minor;   /* magjor Version 4 */uint32_t thiszone;      /* gmt to local correction */uint32_t sigfigs;     /* accuracy of timestamps */uint32_t snaplen;     /* max length saved portion of each pkt */uint32_t linktype;    /* data link type (LINKTYPE_*) */
}* PPCAP_HEADER;
#define PCAP_FILE_HEADER_LEN sizeof(struct pcap_file_header)typedef struct pcap_pkthdr
{uint32_t ts_sec;uint32_t ts_usec;uint32_t caplen; /* length of portion present */uint32_t len;    /* length this packet (off wire) */
}* PPCAP_PK_HEADER;
#define PCAP_PK_LEN sizeof(struct pcap_pkthdr)typedef struct pcap_each
{int pcap_len;int pos;char* pcap_data;
}* PPCAP_EACH;PPCAP_EACH create_pcap_each(char* data, int data_len);
int check_pcap(char* data,int data_len);
PPCAP_PK_HEADER get_first_pkg(PPCAP_EACH pcap_each);
PPCAP_PK_HEADER next_pkg(PPCAP_EACH pcap_each);
char* get_pkg_data(PPCAP_PK_HEADER pcap_pk_hdr, int* out_len);

my_pcap.c
#include "my_pcap.h"
#include <stdlib.h>int check_pcap(char* data,int data_len){PPCAP_HEADER pcap_hdr = (PPCAP_HEADER)data; if(pcap_hdr->magic == PCAP_MAGIC){return 1;}return 0;
}PPCAP_EACH create_pcap_each(char* data, int data_len){PPCAP_EACH pe = malloc(sizeof(struct pcap_each));pe->pos = 0;pe->pcap_data = data;pe->pcap_len = data_len;return pe;
}PPCAP_PK_HEADER get_first_pkg(PPCAP_EACH pcap_each){pcap_each->pos = PCAP_FILE_HEADER_LEN;return (PPCAP_PK_HEADER)(pcap_each->pcap_data + pcap_each->pos);
}PPCAP_PK_HEADER next_pkg(PPCAP_EACH pcap_each){PPCAP_PK_HEADER now_pkg = (PPCAP_PK_HEADER)(pcap_each->pcap_data + pcap_each->pos);pcap_each->pos += PCAP_PK_LEN + now_pkg->caplen;if(pcap_each->pos >= pcap_each->pcap_len){return 0;}PPCAP_PK_HEADER next_pkg = (PPCAP_PK_HEADER)(pcap_each->pcap_data + pcap_each->pos);return next_pkg;
}char* get_pkg_data(PPCAP_PK_HEADER pcap_pk_hdr, int* out_len){*out_len = pcap_pk_hdr->caplen;return ((char*)pcap_pk_hdr + PCAP_PK_LEN);
}

然后进行测试,测试代码如下:

int buffer_len = 0;
char* buffer = read_file("/home/kali/Desktop/pcap/your_pack.pcap", &buffer_len);
if(check_pcap(buffer, buffer_len) == 0){printf("file not is pcap file \n");return;
}
PPCAP_EACH peach = create_pcap_each(buffer, buffer_len);
PPCAP_PK_HEADER pkg = get_first_pkg(peach);
int data_len = 0;
char* data = 0;
for(;pkg != 0; pkg = next_pkg(peach)){data = get_pkg_data(pkg, &data_len);printf("data_len:%d \n", data_len);hexDump(data, data_len);
}
free(peach);
free(buffer);

其中的read_file方法和hexDump方法是需要自己写的。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>char* read_file(char* path,int* out_len){int fd = open(path, O_RDONLY);struct stat st;stat(path, &st);*out_len = st.st_size;char* buffer = (char*)malloc(st.st_size);read(fd, buffer, st.st_size);close(fd);return buffer;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>void hexDump(void* _buf, int len)
{if(len > 99999){printf("show len:%d >300 Byte. do not show. \n",len);return;}char* buf = (char*)_buf;if (len < 1 || buf == (void*)0) return;const char *hexChars = "0123456789ABCDEF";int i = 0;char c = 0x00;char str_print_able[17];char str_hex_buffer[16 * 3 + 1];for (i = 0; i < (len / 16) * 16; i += 16){int j = 0;for (j = 0; j < 16; j++){c = buf[i + j];// hexint z = j * 3;str_hex_buffer[z++] = hexChars[(c >> 4) & 0x0F];str_hex_buffer[z++] = hexChars[c & 0x0F];str_hex_buffer[z++] = (j < 10 && !((j + 1) % 8)) ? '_' : ' ';// string with space repalcedif (c < 32 || c == '\0' || c == '\t' || c == '\r' || c == '\n' || c == '\b')str_print_able[j] = '.';elsestr_print_able[j] = c;}str_hex_buffer[16 * 3] = 0x00;str_print_able[j] = 0x00;printf("%04x  %s %s\n", i, str_hex_buffer, str_print_able);}int leftSize = len % 16;if (leftSize < 1) return;int j = 0;int pos = i;for (; i < len; i++){c = buf[i];// hexint z = j * 3;str_hex_buffer[z++] = hexChars[(c >> 4) & 0x0F];str_hex_buffer[z++] = hexChars[c & 0x0F];str_hex_buffer[z++] = ' ';// string with space repalcedif (c < 32 || c == '\0' || c == '\t' || c == '\r' || c == '\n' || c == '\b')str_print_able[j] = '.';elsestr_print_able[j] = c;j++;}str_hex_buffer[leftSize * 3] = 0x00;str_print_able[j] = 0x00;for (j = leftSize; j < 16; j++){int z = j * 3;str_hex_buffer[z++] = ' ';str_hex_buffer[z++] = ' ';str_hex_buffer[z++] = ' ';}str_hex_buffer[16 * 3] = 0x00;printf("%04x  %s %s\n", pos, str_hex_buffer, str_print_able);
}

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

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

相关文章

公众号突破注册操作流程

一般可以注册多少个公众号&#xff1f;众所周知&#xff0c;在2013年前后&#xff0c;公众号申请是不限制数量的&#xff0c;后来企业开始限制申请50个&#xff0c;直到2018年的11月tx又发布&#xff0c;其中个人主体可申请公众号由2个调整为1个&#xff0c;企业主体由50个调整…

全场景流量验证系统 | 京东物流技术团队

本文介绍了一种基于线上流量实现对重构系统进行功能和性能验证的实践方案。针对线上流量如何拦截、如何录制、如何存储、如何回放以及如何发压均作了详细说明&#xff0c;为具有类似需求的读者提供了一种可供参考的思路。 1 业务背景 随着百川项目的启动&#xff0c;中台需要…

机器人中的数值优化(二十一)—— 伴随灵敏度分析、线性方程组求解器的分类和特点、优化软件

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考&#xff0c;主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等&#xff0c;本系列文章篇数较多&#xff0c;不定期更新&#xff0c;上半部分介绍无约束优化&#xff0c;…

漏刻有时数据可视化Echarts组件开发(43)水球图svg温度计动画

SVG是一种用XML定义的语言&#xff0c;用来描述二维矢量及矢量/栅格图形。具体来说&#xff0c;SVG图形是可伸缩的矢量图形&#xff0c;其图像质量不会因放大或改变尺寸而损失。 在SVG中&#xff0c;可以创建和修改图像、对图像进行搜索和索引、对其进行脚本化或压缩。此外&am…

vue3使用element plus的时候组件显示的是英文

问题截图 这是因为国际化导致的 解决代码 import zhCn from "element-plus/es/locale/lang/zh-cn"; 或者 import zhCn from "element-plus/lib/locale/lang/zh-cn";const localezhCn<el-config-provider :locale"locale"><el-date-pic…

Koa学习4:密码加密、验证登录、颁发token、用户认证

请求体 这里遇到了个问题&#xff0c;ctx.request.body 的值是一个字符串。明明已经使用了koa-body中间件 查了一下原因是&#xff1a; ctx.request.body的值可能是一个对象或一个字符串&#xff0c;取决于请求的Content-Type和请求体的格式。 当使用koa-body中间件时&#x…

微信小程序 movable-area 区域拖动动态组件演示

movable-area 组件在小程序中的作用是用于创建一个可移动的区域&#xff0c;可以在该区域内拖动视图或内容。这个组件常用于实现可拖动的容器或可滑动的列表等交互效果。 使用 movable-area 组件可以对其内部的 movable-view 组件进行拖动操作&#xff0c;可以通过设置不同的属…

mp4视频太大怎么压缩变小?

mp4视频太大怎么压缩变小&#xff1f;确实&#xff0c;很多培训和教学都转向了线上模式&#xff0c;这使得我们需要下载或分享大量的在线教学视频。然而&#xff0c;由于MP4视频文件通常较大&#xff0c;可能会遇到无法打开或发送的问题。为了解决这个问题&#xff0c;我们可以…

selenium-webdriver-Chrome新驱动地址(Chrome115及以上版本)

Chrome115、Chrome116、Chrome117&#xff0c;在旧的链接并没有 新地址&#xff1a;https://googlechromelabs.github.io/chrome-for-testing/ 参考学习链接&#xff08;我也是根据这个老师的链接学到的&#xff09;&#xff1a;https://www.cnblogs.com/wuxianfeng023/p/1765…

阿里云 linux tomcat 无法访问方法

1、阿里云放行tomcat端口 例如7077端口号 2、linux 命令行防火墙 设置端口打开 以下命令查看是否开启指定端口 firewall-cmd --list-ports以下命令添加指定端口让防火墙放行 firewall-cmd --zonepublic --add-port3306/tcp --permanent以下命令重新启动防火墙 systemctl re…

《Python 自动化办公应用大全》书籍推荐(包邮送书五本)

前言 随着科技的快速发展和智能化办公的需求增加&#xff0c;Python自动化办公成为了一种趋势。Python作为一种高级编程语言&#xff0c;具有简单易学、功能强大和开放源代码等优势&#xff0c;可以帮助我们更高效地完成日常办公任务。 Python自动化办公还可以帮助我们实现更…

HarmonyOS/OpenHarmony原生应用开发-华为Serverless云端服务支持说明(一)

云端服务的实现是HarmonyOS/OpenHarmony原生应用开发的一个重要的环节&#xff0c;如果用户端是鸿蒙原生应用&#xff0c;但是服务端即云端还是基于传统的各种WEB网络框架、数据库与云服务器&#xff0c;那么所谓的原生应用开发实现的数据即后端服务是和以前、现在的互联网、移…

腾讯云/阿里云国际站免费账号:腾讯云国际站如何对象存储cos设置防盗链

简介 为了避免恶意程序使用资源 URL 盗刷公网流量或使用恶意手法盗用资源&#xff0c;腾讯云国际站给用户带来不必要的损失。腾讯云对象存储支持防盗链配置&#xff0c;建议您通过控制台的防盗链设置配置黑/白名单&#xff0c;来进行安全防护。 注意&#xff1a; 如果您访问对…

mysql 物理备份及恢复

一、物理复制的基本概念 物理备份:直接复制数据库文件&#xff0c;适用于大型的数据库环境&#xff0c;不受存储引擎的限制&#xff0c;但不能恢复到不同的mysql版本 完整备份&#xff1a;也叫完全备份&#xff0c;每次将所有数据&#xff08;不管自第一次备份有没有修改过&…

c++ 基础知识(一)

文章目录 1. C关键字 2. 命名空间 3. C输入&输出 4. 缺省参数 文章内容 1. C关键字(C98) C总计63个关键字&#xff0c;C语言32个关键字 ps&#xff1a;下面我们只是看一下C有多少关键字&#xff0c;不对关键字进行具体的讲解。后面我学了以后再细讲。 2. 命名空间 …

Holographic MIMO Surfaces (HMIMOS)以及Reconfigurable Holographic Surface(RHS)仿真

这里写目录标题 Simulation setupchatgpt帮我总结代码总结&#xff1a;chatgpt生成的代码还是不靠谱&#xff1a;考虑把之前看的RHS中对于多用户的改成单用户全系MIMO与普通MIMO或者说RIS的区别到底是啥&#xff1f; Holographic MIMO Surfaces &#xff08;HMIMOS&#xff09;…

微信小程序--》从模块小程序项目案例23.10.09

配置导航栏 导航栏是小程序的门户&#xff0c;用户进来第一眼看到的便是导航栏&#xff0c;其起着对当前小程序主题的概括。而我们 新建的小程序 时&#xff0c;第一步变开始配置导航栏。如下&#xff1a; 配置tabBar 因为配置tabBar需要借助字体图标&#xff0c;我这里平常喜…

【数据结构】计数排序 排序系列所有源代码 复杂度分析(终章)

目录 一&#xff0c;计数排序 1&#xff0c;基本思想 2&#xff0c;思路实现 3&#xff0c;计数排序的特性总结&#xff1a; 二&#xff0c;排序算法复杂度及稳定性分析 三&#xff0c;排序系列所有源代码 Sort.h Sort.c Stack.h Stack.c 一&#xff0c;计数排序 计数…

厌烦了iPhone默认的热点名称?如何更改iPhone上的热点名称

你对你默认的热点名称感到厌倦了吗&#xff1f;这篇文章是为你准备的。在这里&#xff0c;你可以了解如何轻松更改iPhone上的热点名称。 个人热点会将你的手机数据转换为Wi-Fi信号。手机上的个人热点使用户能够与其他用户共享其蜂窝数据连接。当你在WIFI网络之外时&#xff0c…

使用华为eNSP组网试验⑹-组建基于BGP的网络

BGP(Border Gateway Protocol -- 边界网关协议)是一种在自治系统之间动态交换路由信息、具有丰富的路由控制机制、稳定而安全的路由协议&#xff0c;一般部署在骨干(主要、核心)路由器。 BGP适用于大中型网络的组建&#xff0c;在很多企业当中都有应用。 一般情况下&#xff0c…