分析pcap包(基于UDP)
//c代码
#include <stdlib.h>
#include <stdio.h>
#include <pcap.h>
#include <string.h>
#include <netinet/in.h>
#include <time.h>
#include <syslog.h> /* *.pcap file format = file header(24B) + pkt header(16B) + Frame
* Frame = Ethernet header(14B) + IP header(20B) + UDP header(8B) + appdata */ //enhernet header (14B)
typedef struct _eth_hdr
{
unsigned char dstmac[6]; //目标mac地址
unsigned char srcmac[6]; //源mac地址
unsigned short eth_type; //以太网类型
}eth_hdr; //IP header 20B
typedef struct _ip_hdr
{
unsigned char ver_hlen; //版本
unsigned char tos; //服务类型
unsigned short tot_len; //总长度
unsigned short id; //标志
unsigned short frag_off; //分片偏移
unsigned char ttl; //生存时间
unsigned char protocol; //协议
unsigned short chk_sum; //检验和
struct in_addr srcaddr; //源IP地址
struct in_addr dstaddr; //目的IP地址
}ip_hdr; //udp header 8B
typedef struct _udp_hdr
{
unsigned short src_port; //远端口号
unsigned short dst_port; //目的端口号
unsigned short uhl; //udp头部长度
unsigned short chk_sum; //16位udp检验和
}udp_hdr; #define FILE_HEADER 24
#define FRAME_HEADER_LEN (sizeof(eth_hdr) + sizeof(ip_hdr) + sizeof(udp_hdr))
#define LOGLEN 2048
#define NEED_HEADER_INFO 1 int main(int argc, char **argv)
{
FILE *fp;
int fileOffset;
int pktHeaderLen;
char data[LOGLEN] = {0};
// struct pcap_file_header *fHeader;
struct pcap_pkthdr *pktHeader; if (argc < 2) {
printf("usage: ./exe *.pcap\n");
exit(1);
}
#ifdef NEED_HEADER_INFO
printf("nead header info\n");
eth_hdr *EthHeader;
ip_hdr *IPHeader;
udp_hdr *UDPHeader; EthHeader = (eth_hdr*)malloc(sizeof(*EthHeader));
IPHeader = (ip_hdr*)malloc(sizeof(*IPHeader));
UDPHeader = (udp_hdr*)malloc(sizeof(*UDPHeader)); memset(EthHeader, 0, sizeof(*EthHeader));
memset(IPHeader, 0, sizeof(*IPHeader));
memset(UDPHeader, 0, sizeof(*UDPHeader));
#endif
pktHeader = (struct pcap_pkthdr*)malloc(sizeof(*pktHeader));
memset(pktHeader, 0, sizeof(*pktHeader)); fp = fopen(argv[1], "r");
if (fp == NULL) {
perror("open file error");
exit(-1);
} openlog("test", LOG_PID, 0);
fileOffset = FILE_HEADER; //ingore file header
while (fseek(fp, fileOffset, SEEK_SET) == 0) {
// can get time from pktheader
if (fread(pktHeader, 1, sizeof(*pktHeader), fp) == 0) {
printf("file end\n");
return 0;
}
fileOffset += 16 + pktHeader->len;
pktHeaderLen = pktHeader->len - FRAME_HEADER_LEN; printf("%d\n", pktHeaderLen); #ifdef NEED_HEADER_INFO
//get eth header...
if (fread(EthHeader, 1, sizeof(*EthHeader), fp) == 0) {
printf("file end\n");
return 0;
} //get ip header...
if (fread(IPHeader, 1, sizeof(*IPHeader), fp) == 0) {
printf("file end\n");
return 0;
} //get udp herader
if (fread(UDPHeader, 1, sizeof(*UDPHeader), fp) == 0) {
printf("file end\n");
return 0;
}
#else
fseek(fp, FRAME_HEADER_LEN, SEEK_CUR); //ingore ether header
#endif
if (fread(data, 1, pktHeaderLen, fp) == 0) {
printf("file end\n");
return 0;
}
data[pktHeaderLen] = '\0'; printf("%s\n", data);
sleep(1);
syslog(LOG_SYSLOG | LOG_INFO, "%s", data);
memset(data, 0, LOGLEN);
} free(pktHeader);
#ifdef NEED_HEADER_INFO
free(EthHeader);
free(IPHeader);
free(UDPHeader);
#endif
closelog();
fclose(fp);
return 0;
}
测试已通过
分析pcap包(基于UDP)的更多相关文章
- UNIX网络编程——分析一帧基于UDP的TFTP协议帧
下图是UDP的段格式: 相比TCP段格式,UDP要简单得多,也没啥好说的,需要注意的是UDP数据长度指payload加上首部的长度. 下面分析一帧基于UDP的TFTP协议帧: 以太网首部 0000: ...
- 分析一帧基于UDP的TFTP协议帧
下图是UDP的段格式: 相比TCP段格式,UDP要简单得多,也没啥好说的,需要注意的是UDP数据长度指payload加上首部的长度. 下面分析一帧基于UDP的TFTP协议帧: 以太网首部 0000: ...
- Python解析Pcap包类源码学习
0x1.前言 在现场取证遇到分析流量包的情况会比较少,虽然流量类设备原理是把数据都抓出来进行解析,很大一定程度上已经把人可以做的事情交给了机器自动完成. 可用于PCAP包分析的软件比如科来,W ...
- 网络编程基础:粘包现象、基于UDP协议的套接字
粘包现象: 如上篇博客中最后的示例,客户端有个 phone.recv(2014) , 当服务端发送给客户端的数据大于1024个字节时, 多于1024的数据就会残留在管道中,下次客户端再给服务端发命令时 ...
- (网络编程)基于tcp(粘包问题) udp协议的套接字通信
import socket 1.通信套接字(1人1句)服务端和1个客户端 2.通信循环(1人多句)服务端和1个客户端 3.通信循环(多人(串行)多句)多个客户端(服务端服务死:1个客户端---&g ...
- 基于UDP的套接字、粘包问题
一.基于UDP的套接字 UDP服务端 ss = socket() #创建一个服务器的套接字 ss.bind() #绑定服务器套接字 inf_loop: #服务器无限循环 cs = ss.recvfro ...
- 基于udp协议的套接字及udp协议粘包问题
udp协议的套接字 udp协议传输 服务端和客户端没有建立连接一说. import socket # 总结一下基础工作流程:服务端生成套接字并绑定ip_port,进入数据传输循环,服务端接受客户端发 ...
- day31——recv工作原理、高大上版解决粘包方式、基于UDP协议的socket通信
day31 recv工作原理 源码解释: Receive up to buffersize bytes from the socket. 接收来自socket缓冲区的字节数据, For the opt ...
- python笔记8 socket(TCP) subprocess模块 粘包现象 struct模块 基于UDP的套接字协议
socket 基于tcp协议socket 服务端 import socket phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 买 ...
随机推荐
- CodeForce-792B Counting-out Rhyme(模拟)
Counting-out Rhyme CodeForces - 792B 题意: n 个孩子在玩一个游戏. 孩子们站成一圈,按照顺时针顺序分别被标号为 1 到 n.开始游戏时,第一个孩子成为领导. 游 ...
- uni-app开发基本知识点
uni-app: 开始:必须要有一个根view结点. 外部文件引用方式的变化: js要require进来,变成了对象. <script> var util = require('../.. ...
- Jmeter系列(2)- 代理服务器录制脚本
操作步骤 step-1 添加代理服务器 step-2 添加线程组 step-3 添加录制控制器 HTTP代理服务器配置 - HTTP(S) Test Script Recorder TestPlan ...
- Linux系列(38) - 源码包安装(2)
安装前准备 安装C语言编译器"gcc" yum -y install gcc --c 源码包语言编译器 下载源码包 安装注意事项 源代码保存位置:/usr/local/src/ 软 ...
- django 内置用户-装饰器
""" 一.如何给python内置用户添加额外的字段,注意一定义在没有迁移数据之前定义,否则会报错 1.在models中先调用 from django.contrib.a ...
- AT2164-[AGC006C]Rabbit Exercise【差分,倍增,数学期望】
正题 题目链接:https://www.luogu.com.cn/problem/AT2164 题目大意 \(n\)只兔子编号为\(1\sim n\),第\(i\)只在坐标轴\(x_i\)处.然后\( ...
- 获取classpath(src/main/resources)的绝对路径
先贴上代码 private static String basePath = Thread.currentThread().getContextClassLoader().getResource(&q ...
- 数值计算:Legendre多项式
Legendre多项式的概念以及正交特性在此不多作描述,可以参考数学物理方程相关教材,本文主要讨论在数值计算中对于Legendre多项式以及其导数的计算方法. Legendre多项式的计算 递推公式 ...
- 题解 「SDOI2017」硬币游戏
题目传送门 Description 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利. 大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬币实在是太单调了. 同学们觉得要加强 ...
- 洛谷3119 草鉴定(tarjan)
题目大意 约翰有\(n\)块草场,编号\(1\)到\(n\),这些草场由若干条单行道相连.奶牛贝西是美味牧草的鉴赏家,她想到达尽可能多的草场去品尝牧草. 贝西总是从\(1\)号草场出发,最后回到\(1 ...