基于pcap的包嗅探器(sniffer)

Linux系统下手动写一个pcap包嗅探器,了解抓包原理。

首先要了解的是pcap嗅探器的总体布局。代码流程如下:
1.我们首先确定我们想要嗅探哪个接口。在Linux中,这可能类似于eth0,在BSD中它可能是xl1等。我们可以在字符串中定义此设备,或者我们可以要求pcap自己为我们提供将完成工作的接口的名称。
2.初始化pcap。这是我们实际告诉pcap我们正在嗅探的设备。如果我们愿意,我们可以嗅探多个设备。我们如何区分它们?使用文件句柄。就像打开文件进行读写一样,我们必须命名我们的嗅探“会话”,以便我们可以将其与其他此类会话区分开来。
3.如果我们只想嗅探特定的流量(例如:TCP/IP数据包,去往端口23的数据包等),我们必须创建一个规则集,“编译”并应用它。这是一个三阶段的过程,所有这些都是密切相关的。规则集保存在一个字符串中,并转换为pcap可以读取的格式(因此编译它。)编译实际上只是通过调用程序中的函数来完成的。它不涉及使用外部应用程序。然后我们告诉pcap将它应用于我们希望过滤的会话。
4.最后,我们告诉pcap进入它的主要执行循环。在这种状态下,pcap会一直等到它收到了我们想要它的数据包。每次获取新数据包时,它都会调用我们已经定义的另一个函数。它调用的函数可以做任何我们想做的事情;它可以解析数据包并将其打印给用户,它可以将其保存在文件中,或者根本不执行任何操作。
5.在满足我们的嗅探需求后,我们会结束会话并完成。
这实际上是一个非常简单的过程。共计五个步骤,其中一个是可选的(步骤3)让我们看一下每个步骤以及如何实现它们。

一.设置嗅探设备

利用pcap库,让pcap自己设置设备。其中errbuf表示若查找设备失败,则用errbuf保存错误信息。
在这里插入图片描述
编译
在这里插入图片描述
执行
在这里插入图片描述

二.打开设备进行嗅探

在上段代码中加入对设备嗅探的代码:
在这里插入图片描述
pcap_open_live()函数原型

pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms,char *ebuf)
  • 此函数用于打开网络设备,返回一个pcap_t结构体的指针。
  • 帮助文档中的说法是:用于获取一个数据包捕获的描述符,以便用来查看网络上的数据包。
  • device是网卡名称。
  • snaplen表示捕获的最大字节数,如果这个值小于被捕获的数据包的大小,则只显示前snaplen位(实验表明,后面为全是0),通常来讲数据包的大小不会超过65535。
  • promisc表示是否开启混杂模式。
  • to_ms表示读取的超时时间,毫秒为单位,就是说没有必要看到一个数据包这个函数就返回,而是设定一个返回时间,这个时间内可能会读取很多个数据包,然后一起返回。如果这个值为0,这个函数一直等待足够多的数据包到来。
  • errbuf用于存储错误信息。

三.过滤流量

首先明确几个函数的作用:
1.pcap_compile()函数:编译程序

int pcap_compile(pcap_t *p, struct bpf_program *fp, char *str, int optimize, bpf_u_int32 netmask)

pcap_t *p:会话句柄
struct bpf_program:编译版本的位置引用
char *str:表达式:字符串形式
int optimize:整数,决定表达式是否该优化(0为假,1为真)
bpf_u_int32 netmask:指定过滤器适用的网络的网络掩码。
2.pcap_setfilter()函数:应用编译后的程序

int pcap_setfilter(pcap_t *p, struct bpf_program *fp)

pcap_t *p:会话处理程序
struct bpf_program:编译版本的位置引用
在这里插入图片描述

四.实际的嗅探

利用pcap_loop()函数

int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)

pcap_t *p:是我们的会话句柄。
int cnt:一个整数,它告诉pcap_loop()在返回之前它应该嗅探多少个数据包(负值意味着它应该嗅探直到发生错误)。
pcap_handler callback“第三个参数是回调函数的名称(只是函数名,没有括号)。
u_char *user:最后一个参数在某些应用程序中很有用,但很多时候只是设置为NULL。
这里着重写的就是回调函数。回调函数原型:

void got_packet(u_char *args, const struct pcap_pkthdr *header,  const u_char *packet);

pcap_pkthdr的定义为:查看pcap.h头文件方法:
首先查找文件所在位置

sudo find / -type f -name pcap.h

在这里插入图片描述
代码实现:
在这里插入图片描述

五.回调函数和输出处理

