如何编写协议解码函数_第1页
如何编写协议解码函数_第2页
如何编写协议解码函数_第3页
如何编写协议解码函数_第4页
如何编写协议解码函数_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.:.;Packet Decoders 这是引见几个简单的协议解码函数,是参考NetPacket模块中的相关函数修正的。如Windows下通常运用winpcap库抓包,运用模块是Net:Pcap和Net:PcapUtils,其中Net:Pcap是Perl的winpcap库接口,Net:PcapUtils里映射了一些Net:Pcap中常用的函数,提供了更方便些的接口。写协议分析程序普通步骤是:1、翻开设备;2、循环抓包,对每个包进展逐层解码,在每层解码后进展相关字段的过滤;3、最后将满足过滤条件的包输出;4、加上对中断信号的处置,各种统计Counter等其他特性;举例来说,翻开Eth0设备,循环

2、抓包,最初获得eth frame,用eth_decode函数处置,获得帧的src_mac、dest_mac、type和data字段,其中data字段里是上层协议数据。然后根据type字段指示的上层协议类型,对data字段的值运用相应的解码函数,如type是“0 x0800,那么阐明这个以太帧里面是IP包对应就是以太帧的data字段,用ip_decode函数处置这个字段,继而获得这个IP包中的各个字段,同理它的data字段就是IP层的上层协议包的内容,又IP包中的proto字段指示四层协议的类型,如IP的proto字段是6,那么阐明四层是TCP协议,那么就对IP包data字段运用tcp_deco

3、de函数进展解析,依此类推。综上,每层协议头中必定定义了某个字段如eth.type,to,ppp.code, etc.指示如何解析该层携带的上层数据包data。详细解码做法就是参考协议的RFC文档,运用unpack逐层解码、计算生成每层相关字段。当编写某个协议的解码函数时,可以参考下面几个decode函数,其中关键是unpack的运用,由于是解析网络中的数据包,当然运用网络字节顺序来unpack,常用下面几个字符:N - 32bits 网络字节顺序n - 16bits 网络字节顺序C - 8bits 网络字节顺序a - 恣意二进制对于非整字节的字段如4bits和13bits等,按C

4、或n获得整字节后移位获得,如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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Identificatio

5、n |Flags| Fragment Offset | -nn +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Time to Live | Protocol | Header Checksum | -CCn +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Address | -N +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

6、-+ | Destination Address | -N +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Options | Padding | $fields$_ = $values$_ (0.$#fields); #Extract bit fields $ippkt_ref-ver = ($ippkt_ref-tmp & 0 xf0) 4; $ippkt_ref-hlen = $ippkt_ref-tmp & 0 x0f; $ippkt_ref-flags = $ippkt_ref-foffset 1

7、3; $ippkt_ref-foffset = ($ippkt_ref-foffset & 0 x1fff) 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 addresses to dotted quad notation $ippkt_ref-src_ip = to_dotquad($ippkt_ref-src_ip); $ippkt_ref-dest_ip

8、 = to_dotquad($ippkt_ref-dest_ip); undef $ippkt_ref-tmp; return $ippkt_ref;-Packet Decoders eXamples-#Packets decoderssub 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

9、$_ (0.$#fields); #Convert MAC addresses to hex string to avoid representation 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_

10、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

11、 my $packet = shift; my $ppppkt_ref = ; my fields = qw/code id length data/; my values = unpack(ccna*, $packet); map $ppppkt_ref-$fields$_ = $values$_ (0.$#fields); if($ppppkt_ref-code = m/1-4/) $ppppkt_ref-type = unpack(c, $ppppkt_ref-data); my fields; fields = qw/type length MRU data/ if($ppppkt_r

12、ef-type = PPP_TYPE_MRU); fields = qw/type length auth data/ if($ppppkt_ref-type = PPP_TYPE_AUTHPROTO); fields = qw/type length quality data/ if($ppppkt_ref-type = PPP_TYPE_QUALPROTO); fields = qw/type length magic data/ if($ppppkt_ref-type = PPP_TYPE_MAGICNUM); my values = unpack(ccna*, $ppppkt_ref-

13、data); map $ppppkt_ref-$fields$_ = $values$_ (0.$#fields); if($ppppkt_ref-code = PPP_CODE_ECHOREQ or $ppppkt_ref-code = PPP_CODE_ECHOREPLY) my fields = qw/magic data/; my values = unpack(Na*, $ppppkt_ref-data); map $ppppkt_ref-$fields$_ = $values$_ (0.$#fields); return $ppppkt_ref;sub ip_decode my $

14、packet = shift; my $ippkt_ref = ; my fields = qw/tmp tos len id foffset 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 & 0 xf0) 4; $ippkt_ref-hlen = $ippkt_re

15、f-tmp & 0 x0f; $ippkt_ref-flags = $ippkt_ref-foffset 13; $ippkt_ref-foffset = ($ippkt_ref-foffset & 0 x1fff) 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 addresses to dotted quad notation $ippkt_ref-src_

16、ip = to_dotquad($ippkt_ref-src_ip); $ippkt_ref-dest_ip = to_dotquad($ippkt_ref-dest_ip); undef $ippkt_ref-tmp; return $ippkt_ref;sub icmp_decode my $packet = shift; my $icmppkt_ref = ; my fields = qw/type code cksum data/; my values = unpack(CCna*, $packet); map $icmppkt_ref-$fields$_ = $values$_ (0

17、.$#fields); return $icmppkt_ref;sub tcp_decode my $packet = shift; my $tcppkt_ref = ; my fields = qw/src_port dest_port seqnum acknum tmp winsize cksum urg options/; my values = unpack(nnNNnnnna*, $packet); map $tcppkt_ref-$fields$_ = $values$_ (0.$#fields); #Extract flags $tcppkt_ref-hlen = ($tcppkt_ref-tmp & 0 xf000) 12; $tcppkt_ref-reserved = ($tcppkt_ref-tmp & 0 x0f00) 8; $tcppkt_ref-flags = $tcppkt_ref-tmp & 0 x00ff; #Decode variable length header and remaining data my $olen = ($tcppkt_ref-hlen - 5) ? ($tcppkt_ref-hlen - 5) * 4 : 0; ($tcppkt_ref-options, $tcppkt_ref-data) = unpack(a.$ol

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论