分析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) # 买 ...
随机推荐
- 在PHP中操作文件的扩展属性
在操作系统的文件中,还存在着一种我们可以自己定义的文件属性.这些属性不是保存在文件内容中,也不是直接可以通过 ls -al 所能看到的内容.它们可以将一个键值对信息永久得关联到文件上,一般现在的 Li ...
- Mysql将其他表中的数据更新到指定表中
update tb set tb.字段= (select 字段 from tb1 where tb.字段1 = tb1.字段1); update role set uid = (select ID ...
- Spring Cloud Gateway 没有链路信息,我 TM 人傻了(中)
本系列是 我TM人傻了 系列第五期[捂脸],往期精彩回顾: 升级到Spring 5.3.x之后,GC次数急剧增加,我TM人傻了 这个大表走索引字段查询的 SQL 怎么就成全扫描了,我TM人傻了 获取异 ...
- Jenkins持续集成体系 | 最完整的介绍及资料
这篇文章是来给大家普及Jenkins知识的, Jenkins能解决什么问题, 有哪些应用场景, 为何要掌握Jenkins, 掌握Jenkins后有哪些好处, 弄懂Jenkins需要掌握哪些知识 不知道 ...
- Windows环境下实现WireShark抓取HTTPS
https 加密传输,Wireshark 没有设置的情况下是没有办法抓到包的 https 的数据包. 设置系统环境变量(SSLKEYLOGFILE) WireShark 设置 SSL 选项 参考文章: ...
- 版本管理 - Git 使用入门
Git 是一个分布式的版本管理系统,而 SVN 是一个集中式管理系统. 版本控制 Git与SVN的对比 对比 SVN Git 工作方式 集中式 分布式 文件管理 增量式 系统快照 权限控制 对团队中参 ...
- kubeadm 如何将节点加入集群
kubeadm join 使用 token 过期之后(24小时过期),如何加入集群 一.重启生成新token # 创建新token kubeadm token create # 查看是否存在有效的 t ...
- 51nod1355-斐波那契的最小公倍数【min-max容斥】
正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1355 题目大意 定义\(f_i\)表示斐波那契的第\(i\)项,给出一个 ...
- div 可编辑--获取光标位置插入元素
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Language" ...
- 树莓派使用python+继电器控制220V灯泡
需要的材料 1.继电器:继电器是一种电控制器件,它实际上是用小电流去控制大电流运作的一种"自动开关",我们这里用它来控制电灯.控制了继电器就等于控制了电灯. 我购买的是某宝上3块钱 ...