查找IP数据类型:
首先查找所在位置:
在这里插入图片描述
查看目录下对应的文件:
在这里插入图片描述
可以看到里面的一些数据结构:

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
酷抓6是在原网址抓取器5.0的基础上全新升级、强势推出的。提供嗅探下载一条龙服务。可以在线抓取正在访问的所有网络资源并提供下载,比如图片、Flash、音乐、视频等。独有的完整HTTP请求和响应抓取分析功能,打造的就是超强的防盗链下载功能和精准的真实文件类型自动识别功能。独有的疑难网址下载功能,真正将所有网络资源一网打尽。 完全支持所有flv视频网站的下载、所有DJ网站、铃声网站的铃声下载,括QQ音乐,QQ空间背景音乐的下载。酷抓的口号是:只要你能看到的,你能听到的,我都可以下载下来。 支持Windows2000/XP局域网、拨号上网、无线上网等所有网络形式。 更新历史: 2010-06-14 酷抓6.8.193.0614 终结版 ----------------------------------------- +增加RTMP/RTMPE流录制功能 *全新的RTMP解析引擎 ----------------------------------------- +Add function of recording RTMP/RTMPE stream *New engine of RMTP analysis ----------------------------------------- 2010-05-29 刀锋下载5.0.322.0529 ----------------------------------------- *修正了下载某些RTMP流时出错的问题 ----------------------------------------- *Fix some tiny problems when downloading RTMP streams ----------------------------------------- 2010-05-23 ----------------------------------------- 酷抓6.5.175.0523 刀锋下载5.0.315.0523 +增加对RTMPE协议的抓取和下载 +增加对RTMP码率切换抓取的支持 +改进退出时保存提示的体验 *修正了某些HTTP完整请求头抓取格式错误的BUG ----------------------------------------- CooJah 6.5.175.0523 Blader 5.0.315.0523 +Support RTMPE sniffing and downloading +Support RTMP stream bitrates switching sniffing +Optimize exit prompting *Correct format errors for some HTTP headers ----------------------------------------- 2010-02-28 ----------------------------------------- 刀锋下载4.6.251.0228 +刀锋下载支持下载电视直播类型rtmp协议 ----------------------------------------- Blader 4.6.251.0228 +Blader supports live tv rtmp download ----------------------------------------- 2010-01-17 ----------------------------------------- 酷抓6.1.128.0116 刀锋下载4.5.241.0116 +刀锋下载增加最小化至系统托盘和悬浮窗功能 *更正软件中相关错误链接 ----------------------------------------- CooJah 6.1.128.0116 Blader 4.5.241.0116 +Tray icon support for Blader when minimizing and floating window to show downloading status *correct some dead links ----------------------------------------- 2010-01-04 ----------------------------------------- 酷抓6.1.124.0104 刀锋下载4.5.168.0104 *修复一处酷抓对mmsh协议的网址分类错误的问题 +酷抓+刀锋配合支持mmsh下载 ----------------------------------------
基于WinPcap嗅探器代码可以用于捕获网络数据并进行分析。首先,我们需要含WinPcap的头文件和库文件,并初始化WinPcap的环境。然后,我们可以设置过滤器来指定需要捕获的数据类型,如TCP、UDP等。接下来,我们可以打开网络适配器并开始捕获数据。捕获到的数据可以通过回调函数进行处理,比如打印数据的信息或进行进一步的分析。最后,我们需要在程序结束时释放资源并关闭网络适配器。 以下是一个简单的基于WinPcap嗅探器代码示例: ```c #include <stdio.h> #include <pcap.h> void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data) { // 处理数据的回调函数,可以打印数据信息或进行其他操作 printf("Packet captured: %d\n", header->len); } int main() { pcap_t *adhandle; char errbuf[PCAP_ERRBUF_SIZE]; struct bpf_program fp; char filter_exp[] = "ip"; // 过滤器表达式,此处表示捕获所有IP数据 bpf_u_int32 mask; bpf_u_int32 net; // 初始化WinPcap环境 pcap_findalldevs(&alldevs, errbuf); pcap_lookupnet(dev->name, &net, &mask, errbuf); adhandle = pcap_open_live(dev->name, 65536, 1, 1000, errbuf); // 编译并设置过滤器 pcap_compile(adhandle, &fp, filter_exp, 0, net); pcap_setfilter(adhandle, &fp); // 开始捕获数据 pcap_loop(adhandle, 0, packet_handler, NULL); // 释放资源 pcap_freecode(&fp); pcap_close(adhandle); return 0; } ``` 以上代码中,我们首先初始化WinPcap环境,然后设置过滤器表达式,并使用pcap_loop函数开始捕获数据,使用pcap_close函数在程序结束时释放资源。通过以上步骤,就可以开发一个简单的基于WinPcap嗅探器代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值