关闭

wireshark插件编程总结

200人阅读 评论(0) 收藏 举报
分类:
   /*
    hf_register_info:可以一个子类型一个这个结构体。
    此结构是一个用于代表协议中用于解析各个字段信息的结构。使用的时候,通常使用数组方式来代表协议中的诸多字段
    我们定义了3个结构,用于表示协议的3个字段,这个数组的结构解释如下
    1) 元素1: 保存标识的引用变量
    赋值列表中,&hf_foo_pdu_type代表取得hf_foo_pdu_type的地址,hf_foo_pdu_type初值必须为-1,后续在对此数组进行注册的时候,
    会对hf_chat_user进行赋值,保存此结构单位的标识
    2) 协议字段名称
    字符串"Type",作为参数传递给此结构,代表在详细信息窗口中,此结构对应的协议字段的名称信息
    3) 过滤器名称
    字符串"foo.type"为一过滤字符串。Wireshark允许针对某一协议进行过滤,可以针对某一协议字段进行过滤。即我们可以在Filter中输入
    foo.type == "Data"的方式来过滤出"数据类型"的数据包
    4) 协议字段类型: 用于标识此协议字段的敏感类型
        4.1) FT_BOOLEAN为一枚举值,表示敏感的协议字段为布尔型 
        4.2) FT_BYTES: 字节型
        4.3) FT_STRING: 字符串型
        4.4) FT_IPv4: IPv4格式
        4.5) FT_UINT16: INT16长整型
    5) 此字段在详细信息中数据的进制显示方式
        5.1) BASE_DEC: 十进制方式显示
        5.2) BASE_HEX: 二进制方式显示
        5.3) BASE_NONE: 普通方式
    6) 此协议字段的值对应的显示内容列表,当目标协议的数据包有不
    同类型的时候会使用到这个字段,我们用VALS宏来把上表与数据的相应
    部分关联起来,这样可以针对不同类型的数据包进行分类
    7) 字段敏感掩码,类型为整数,通常写成十六进制    如:我们需要处理的字段为一个字节的高四位,
    但是前面第四部分索要处理的部分写的是一个字节, 此处我们就可以填入0xf0,来去掉低四 位对相关计算的影响
    8) 保留字段: 填写0、后者NULL均可
    9) HFILL 为一个宏,代表一段固定常用值
    */
<pre name="code" class="cpp"> &hf_foo_flags,
 {
"Flags", "foo.flags",
 FT_UINT8, BASE_HEX, 
 NULL, 0x0, 
 NULL, HFILL
 }
这时我们得到的是:

Flags: 0x04
真实值也是0x04
</pre><pre name="code" class="cpp">当我们设置了字段敏感掩码,
<pre name="code" class="cpp">&hf_foo_flags,
{
 "Flags", "foo.flags",
 FT_UINT8, BASE_HEX, 
 NULL, 0xf0, 
 NULL, HFILL
 }


则相应的位的值不算在内,并且前面会显示所对应的掩码的位的值。
0000 .... = Flags: 0x00
而真实值是0x04


关与结构体tvbuff

struct tvbuff {
	/* Doubly linked list pointers */
	tvbuff_t                *next;

	/* Record-keeping */
	const struct tvb_ops   *ops;
	gboolean		initialized;
	guint			flags;
	struct tvbuff		*ds_tvb;  /**< data source top-level tvbuff */

	/** We're either a TVBUFF_REAL_DATA or a
	 * TVBUFF_SUBSET that has a backing buffer that
	 * has real_data != NULL, or a TVBUFF_COMPOSITE
	 * which has flattened its data due to a call
	 * to tvb_get_ptr().
	 */
	const guint8		*real_data;

	/** Length of virtual buffer (and/or real_data). */
	guint			length;

	/** Reported length. */
	guint			reported_length;

	/* Offset from beginning of first TVBUFF_REAL. */
	gint			raw_offset;
};

其中的real_data指向真是的数据区,其开始就是我们所想要的帧的第一个字节。其为const*,所以我们不能改变其所指内容,但是可以改变他。

因为从guint8 packet_type = tvb_get_guint8(tvb, 0);这个函数的使用就可以看出来。

这个函数时取出real_data缓冲区的第一个字节。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:64595次
    • 积分:1286
    • 等级:
    • 排名:千里之外
    • 原创:47篇
    • 转载:113篇
    • 译文:0篇
    • 评论:1条
    最新评论