Chinaunix首页 | 论坛 | 博客
  • 博客访问: 421356
  • 博文数量: 101
  • 博客积分: 1547
  • 博客等级: 上尉
  • 技术积分: 1072
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-12 23:46
个人简介

music,code,dialog,rest

文章分类

全部博文(101)

文章存档

2023年(8)

2022年(25)

2021年(6)

2020年(2)

2019年(6)

2018年(4)

2017年(5)

2016年(20)

2015年(4)

2014年(2)

2013年(1)

2012年(1)

2011年(1)

2010年(1)

2009年(2)

2007年(10)

2006年(3)

分类: 网络与安全

2007-06-04 15:20:54

WildPackets解码器语言参考 中文版,第一部分

 

简介

 

本文是WildPacket产品中使用的数据包解码语言的指南。这里描述的语言使用户能够扩展已经提供的协
议解码器或创建新的协议解码器。我们已经为显示数种介质类型的网络帧数据特别开发了一种简化的解释性语
言。 语言包含展示数据的指令、控制流程指令、数据值操作指令和条件执行指令。解码器文件的格式,是各条
指令和结果的详细描述,并在其中还讨论了创建解码器文件需要的工具。
 
 
概述
 
对一种协议的解码是通执行一种解码器的集合来完成的。 每一个解码器是唯一命名的,并在其
中包含了一系列解码指令。解码过程的一个重要部分就是从解码连接到其他解码器的能力。这
样就允许一种模块化的设计,并消除了在对不同数据包相同初始层的解码时,对解码器重建的
需要。一个文件中的解码器可以调用来自于其他文件中的解码器。
 
 
解码过程跟随协议的层次自底向顶进行,当到达协议层时,解码器会调用相应的其他解码器,
并将解码进程移交给它们。
 

每个解码器是一条或多条指令的组合。多数指令由解码指令、值、一些可选项和字串组成。当用户开始解析一

个数据包,解码管理器被调用并附有一个指向数据包第一个字节的指针。当解码指令被执行时,该指针将根据

指令的类型被增加,并准备执行下一条指令。包中的数据被指令处理,并可以存储在全局变量或本地变量中。

 

也可以这样说,指向包数据的指针和解码器指令对包中一个或多个字节进行操作,指针随操作而移动。在某些

情况下,指令也可以仅对字节中的比特位进行操作。

 

当解码管理器运行完所有解码指令,它将以一般的数据格式显示剩下的包数据。 根据介质类型,最后的剩余字
节被保留作FCS处理(4字节, EthernetWireless)或不作保留(0 字节, Token Ring)。如果解码管理器在指令
执行完前就处理完所有包数据,会显示一个出错消息,通知用户没有足够的包数据可供处理。然而,在某些情
况中使用不同类型的指令,可以在处理完包数据前或产生无限循环前预扫描或预处理得知。
 
 
指令
 
解码器是一条或多条指令的序列。 一条典型的指令有 一个类型、一个值、一个选项、一个数据格式、一个标
签格式和一个字串(可以为空)
 

 

Type

一个四个字符代码标识的解码指令

Value

带符号的32bit值。高2bit为一些特定指令提供选项。

Global

带符号的32bit值。高26bit为一些特定指令提供选项,低5位表示全局变量数组的索引。

Data Style

1字节值,包含文本位置和格式的字段。

Label Style

1字节值,包含文本位置、格式和新行选项的字段。

String

ASCII字串被用作标签/另一个解码器的名字/字串数组名字。

 
 
 

基本的说,单个解码器指令的意图是通过一个标签或一个值来提供足够的信息。解码指令还包含标签和数据的

格式信息。当然没有必要在每条指令中同时有标签和数据,有些解码指令仅仅对数据进行操作并不显示标签或

数据,或仅仅控制指令的执行流程:如测试分支,子程序调用等。

 

 

全局变量

 

解码器可以访问32bit字的全局区域,可以将以后用到的信息存储在那里。全局中还有一个隐含的Boolean型变

量,给测试指令使用。

这些全局变量提供解码器使用包前部数据处理包后部数据时使用。

 

Bit(s)

含义

0x00000040

全局变量的本地标志

0x00000080

值的寄存器标志位

0x00000100

上次测试位(仅用于TEQU指令集)

0x00080000

常量值标志位

0x0FF00000

跳过位的数目

0x20000000

跳过标志位

0x40000000

分支标志位

0x80000000

排错器中断

 
 

本地变量

 

解码器可以访问32bit长字的本地变量,这样可以将在特定的解码器内部以后要使用的信息存储在那里。这些本

地变量提供使用由解码器前部产生数据的能力。要使用本地变量代替设置MSB 你可以代替设定2nd MSB

看下的例子,加 3 到本地变量 2 注意:你只能移动全局变量到本地变量。

 

ADDG 3 42; * 加 3 到本地变量 2
ADDG 3 82;* 加全局变量3 到 本地变量 2 (译者注:此处经验证应为全局变量2)
ADDG 40000003 c2; *加本地变量3 到本地变量 2

 

