`
isiqi
  • 浏览: 16500544 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

winpcap入门学习

阅读更多

1.入门使用篇
本篇讲述如何抓包
最简单的libpcap抓包程序只要有以下几句就可以了

char ebuf[PCAP_ERRBUF_SIZE];
pcap_t *pd = pcap_open_live("eth0", 68, 0, 1000, ebuf);
建立libpcap捕捉句柄,若出错,ebuf返回错误字串.ebuf可以为NULL(以后同)

struct bpf_program fcode;
pcap_compile(pd, &fcode, NULL, 1, 0);
添写过滤规则串fcode,可以为空(即第三个参数,格式在后面讲到)

pcap_setfilter(pd, &fcode);
给 pd 设置上过滤规则

pcap_loop(pd, 10, eth_printer, NULL);
主循环,开始抓包,共抓10个(由第二个参数指定),抓到包后就进入函数 eth_printer

pcap_close(pd);
结束

这个就是最简单的程序了,其中还有个不明,
在pcap_loop参数 eth_printer的类型是pcap_handler,pcap_handler定义如下:
typedef void (*pcap_handler)(u_char *, const struct pcap_pkthdr *,
const u_char *);
当然要包含
#include "pcap.h"
编译要加上 -lpcap
至于怎么得到libpcap,还有安装,我就不费话了
本文版权所有:doggy(chaujy@x263.net) 欢迎转载

2.使用进阶篇

刚才我们对程序的要求是能编译通过,能运行成功
现在我们让这个程序实用点吧

2.1 其它几个函数介绍
这几个函数的特点是简单但无关紧要

现在我们隆重退出
char * pcap_lookupdev ( char * errbuf );
这个函数就是查找本机上的网络接口设备,我机器上就返回"eth0",
在pcap_open_live之前用,没什么意思吧,反正我是不爱用它

int pcap_lookupnet(char *, bpf_u_int32 *, bpf_u_int32 *, char *);
第一个参数就是pcap_lookupdev返回的接口名,二三参数都是32位无符号数,
分别是IP网段和掩码,最后那个参数还是ebuf

int pcap_datalink(pcap_t *);
它返回你的网络类型,如 DLT_EN10MB 就是10M以太网
让人ft氖钦庑┏A慷ㄒ宀辉趐cap.h中,在哪?自己找找吧;-)

int pcap_snapshot(pcap_t *);
返回最长抓多少字节,就是我们在pcap_open_live中第二个参数设置的

int pcap_stats(pcap_t *, struct pcap_stat *);
计数,共抓了多少过滤掉了多少,看看struct pcap_stat的定义就明白了
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 */
};

int pcap_major_version(pcap_t *);
int pcap_minor_version(pcap_t *);
版本号,你有用么?
我的eth_printer如下
void eth_printer(u_char * user, const struct pcap_pkthdr * h, const u_char * p)
{
printf("I get one packet! ");
}
简单吧 :*)

2.使用进阶篇

刚才我们对程序的要求是能编译通过,能运行成功现在我们让这个程序实用点吧

2.1 其它几个函数介绍
这几个函数的特点是简单但无关紧要

现在我们隆重退出
char * pcap_lookupdev ( char * errbuf );
这个函数就是查找本机上的网络接口设备,我机器上就返回"eth0",在pcap_open_live之前用,没什么意思吧,反正我是不爱用它

int pcap_lookupnet(char *, bpf_u_int32 *, bpf_u_int32 *, char *);
第一个参数就是pcap_lookupdev返回的接口名,二三参数都是32位无符号数,
分别是IP网段和掩码,最后那个参数还是ebuf

int pcap_datalink(pcap_t *);
它返回你的网络类型,如 DLT_EN10MB 就是10M以太网
让人ft的是这些常量定义不在pcap.h中,在哪?自己找找吧;-)

int pcap_snapshot(pcap_t *);
返回最长抓多少字节,就是我们在pcap_open_live中第二个参数设置的

int pcap_stats(pcap_t *, struct pcap_stat *);
计数,共抓了多少过滤掉了多少,看看struct pcap_stat的定义就明白了
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 */
};

int pcap_major_version(pcap_t *);
int pcap_minor_version(pcap_t *);
版本号

2.2 现在的程序(C++)

文件名p.cxx

#ifdef __cplusplus
extern "C" {
#endif
#include
#ifdef __cplusplus
}
#endif

void printer(u_char * user, const struct pcap_pkthdr * h, const u_char * p)
{
printf("I get one packet! ");
/* 哈哈,我都想喝一杯庆祝一下了! */
}

#define DEFAULT_SNAPLEN 68
/* 别问我为什么是68,我从tcpdump看来的 */

int main()
{
char ebuf[PCAP_ERRBUF_SIZE];
char *device = pcap_lookupdev(ebuf);

bpf_u_int32 localnet, netmask;
pcap_lookupnet(device, &localnet, &netmask, ebuf);
printf("%u.%u.%u.%u", localnet&0xff, localnet>>8&0xff,
localnet>>16&0xff, localnet>>24&0xff);
printf(":%d.%d.%d.%d ", netmask&0xff, netmask>>8&0xff,
netmask>>16&0xff, netmask>>24&0xff);

struct pcap_t *pd = pcap_open_live(device, DEFAULT_SNAPLEN, 0, 1000, ebuf);

if(pcap_datalink(pd) == DLT_EN10MB)
printf("10Mb以太网 ");

struct bpf_program fcode;
pcap_compile(pd, &fcode, NULL, 1, 0);

pcap_setfilter(pd, &fcode);

pcap_loop(pd, 10, printer, NULL);

struct pcap_stat stat;
pcap_stats(pd, &stat);
printf("recv %d, drop %d. ", stat.ps_recv, stat.ps_drop);

pcap_close(pd);
}

#gcc p.cxx -lpcap
#./a.out
166.111.168.0:255.255.252.0
10Mb以太网
I get one packet!
I get one packet!
I get one packet!
I get one packet!
I get one packet!
I get one packet!
I get one packet!
I get one packet!
I get one packet!
I get one packet!
recv 10, drop 0.
#

重要提示: libpcap 程序需要root权限
2.3 出错处理

象其它库一样,libpcap 也有自己的错误处理机制
基本上每个函数都有返回值,出错时返回值<0,另外有如下函数
void pcap_perror(pcap_t *, char *);
char *pcap_strerror(int);
char *pcap_geterr(pcap_t *);
前两个和 perror() strerror() 用法相同,最后一个也很简单
在 pcap_t 中有一个成员存了错误字串
struct pcap {
...
char errbuf[PCAP_ERRBUF_SIZE];
};
所以......

于是我们在刚才的程序中加上错误处理
先加一个函数
#include
int err_quit(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
exit(-1);
}

之后处理每个函数的异常,在成功建立捕捉句柄pcap_t *pd前,使用ebuf参数
char *device = pcap_lookupdev(ebuf);
if(device == NULL)
err_quit("%s", ebuf);
有了句柄pd后
if(pcap_compile(pd, &fcode, NULL, 1, 0) < 0)
err_quit("%s", pcap_geterr(pd));
注意不是每个函数都是出错返回<0
pcap_datalink(pd)和pcap_snapshot(pd)等可不要这么处理
2.4 参数初步研究

前面使用各函数时,并没有具体说明每个函数的意义,现在来探讨一下

pcap_t * pcap_open_live(char *device, int snaplen, int promisc,
int to_ms, char *ebuf)
device指定设备,snaplen指定最长抓多少字节,ebuf出错信息,前面都说过
promisc指出是否设置为混杂模式(不懂?我也不懂,整个网都听还有什么安全性可言)
to_ms设置超时时间,单位milliseconds

int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
cnt为要抓的包数,pcap_loop在正常时抓cnt个包后返回,异常时返回值<0
user是要传入callback()的数据,例如我们把上面的程序修改几行
file://pcap_loop(pd, 10, printer, NULL);
pcap_loop(pd, 10, printer, (u_char*)pd);
再在printer()内加
pcap_stat stat;
pcap_stats((pcap_t*)user, &stat);
printf("recv %d, drop %d. ", stat.ps_recv, stat.ps_drop);
再编译运行后输出为
166.111.168.0:255.255.252.0
10Mb以太网
recv 1, drop 0.
recv 2, drop 0.
recv 3, drop 0.
recv 4, drop 0.
recv 5, drop 0.
recv 6, drop 0.
recv 7, drop 0.
recv 8, drop 0.
recv 9, drop 0.
recv 10, drop 0.
recv 10, drop 0.

int pcap_compile(pcap_t *p, struct bpf_program *program,
char *buf, int optimize, bpf_u_int32 mask)
该函数用于解析过滤规则串buf,填写bpf_program结构.
optimize为1表示对过滤规则进行优化处理
netmask指定子网掩码
buf的格式比较复杂

int pcap_setfilter(pcap_t *handle, struct bpf_program *filter)
把pcap_compile()构造的filter设置到handle上

分享到:
评论

相关推荐

    WinPcap入门手册(中文的)

    本入门手册将带你了解WinPcap的基础知识、安装与配置,以及如何利用它进行数据包捕获和分析。 一、WinPcap简介 WinPcap是开源的,由意大利Politecnico di Torino大学和美国Riverbed Technology公司共同开发。它的...

    循序渐进学习WinPcap编程

    总结来说,循序渐进学习WinPcap编程不仅需要熟悉C语言编程和网络基础知识,还需要掌握WinPcap提供的API和函数库,以及其在Visual C++环境中的配置和使用方法。通过逐步学习和实践,开发者可以开发出能够进行复杂网络...

    WinPcap

    WinPcap是一款强大的网络数据包...总的来说,WinPcap是学习和研究网络技术的重要工具,对于大、中专院校的学生来说,掌握WinPcap的使用不仅可以提升理论知识,还能增强实践操作能力,为未来的职业生涯打下坚实的基础。

    循序渐进学习使用WINPCAP(一).rar_pca_winpcap_学习使用

    在开始学习WINPCAP之前,你需要具备一些基础知识,包括但不限于计算机网络原理、C或C++编程语言,以及对操作系统I/O概念的理解。了解网络层、传输层和应用层协议,如IP、TCP、UDP和HTTP,也会对理解WINPCAP的工作...

    Winpcap编程入门

    本篇文章旨在通过一系列的步骤引导读者深入学习WinPcap编程的基础与进阶内容。从简单的基础函数(如获取网络接口列表、捕捉数据包)到更复杂的高级功能(如处理发送队列、进行网络流量统计),文章提供了丰富的示例...

    循序渐进学习使用WinPcap(PDF版)

    《循序渐进学习使用WinPcap》是一本专注于网络数据包捕获和分析的PDF教程,适合初学者和有经验的IT专业人士。WinPcap是Windows平台上一个强大的开源库,用于在网络层进行数据包捕获和网络分析。它不仅为开发人员提供...

    循序渐进学习使用WINPCAP

    学习WINPCAP需要具备一定的C语言基础,因为大部分示例和API都是用C语言实现的。同时,对网络基础知识的理解也很重要,包括TCP/IP协议栈、数据包结构、网络地址等。 总结起来,WINPCAP是一个强大的网络数据包捕获...

    Winpcap的官方demo

    这个"Winpcap的官方demo"包含了官方提供的示例和资源,是学习和理解Winpcap功能与用法的重要参考资料。 1. **Winpcap的基本概念** - **数据包捕获**:Winpcap能够直接访问网络接口卡(NIC)的数据包传输,允许程序...

    winpcap-source.rar_winpcap 开源库_winpcap开源吗_开源 抓包工具_抓包开源

    3. 教程和书籍:网络上有不少关于WinPCAP的教程和书籍,可以帮助快速入门和提升。 总之,WinPCAP是Windows平台网络监控和分析的重要工具,其开源属性促进了技术的共享和进步。无论是网络管理员、开发人员还是安全...

    循序渐进学习使用WINPCAP(二.rar_winpcap

    - 示例代码:网上有许多使用WinPCAP编写的示例代码,可以帮助初学者快速入门。 - 社区:参与相关的技术论坛和社区,如Stack Overflow,可以获取更多实战经验和解答疑问。 综上所述,学习WinPCAP需要结合理论知识和...

    winPcap4.1.1

    5. **网络监控**:作为网络分析工具的基础,winPcap被广泛用于网络安全监控和入侵检测系统。 **三、4.1.1版本特性** winPcap 4.1.1是最稳定且广泛使用的版本之一,针对Windows 7进行了优化。其主要改进包括: 1. ...

    Winpcap学习笔记.pdf

    本篇学习笔记主要涵盖了Winpcap的使用和配置,以及如何通过编程接口进行设备列举。 首先,为了进行Winpcap的开发,你需要下载WpdPack_3_2_alpha1.zip,这是一个包含文档、示例代码、Include和lib目录的压缩包。解压...

    winpcap学习资料

    这个“winpcap学习资料”压缩包包含了一份关于WinPcap 4.01的使用说明,对于初学者来说是极有价值的资源。 一、WinPcap基础知识 1. **数据包捕获**:WinPcap的核心功能之一是捕获网络接口上的原始数据包,这为网络...

    winpcap_4_1_3.zip

    这种特性使得Winpcap成为网络分析、网络安全、性能监测等领域的基础工具。 在开发网络应用时,Winpcap能够提供实时的数据包捕获和分析,帮助程序员调试网络协议或者创建需要直接处理网络数据的应用。例如,网络安全...

    Winpcap、Jpcap使用

    为了更好地学习和应用Winpcap与Jpcap,建议阅读以下资源: - Winpcap官方文档:http://www.winpcap.org/docs/docs_412/html/index.html - Jpcap项目主页:http://jpcap.sourceforge.net/ - 相关的书籍和教程:如...

    WinPcap 中文技术文档.txt

    “WinPcap用户指南”文档应该详细涵盖了上述各个方面,包括安装、配置、API使用示例、过滤表达式编写等内容,是学习和使用WinPcap的重要参考资料。无论是对网络监控、安全研究还是网络编程感兴趣的读者,都能从中...

    winpcap资料(源代码和讲解等等)

    通过阅读和分析这些代码,你将学习到如何使用WinPCap的函数来打开网络接口、设置数据包过滤器、读取捕获的数据包以及如何处理捕获事件。 此外,这个资料包还可能包含有关网络编程的其他资源,比如网络协议分析、...

    winpcap 中文技术文档

    通过深入学习WinPCAP的中文技术文档,开发者可以掌握如何利用WinPCAP开发高效、精准的网络监控和分析工具,提高对网络行为的理解和控制能力。对于网络安全、网络运维以及软件开发人员来说,这是一份不可或缺的技术...

Global site tag (gtag.js) - Google Analytics