首页 > 其他 > 详细

libpcap 与 “port 80”

时间:2014-03-29 06:28:48      阅读:645      评论:0      收藏:0      [点我收藏+]

代码调用:

char filter_exp[] = "port 80";

1 "port 80" 作为字符串 参与编译  pcap_compile(handle, &fp, filter_exp, 0, net)

  2 netmask = mask; // 全局变量网络淹码赋值

   bpf_pcap = handle; //内部的全局变量指针

   snaplen = snaplen_arg; // capture最大的报文长度

   in_buffer =filter_exp; // flex变量赋值,flex就是解析in_buffer的tokens,然后调用yacc(bison)的语法对应的规则

    3 init_linktype(linktype_arg);

     linktype =linktype_arg;  //全局变量,链路层是什么?

      off_linktype = 12; //上层协议的类型, 6(源mac)+6(目的mac)+(linktype 上层协议类型)

      off_nl = 14; //上层链路的偏移, 网络层开始 ip

   4 (void)pcap_parse(); // 调用yacc 解析过滤语法 yacc->lex(flex)返回token

    port 80 ==>根据 80 (是一个NUM) ==>id ==> gen_ncode

      调用一个生成数字的指令输出

      gen_ncode (根据$0 发先前面的修饰符是 port)

        ==> gen_port

          ==> gen_linktype(ETHERTYPE_IP)

             ==> gen_cmp(off_linktype, BPF_H, (bpf_int32)proto);

              ==> s = new_stmt(BPF_LD|BPF_ABS|BPF_H);  绝对位置加载指令
                    s->s.k = off_linktype;  加载的位子是12 以太王报文头的上层协议字段 加载两个字节

                       b = new_block(JMP(BPF_JEQ));
                     b->stmts = s;
                                              b->s.k = #800;

--------------------------------------------------------------------------------------------------------------------------------------

(000) ldh      [12]

(001) jeq      #0x800           jt 2    jf 23

--------------------------------------------------------------------------------------------------------------------------------------

...

流图

program->bf_insns = icode_to_fcode(root, &len);

指令数组

 

 

      

  

  

libpcap 与 “port 80”,布布扣,bubuko.com

libpcap 与 “port 80”

原文:http://www.cnblogs.com/kwingmei/p/3632064.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!