就象给出的指令,全局域将决定那个本地变量被用在操作中。例如,在读取包中两个字节后,你可能希望在以

后使用它,所以将它存储在本地变量3中。
 
 
前次测试
 
 
几个解码器指令用于在其他条件指令中执行测试任务。例如,一个指令可以将包数据和一个值,或一个值和全
局变量进行比较,然后接下来一个指令可以有条件的显示一个字串或转向到另外一个解码器。解码器机制保持
对测试状态的跟踪。查看指令描述中的相关功能的指令。这里有一个例子:
 

void Test;
  MOVE 2 1; * move 2 into g2
  SEQU 2 1; * is 2 == g1 ?
  SKIP 1;
    LABL -They are not equal;
  TRTS

 下面是这个例子的一个变化,它使用ENDS代替了指明需要跳跃的步数。
 

void Test;
  MOVE 2 1; * move 2 into g2
  SEQU 2 1; * is 2 == g1 ?
   SKIP;
    LABL -They are not equal;
   ENDS;
   TRTS;

 
 
 
另一个例子是在 SEQU指令中设定了跳跃标志位(skip bit), 指示指令跳跃到ENDS指令。其他情况,如果测试结
果是“真”,则代码段被执行。
在上面的例子中,跳跃标志位是全局变量中的第三个特定高标志位。支持跳跃标志位的指令有所有S开头的指
令,包括 SEQUSNEQSLTESGTE SBIT
 
 
字串数组
 
另一个解码器主要功能是字串数组,引用在这里,用“str#resources 表示(因为他们使用字串“str#”标识)
字串数组由唯一的名字标识。并由以1开始的索引定位的字串列表组成。索引字串数组提供它们自己的索引。解
码器能从包数据中析出数据,利用字串数组可以进行数学计算、或还可以从数组中显示字串或调用在数组中指
定的函数。
 
 
字串数组由小写字串 str#”并跟上唯一名字标识。每个数组中的字串在一行中显示并由分号终结。 这里是一
个例子:
 

str# MyStrings;
  String1;
  String2;
  String3;
  ;
  String5;
  String6;

 
 
上面的字串数组按照线性方法访问。仅由一个分号的行表示一个空串。 一个字符数组的变化是索引化的字符数
组。这种类型的数组允许指定一个特定的16进制值为索引,跟一个”|,后还跟一个字串。这里是一个例子:
 
 

str# MyStrings2;
  1 | String1;
  5 | String5;
  8 | String8;
  9 | String9;

 另外一个变种是混合字串数组,它包含索引化和非索引化的成员。这里是一个例子:

str# MyBitStr;
  3 | 1... Bit 3 is set;
      0... Bit 3 is not set;
  2 | .1.. Bit 2 is set;
      .0.. Bit 2 is not set;
  1 | ..1. Bit 1 is set;
      ..0. Bit 1 is not set;

 上面例子中的这种字串数组被用于BST指令中。
 
文件格式
 
解码器以文本文件的形式存储在和主程序相邻的目录中。在MacOS中,目录名称叫“Packet Decoders”;在
Windows中,是“Decodes”。单个解码器用小写字串“void”后跟一个唯一的名字来标识。单个指令用这样的
格式表示:[指令] [值] [全局变量] [数据格式] [标签格式] [字串],这里每个元素由Tab或一个或多个空格分隔。

每行由分号终结。这里是一个例子:

void FTP;
  TEQU 0 10 0 30 FTP No Cmd Data;
  TLTE 5dc 10 0 30 FTP No Cmd Data;
  LABL 0 0 0 b1 FTP Control - File Transfer Protocol;
  TNXT 0 0 0 0 FTP Cmd or Reply; **

 
同样的函数还可以写成这样:

void FTP()
  {
     TEQU( 0, g[0x10], 0, 0x30, "FTP No Cmd Data");
     TLTE( 0x5dc, g[0x10], 0, 0x30, "FTP No Cmd Data");
     LABL( 0, 0, 0, 0xb1, "FTP Control - File Transfer Protocol");
     TNXT( 0, 0, 0, 0, "FTP Cmd or Reply");
  }

 
上面的例子,在小括号中的是参数。在使用小括号时,数字默认以十进制表示。带前缀0x的数字表示16进制。
全局变量和本地变量分别使用g[ ]和 l[ ]数组表示。
 
以“*”号开始的行被忽略,可以用于注释。
**注意:符号“-”,可以被用来代替四个都是零的参数,例如:
 

TNXT -FTP Cmd or Reply;
可替代为
TNXT 0 0 0 0 FTP Cmd or Reply


TSUB指令已变成对子程序的隐性调用。没必要将TSUB作为指令放在子程序名前面。例如,原来习惯这样用:

TSUB 0 0 0 0 Foo;
或:
TSUB -Foo;
可以简化为:
Foo

 
标明TSUB仍然可以工作,但不是必须的。
 
 
Zenith
2007/6/5
阅读(3092) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~