您现在的位置:网侠>网络冲浪>网络技术>正文
正文

使用pcap编写自己的sniffer

文章来源:315安全网 文章作者: 发布时间:2007-07-14 【字体:
收藏本文】 【推荐好友】 【进入博客】 【进入论坛
 1、 用户在命令行指定定监听的网络接口:

#include <stdio.h>
#include <pcap.h>
int main(int argc, char *argv[])
{
    char *dev = argv[1];
    printf("Device: %s\n", dev);
    return(0);
}

字串8

    用户通过命令行参数传入监听接口。
    译注:在实际的项目开发中务必对命令行参数进行判断: 字串7

      if (argc < 2) {

字串6

            printf(“Usage: %s <option>\n”, argv[0]);

字串5

            exit(1);

字串3

      }

字串3

    2、  通过pcap引擎设定监听的网络接口: 字串6

#include <stdio.h>
#include <pcap.h>
int main()
{
    char *dev, errbuf[PCAP_ERRBUF_SIZE];
    dev = pcap_lookupdev(errbuf);
    printf("Device: %s\n", dev);
    return(0);
}

字串2

    在这种情况下,pcap引擎自己设置用来监听的接口。但是errbuf字符串用来做什么呢?大多数的pcap函数允许我们传递这样一个字符串作为其参数。这个字符串参数用来在pcap函数调用失败以后用来设置出错信息。在上面的例子中,如果pcap_lookup函数调用失败,出错信息将被保存在errbuf中。
    译注:增加的错误检查的代码如下: 字串8

       if (NULL == (dev = pcap_lookupdev(errbuf))) {

字串2

              fprintf(stderr, “pcap_lookupdev() error: %s\n”, errbuf);

字串7

              exit(-1); 字串6

       }

字串7

       printf(“Device: %s\n”, dev);

字串3

 

字串5

Opening the device for sniffing
    创建sniff会话的任务非常简单。我们使用pcap_open_live()创建sniff会话。函数原型:

字串2

pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *ebuf) 字串6

       device:上节中我们制定的监听设备接口; 字串8

       snaplen:制定pcap捕获的最大数目的网络数据包; 字串4

       promisc:>0指定device接口工作在混杂模式(promiscous Mode); 字串2

       to_ms:制定经过特定时间(ms)后读超时;0表示遇到错误退出,-1指定永不超时; 字串4

       ebuf:制定用来存储出错信息的字符串 字串8

       pcap_t:返回值为用于监听的pcap会话。 字串2

    示例代码: 字串2

#include <pcap.h>
    ...
    pcap_t *handle;
    handle = pcap_open_live(somedev, BUFSIZ, 1, 0, errbuf);
    上面的代码打开somedev指定的设备并读取(捕获)BUFSIZ字节,同时我们设置接口工作在混杂模式,一直监听到有任何错误发生则退出,并将出错信息保存在errbuf指定的字符串中。
    关于混杂模式vs.非混杂模式:通常情况在非混杂模式下仅监听直接发往主机的数据包:发往、源自或通过主机路由的数据包都将被pcap捕获;混杂模式下,所有发送到物理链路上的数据包都将被捕获。在一个共享式的网络环境中,这将导致整个网络的数据流被监听。混合监听模式是可以被检测的:可以通过测试强可靠性来发现网络中是否有主机正在以混合模式监听,另外混杂工作模式仅仅在非交换式的网络中有效,而且在一个高负载的网络环境中,混杂模式将消耗大量的系统资源。
    Filter traffic
    通常我们只对特定网络通信感兴趣。比如我们只打算监听Telnet服务(port 23)以捕获用户名和口令信息。获知对FTP(port 21)或DNS(UDP port 53)数据流感兴趣。可以通过pcap_compile()和pcap_setfilter来设置数据流过滤规则(filter) 字串9
    函数原型:
    int pcap_compile(pcap_t *p, struct bpf_program *fp, char *str, int optimize, bpf_u_int32 netmask)
    p:表示pcap会话句柄;
    fp:存放编译以后的规则;
    str:规则表达式格式的过滤规则(filter),同tcpdump中的filter;

字串8

optimize:制定优化选项:0 false, 1 true;

字串9

netmask:监听接口的网络掩码;
 
    返回值:-1表示操作失败,其他值表成功。

字串1

int pcap_setfilter(pcap_t *p, struct bpf_program *fp) 字串1

              p:表示pcap的会话句柄; 字串7

              fp:表示经过编译后的过滤规则;

字串3

              返回值:-1表示操作失败,其他值表成功。
    示例代码: 字串7

#include <pcap.h>
    ...
    pcap_t *handle;                           /* Session handle */

共3页: 上一页 1 [2] [3] 下一页

上一篇:Sniffer在网吧网络维护中的综合应用  下一篇:协议欺骗攻击技术常见种类简析及防范
推荐新闻
     
 
邮箱:ewind@qq.com
建议您使用:1024*768以上分辩率浏览本站 如果你喜欢本站 请收藏本站 并推荐给你的朋友一起分享
免责声明:本站部分内容收集于网络,版权归原作者及出版社所有!如果您觉得侵犯了您的版权请来信告诉我们,我们会尽快删除其内容!