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

news2024/10/2 12:20:23

开发环境是readhat、ubuntu、kali

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

效果如下:

引入俩文件如下。

my_pcap.h
#pragma once
#include <netinet/in.h>

#define PCAP_MAGIC 0xa1b2c3d4

typedef 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];
			// hex
			int 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 repalced
			if (c < 32 || c == '\0' || c == '\t' || c == '\r' || c == '\n' || c == '\b')
				str_print_able[j] = '.';
			else
				str_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];
		// hex
		int 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 repalced
		if (c < 32 || c == '\0' || c == '\t' || c == '\r' || c == '\n' || c == '\b')
			str_print_able[j] = '.';
		else
			str_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.coloradmin.cn/o/1072169.html

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

相关文章

TCP 和UDP通信流程

TCP 通信流程 根据上图可以看到&#xff0c;TCP 服务器和客户端通信分为 TCP 服务端和客户端&#xff0c;需要先建立服务 端然后再建立客户端与之连接进行数据交互。 服务端编程步骤&#xff1a; 1.使用 socket 创建流式套接字 2.使用 bind 绑定将服务器绑定到 IP 3.listen…

测试小白必掌握软件测试十大原则

软件测试是确保软件质量的重要手段之一&#xff0c;它可以检测软件中的各种缺陷和问题&#xff0c;从而提高软件的可靠性、可用性和安全性。软件测试也是一项极富创造性、极具挑战性的工作。为了尽可能发现软件中的错误&#xff0c;提高软件产品的质量&#xff0c;在软件测试的…

不用休眠的 Kotlin 并发:深入对比 delay() 和 sleep()

本文翻译自&#xff1a; https://blog.shreyaspatil.dev/sleepless-concurrency-delay-vs-threadsleep 毫无疑问&#xff0c;Kotlin 语言中的协程 Coroutine 极大地帮助了开发者更加容易地处理异步编程。该特性中封装的诸多高效 API&#xff0c;可以确保开发者花费更小的精力去…

2023年中国隆鼻行业发展历程及趋势分析:隆鼻手术市场将实现进一步增长[图]

隆鼻术就是以各种植入材料置入为主要方法&#xff0c;隆起或抬高鼻部形态为主要目的的鼻整形术式。隆鼻术可能是开展最多的整形美容手术之一。隆鼻术也是一种很成熟的美容手术&#xff0c;操作较为简单、安全、风险较小&#xff0c;也易于接受。 隆鼻行业分类 资料来源&#x…

【2023研电赛】安谋科技企业命题特别奖:面向独居老人的智能居家监护系统

本文为2023年第十八届中国研究生电子设计竞赛安谋科技企业命题特别奖分享&#xff0c;参加极术社区的【有奖活动】分享2023研电赛作品扩大影响力&#xff0c;更有丰富电子礼品等你来领&#xff01;&#xff0c;分享2023研电赛作品扩大影响力&#xff0c;更有丰富电子礼品等你来…

滚雪球学Java(43):探究 Java 中的 Class 类:透视类的本质和实现原理

&#x1f3c6;本文收录于「滚雪球学Java」专栏&#xff0c;专业攻坚指数级提升&#xff0c;助你一臂之力&#xff0c;带你早日登顶&#x1f680;&#xff0c;欢迎大家关注&&收藏&#xff01;持续更新中&#xff0c;up&#xff01;up&#xff01;up&#xff01;&#xf…

科普丨语音芯片选型应遵守的原则

在选择语音芯片时&#xff0c;设计者应该首先详细了解设计要求&#xff0c;并从要求中整理出电路功能模块和性能指标要求。根据功能和性能要求&#xff0c;制定总体设计方案。一般来说&#xff0c;选择语音芯片有以下要求&#xff1a; 1、 性价比&#xff1a;选择物美价廉的语…

16.(开发工具篇mysql)mysql不同库同步数据的异常记录

1:mysql导入时出现“ERROR at line : Unknown command ‘\‘‘.“的解决办法 default-character-set=utf82:ERROR 2006 (HY000) at line 71: MySQL server has gone away (1) 连接超时 查看各项连接时间: show global variables like %timeout;这些值是相对是MySQL的默认…

Redis AOF重写原原理

重写aof之前 appendonly.aof.1.base.aof appendonly.aof.1.incr.aof appendonly.aof.manifest 重写aof 一次 appendonly.aof.2.base.aof 大小变化 appendonly.aof.2.incr.aof 大小o appendonly.aof.manifest 大小不变 AOF文件重写并不是对原文件进行重新整理&#xff0c;而是直…

web:[护网杯 2018]easy_tornado

