linux下libpcap抓包分析
一、首先下载libpcap包http://www.tcpdump.org/#latest-release
然后安装,安装完成后进入安装根目录的tests文件夹,编译运行findalldevstest.c(编译时加上-lpcap),查看是否发现所有网络设备。
二、下载wireshark观察抓包软件的各种功能
三、熟悉libpcap工作原理:
四、了解libpcap抓包基本流程:

五、编程实现

未完待续。。。
PS:整理了一下libpcap常用的数据类型定义
- libpcap的类型定义:
0)、typedef int bpf_int32
1)、typedef u_int bpf_u_int32
32bit 的无类型整形;
2)、typedef pcap pcap_t
Descriptor of an open capture instance(一个打开的捕获实例的描述符?)这个结构对用户是不透明的。
3)、typedef pcap_dumper pcap_dumper_t
libpcap保存文件的描述符。
4)、typedef pcap_if pcap_if_t
网卡链表的一个元素;
5)、typedef pcap_addr pcap_addr_t
网卡地址的表示;
6)、typedef void (*pcap_handler)(u_char *args, const struct pcap_pkthdr *header, const u_char *packet);
其中agrs是从pcap_dispatch()函数传递过来的第四个形参 ,一般我们自己的包捕捉程序不需要提供它,总是为NULL ;header指向
pcap_pkthdr结构,该结构位于真正的物理帧前面,用于消除不同链路层支持的差异 ;packet指向所捕获报文的物理帧。
- libpcap结构体
Libpcap库函数所必须的数据结构定义主要包含在pcap.h和pcap-int.h两个头文件中
1)、pcap结构在pcap-int.h头文件中被定义:
编程时需要涉及到的成员有:int fd; 打开设备的描述符;u_char *buffer; 是指向所捕获到数据的缓冲区指针
struct pcap
{
int fd; /* 文件描述字,实际就是 socket */
int selectable_fd; /* 在 socket 上,可以使用 select() 和 poll() 等 I/O 复用类型函数 */
int snapshot; /* 用户期望的捕获数据包最大长度 */
int linktype; /* 设备类型 */
int tzoff; /* 时区位置,实际上没有被使用 */
int offset; /* 边界对齐偏移量 */
int break_loop; /* 强制从读数据包循环中跳出的标志 */
struct pcap_sf sf; /* 数据包保存到文件的相关配置数据结构 */
struct pcap_md md; /* 具体描述如下 */
int bufsize; /* 读缓冲区的长度 */
u_char buffer; /* 读缓冲区指针 */
u_char *bp;
int cc;
u_char *pkt;
/* 相关抽象操作的函数指针,最终指向特定操作系统的处理函数 */
int (*read_op)(pcap_t *, int cnt, pcap_handler, u_char *);
int (*setfilter_op)(pcap_t *, struct bpf_program *);
int (*set_datalink_op)(pcap_t *, int);
int (*getnonblock_op)(pcap_t *, char *);
int (*setnonblock_op)(pcap_t *, int, char *);
int (*stats_op)(pcap_t *, struct pcap_stat *);
void (*close_op)(pcap_t *);
/*如果 BPF 过滤代码不能在内核中执行,则将其保存并在用户空间执行 */
struct bpf_program fcode;
/* 函数调用出错信息缓冲区 */
char errbuf[PCAP_ERRBUF_SIZE + 1];
/* 当前设备支持的、可更改的数据链路类型的个数 */
int dlt_count;
/* 可更改的数据链路类型号链表,在 linux 下没有使用 */
int *dlt_list;
/* 数据包自定义头部,对数据包捕获时间、捕获长度、真实长度进行描述 [pcap.h] */
struct pcap_pkthdr pcap_header;
};
/* 包含了捕获句柄的接口、状态、过滤信息 [pcap-int.h] */
struct pcap_md {
/* 捕获状态结构 [pcap.h] */
struct pcap_stat stat;
int use_bpf; /* 如果为1,则代表使用内核过滤*/
u_long TotPkts;
u_long TotAccepted; /* 被接收数据包数目 */
u_long TotDrops; /* 被丢弃数据包数目 */
long TotMissed; /* 在过滤进行时被接口丢弃的数据包数目 */
long OrigMissed; /*在过滤进行前被接口丢弃的数据包数目*/
#ifdef linux
int sock_packet; /* 如果为 1,则代表使用 2.0 内核的 SOCK_PACKET 模式 */
int timeout; /* pcap_open_live() 函数超时返回时间*/
int clear_promisc; /* 关闭时设置接口为非混杂模式 */
int cooked; /* 使用 SOCK_DGRAM 类型 */
int lo_ifindex; /* 回路设备索引号 */
char *device; /* 接口设备名称 */
/* 以混杂模式打开 SOCK_PACKET 类型 socket 的 pcap_t 链表*/
struct pcap *next;
#endif
};
(2)bpf_program结构
该结构在pcap_compile()函数中被使用,在bpf.h头文件中定义。
/* [pcap-bpf.h] */
struct bpf_program {
u_int bf_len; /* BPF 代码中谓词判断指令的数目 */
struct bpf_insn *bf_insns; /* 第一个谓词判断指令 */
};
/* 谓词判断指令结构 */
struct bpf_insn {
u_short code;
u_char jt;
u_char jf;
bpf_int32 k;
};
(3)
/usr/include/net/bpf.h
/*
* Structure prepended to each packet.
*/
内核过滤器每输出一个包,将在输出的数据前加了20字节的数据,这就是 struct bpf_hdr
struct bpf_hdr
{
struct timeval bh_tstamp; /* time stamp */
bpf_u_int32 bh_caplen; /* length of captured portion数据长度*/
bpf_u_int32 bh_datalen; /* original length of packet 实际包长度 */
u_short bh_hdrlen; /* length of bpf header (this struct
plus alignment padding) */
};
(4)pcap_stat结构
调用函数 pcap_stats() 可以返回一个该结构
struct pcap_stat {
u_int ps_recv; /* number of packets received */
u_int ps_drop; /* number of packets dropped */
u_int ps_ifdrop; /* drops by interface XXX not yet supported */
};
5)、
struct pcap_addr:网卡地址描述
{
pcap_addr *next;如果非空,指向链表中一个元素的指针;空表示链表中的最后一个元素
sockaddr *addr; 指向包含一个地址的sockaddr的结构的指针
sockaddr *netmask;如果非空,指向包含相对于addr指向的地址的一个网络掩码的结构
sockaddr *broadaddr;如果非空,指向包含相对于addr指向的地址的一个网络掩码的结构
sockaddr *dstaddr; 如果非空,指向一个相对于addr指向的源地址的目的地址,如果网络不支持点对点通讯,则为空
};
6)、dump文件格式
首先是Dump文件头
struct pcap_file_header {
bpf_u_int32 magic;
u_short version_major;
u_short version_minor;
bpf_int32 thiszone; /* gmt to local correction */
bpf_u_int32 sigfigs; /* accuracy of timestamps */
bpf_u_int32 snaplen; /* max length saved portion of each pkt */
bpf_u_int32 linktype; /* data link type (LINKTYPE_*) */
};
然后是每一个包的包头和数据
pcap_pkthdr结构
/usr/include/pcap.h
/*
* Each packet in the dump file is prepended with this generic header.
* This gets around the problem of different headers for different
* packet interfaces.
*/
/* 自定义头部在把数据包保存到文件中也被使用 */
struct pcap_pkthdr
{
struct timeval ts; /* 捕获时间戳 */
bpf_u_int32 caplen; /* 捕获到数据包的长度 */
bpf_u_int32 len; /* 数据包的真正长度 */
}
/* 单个数据包结构,包含数据包元信息和数据信息 */
struct singleton [pcap.c]
{
struct pcap_pkthdr hdr; /* libpcap 自定义数据包头部 */
const u_char * pkt; /* 指向捕获到的网络数据 */
};
7)、pcap_if (libpcap 自定义的接口信息链表 [pcap.h])
struct pcap_if
{
struct pcap_if *next;
char *name; /* 接口设备名 */
char *description; /* 接口描述 */
/*接口的 IP 地址, 地址掩码, 广播地址,目的地址 */
struct pcap_addr addresses;
bpf_u_int32 flags; /* 接口的参数 */
};
linux下libpcap抓包分析的更多相关文章
- linux下的抓包工具tcpdump
1.由netstat查看网络情况,引出的TCP建立连接.终止连接过程,以及TCP状态分析: 2.Soap=XML+HTTP引出的HTTP协议分析: 3.Soap(Simple Object Acces ...
- [转]Linux操作系统tcpdump抓包分析详解
PS:tcpdump是一个用于截取网络分组,并输出分组内容的工具,简单说就是数据包抓包工具.tcpdump凭借强大的功能和灵活的截取策略,使其成为Linux系统下用于网络分析和问题排查的首选工具. t ...
- linux下的抓包
1. 查看网卡名字 cat /proc/net/dev 2.抓取外网进来的包 tcpdump -i eth0 port -s -w .pcap 3.抓取自己服务器上的两个程序之间访问的数据 换成 lo ...
- 怎么在Linux上抓包分析
怎么在Linux上抓包分析 1.在Linux上抓包 例如在Ubuntu上,用命令抓包, tcpdump tcp -i any -s0 -w desk.cap 用 sz desk.cap 把数据包 ...
- tcpdump 与 抓包分析
在Windows下一般使用WireShark 抓包软件,tcpdump 是 Linux 系统的抓包软件.它可以抓取 TCP/IP 协议族的数据包,支持针对网络层.协议.主机.端口的过滤,并提供 and ...
- Wireshark和TcpDump抓包分析心得
Wireshark和 TcpDump抓包分析心得 1. Wireshark与tcpdump介绍 Wireshark是一个网络协议检测工具,支持Windows平台和Unix平台,我一般只在Window ...
- TCP全连接队列和半连接队列已满之后的连接建立过程抓包分析[转]
最近项目需要做单机100万长连接与高并发的服务器,我们开发完服务器以后,通过自己搭的高速压测框架压测服务端的时候,发生了奇怪的现象,就是服务端莫名其妙的少接收了连接,造成了数据包的丢失,通过网上查资料 ...
- 转:tcpdump抓包分析(强烈推荐)
转自:https://mp.weixin.qq.com/s?__biz=MzAxODI5ODMwOA==&mid=2666539134&idx=1&sn=5166f0aac71 ...
- 转 Wireshark和TcpDump抓包分析心得
1. Wireshark与tcpdump介绍 Wireshark是一个网络协议检测工具,支持Windows平台和Unix平台,我一般只在Windows平台下使用Wireshark,如果是Linux的话 ...
随机推荐
- 【USACO】wormholes 【暴力】
题意:给出2K个平面上的点,给它们一一配对,问有多少种配对方法使得存在从某个点一直向右走会陷在循环里(K<=6) 思路:由于k很小,配对方法的话暴力枚举,然后判环,判环时需要注意的是一条直线上的 ...
- 【概率dp】D. Card Collector
https://www.bnuoj.com/v3/contest_show.php?cid=9147#problem/D [题意] 为了集齐n张卡片,必须要买多少袋零食?题目给定每种卡片出现在零食中的 ...
- hdu 4539
#include<stdio.h> #include<string.h> ]; int s]; int main() { int i,j,n,m; int ch; while( ...
- bitset初始化问题
在C++primer上面说,bitset可以用unsigned long来进行初始化,但是上面的例子只是采用了常数如0xffff,而在实际中,当在vs2010中,我采用unsigned long类型的 ...
- flex里InputText不能输入中文
最近做项目都没做任何的更新,今天突然遇到在flex里的InputText无法进行中文输入,晚上查找了下资料,很多原因说是flashplayer的一个BUG. 在网上找到两种解决办法: 1.会出现这种情 ...
- linux C 中的volatile使用
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了.精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存 ...
- Java 函数式接口 lambda
import java.io.Serializable; import java.util.ArrayList; import java.util.List; public class Demo1 { ...
- “约定优于配置”与Magento改造尝试四之block、helper和model载入
暂定本章为这个系列最后一章,还是继续沿用模块的别名(alias)概念 <modules> <Mage_Wishlist> <version>1.6.0.0</ ...
- Office文档如何转换 PDF 转 DOC XLS
1 使用Adobe Acrobat Pro,打开任意PDF都可以转换为XLSX格式(似乎没找到XLS) 2 如果你转换之后的东西无法打开,则先转换成DOC,然后再把DOC全选复制粘贴到XLS即可 ...
- Native进程之Trace原理(转)——可直接输出某进程的栈帧——debuggerd
一. 概述 当发生ANR(Application Not Response,对于Java进程可通过kill -3向目标进程发送信号SIGNAL_QUIT, 输出相应的traces信息保存到目录/dat ...