协议解析

更新时间:2023-07-19 04:19:00 阅读: 评论:0

Packet Decoders
这是介绍几个简单的协议解码函数,是参考NetPacket模块中的相关函数修改的。如Windows下通常使用winpcap库抓包,使用模块是       
Net::PcapNet::PcapUtils,其中Net::PcapPerlwinpcap库接口,Net::PcapUtils里映射了一些Net::Pcap中常用的函数,
提供了更方便些的接口。写协议分析程序一般步骤是:
1、打开设备;
2、循环抓包,对每个包进行逐层解码,在每层解码后进行相关字段的过滤;
3、最后将满足过滤条件的包输出;
4、加上对中断信号的处理,各种统计Counter等其他特性;
举例来说,打开Eth0设备,循环抓包,最初获得eth frame,用eth_decode函数处理,获得帧的src_macdest_mactypedata字段,
其中圣诞装data字段里是上层协议数据。然后根据type字段指示的上层协议类型,对data字段的值应用相应的解码函数,如type是“0x0800”,
则表明这个以太帧里面是IP包-对应就是以太帧的data字段,用ip_decode函数处理这个字段,继而获得这个IP包中的各个字段,
同理它的data字段就是IP层的上层协议包的内容,又IP包中的proto字段指示四层协议的类型,如IPproto字段是6
则表明四层是TCP协议,那么就对IPdata想念妈妈的图片字段应用tcp_decode函数进行解析,依此类推。
综上,每层协议头中必定定义了某个字段(如pe,ip.de, etc.)指示如何解析该层携带的上层数据包(data)。
具体解码做法就是参考协议的RFC文档,使用unpack逐层解码、计算生成每层相关字段。当编写某个协议的解码函数时,
可以参考下面几个decode函数,其中关键是unpack的使用,因为是解析网络中的数据包,当然使用网络字节顺序来unpack
常用下面几个字符:
九一八九一八事变N - 32bits 网络字节顺序
n - 16bits 网络字节顺序
C - 8bits 网络字节顺序
a - 任意二进制
信访工作总结对于非整字节的字段(如4bits13bits等),按Cn取得整字节后移位获得,如IP Header的结构是:
    0                  1                  2                  3 
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |Version|  IHL  |Type of Service|          Total Length        | <-CCn
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |        Identification        |Flags|      Fragment Offt    | <-nn
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |  Time to Live |    Protocol  |        Header Checksum      | <-CCn
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                      Source Address                          | <-N
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
高铁特等座和一等座的区别  |                    Destination Address                        | <-N
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                    Options                    |    Padding    | <-a*
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                    Example Internet Datagram Header
参考,对应的解码函数可以写成:
sub ip_decode {
    my $packet = shift;
    my $ippkt_ref = {};
    my @fields = qw/tmp tos len id fofft ttl proto cksum src_ip dest_ip options/;
    my @values = unpack("CCnnnCCnNNa*" , $packet);
    map { $ippkt_ref->{$fields[$_]} = $values[$_] } (0..$#fields);
    #Extract bit fields
    $ippkt_ref->{ver} = ($ippkt_ref->{tmp} & 0xf0) >> 4;
    $ippkt_ref->{hlen} = $ippkt_ref->{tmp} & 0x0f;
    $ippkt_ref->{flags} = $ippkt_ref->{fofft} >> 13;
    $ippkt_ref->{fofft} = ($ippkt_ref->{fofft} & 0x1fff) << 3;
    #Decode variable length header options and remaining data in field
    #Option length is number of 32 bits words
小班古诗
    my $olen = ($ippkt_ref->{hlen} - 5) ? ($ippkt_ref->{hlen} - 5) * 4 : 0;
    ($ippkt_ref->{options}, $ippkt_ref->{data}) = unpack("a".$olen."a*", $ippkt_ref->{options});
    #Convert 32 bit ip address to dotted quad notation
    $ippkt_ref->{src_ip} = to_dotquad($ippkt_ref->{src_ip});
    $ippkt_ref->{dest_ip} = to_dotquad($ippkt_ref->{dest_ip});
    undef $ippkt_ref->{tmp};
    return $ippkt_ref;
}
--Packet Decoders eXamples--
#Packets decoders
sub eth_decode {
    my $packet = shift;
    my $ethframe_ref = {};
    my @fields = qw/sm_lo sm_hi dm_lo dm_hi type data/;
    my @values = unpack("NnNnna*", $packet);
    map { $ethframe_ref->{$fields[$_]} = $values[$_] } (0..$#fields);
    #Convert MAC address to hex string to avoid reprentation problems
    $ethframe_ref->{src_mac} = sprintf("%08x%04x", $ethframe_ref->{sm_hi}, $ethframe_ref->{sm_lo});
    $ethframe_ref->{dest_mac}= sprintf("%08x%04x", $ethframe_ref->{dm_hi}, $ethframe_ref->{dm_lo});
    undef $ethframe_ref->{$_} foreach(qw/sm_lo sm_hi dm_lo dm_hi/);
    return $ethframe_ref;
孤寂的图片}
sub arp_decode {
    my $packet = shift;
    my $arppkt_ref = {};
    my @fields = qw/htype proto hlen plen opcode sha spa tha tpa data/;
    my @values = (unpack("nnCCnH12H8H12H8", $packet), undef);
    map { $arppkt_ref->{$fields[$_]} = $values[$_] } (0..$#fields);
    return $arppkt_ref;
}
sub ppp_decode {
电影赵氏孤儿
    my $packet = shift;

本文发布于:2023-07-19 04:19:00,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1087261.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:协议   解码   函数   字节   相关   网络   每层
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图