题目 点进页面显示如下 点进去查看 有个render&#xff0c;结合题目名&#xff0c;可能是ssti 同时注意到url&#xff0c;无论点进哪个文件&#xff0c;url的格式都为file?filename/xxx&filehashxxx 所以结合hints.txt中的提示&#xff0c;filehash就是md5加密得到的&…

CasA:用于点云 3D 目标检测的级联注意力网络

论文摘要 LiDAR 收集的数据通常表现出稀疏和不规则的分布。 3D 空间中的 LiDAR 扫描并不均匀。近处和远处的物体之间存在巨大的分布差距。 CasA(Cascade Attention) 由 RPN&#xff08;Region proposal Network&#xff09;和 CRN&#xff08;cascade refinement Network&…

目标追踪算法DeepSORT简介

背景&#xff1a;目标检测 vs 目标跟踪 在开始介绍 DeepSORT 的原理之前呢&#xff0c;我们先来了解下目标检测&#xff0c;和目标跟踪之间的区别&#xff1a; 目标检测&#xff1a;在目标检测任务中&#xff0c;我们需要利用 AI 模型识别出单张画面中&#xff0c;物体的位置…

【稳定性】稳定性建设之弹性设计 | 京东物流技术团队

背景 随着业务的快速变化和技术的不断发展&#xff0c;系统面临着诸多挑战&#xff0c;例如流量峰值、依赖服务故障、硬件故障、网络中断、软件缺陷等&#xff0c;这些因素都可能影响到系统的正常运行。在这种背景下&#xff0c;弹性设计&#xff08;Resilience Design&#x…

开启深度学习之门—《深度学习》

开启深度学习之门—《深度学习》 《深度学习》由Ian Goodfellow和Yoshua Bengio合著,以其前沿的内容和深入浅出的风格,成为了当今最受欢迎的人工智能教材之一。首先,让我们来了解一下这两位作者。Ian Goodfellow是一位备受瞩目的计算机科学家,他在深度学习和生成对抗网络的…

第二证券:华为全液冷超充上线,高压快充概念爆发,双杰电气等涨停

受华为全液冷超充上线消息提振&#xff0c;高压快充概念9日盘中强势拉升&#xff0c;到发稿&#xff0c;双杰电气、永贵电器“20cm”涨停&#xff0c;英可瑞、易事特涨超13%&#xff0c;伊戈尔、协鑫能科、宝馨科技、日丰股份等涨停&#xff0c;万祥科技、星云股份涨近8%。 消…

外汇天眼:三大方法提高容错率——成功投资者的秘密策略!

容错率是什么&#xff1f; 虽然A股市场投资体验不佳&#xff0c;但相较于中概股市场的波动&#xff0c;A股投资者仍有幸福感。以中概股的代表&#xff0c;金龙指数ETF为例&#xff0c;仅一年多时间内从85.90元下跌至20.47元&#xff0c;跌幅高达76%。 然而&#xff0c;有一位…

【PPT】ppt里面使用svg图标

要想编辑好的PPT&#xff0c;少不了小图标的美化&#xff0c;图标可以使PPT变得更有趣&#xff0c;更易懂&#xff0c;更美观。 对于png&#xff0c;主要处理它的颜色&#xff0c;可使用【重新着色】功能。 对于jpg&#xff0c;主要处理它的背景&#xff0c;删除背景后同png处…

vue-6

一、声明式导航-导航链接 1.需求 实现导航高亮效果 如果使用a标签进行跳转的话&#xff0c;需要给当前跳转的导航加样式&#xff0c;同时要移除上一个a标签的样式&#xff0c;太麻烦&#xff01;&#xff01;&#xff01; 2.解决方案 vue-router 提供了一个全局组件 router…

进程同步互斥之吸烟者问题,读者写者问题,哲学家进餐问题

1.吸烟者问题 1.问题描述 假设一个系统有三个抽烟者进程和一个供应者进程。 每个抽烟者不停地卷烟并抽掉它&#xff0c;但是要卷起并抽掉一支烟&#xff0c;抽烟者需要有三种材料:烟草、纸和胶水。 三个抽烟者中&#xff0c;第一个拥有烟草、第二个拥有纸、第三个拥有胶水。 …

【MyBatis】MyBatis 详解

MyBatis 详解 一. MyBatis 是什么二. MyBatis 在整个框架中的定位三. MyBatis 的操作1. 先创建好数据库和表2. 添加MyBatis框架⽀持3. 修改配置文件4. 添加业务代码5. 增、删、改操作① 增加⽤户② 修改用户操作③ 删除操作 6. 查询操作① 单表查询② 多表查询 一. MyBatis 是什…