wireshark:添加一个基础的解析器

wireshark:添加一个基础的解析器

ID:6378929

大小:72.50 KB

页数:11页

时间:2018-01-12

wireshark:添加一个基础的解析器_第1页
wireshark:添加一个基础的解析器_第2页
wireshark:添加一个基础的解析器_第3页
wireshark:添加一个基础的解析器_第4页
wireshark:添加一个基础的解析器_第5页
资源描述:

《wireshark:添加一个基础的解析器》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、【翻译】Wireshark:添加一个基础的解析器Tag:编程翻译Wireshark·http://www.net-snmp.org/版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://shujiantang.blogbus.com/logs/35855242.html9.2.添加一个基础的解析器下面我们将循序渐进地设计一个基础的解析器。首先我们来虚构一个简单的网络协议“foo”。它依次包含如下构成要素:·        包类型字段(占用8比特位,可能的值为:1,初始;2,终结;3,数据);·        标志集字段(占用8比特位:0x01,开

2、始包;0x02,结束包;0x04,优先包);·        序列号字段(占用16比特位);·        IP地址字段(占用32比特位)。9.2.1.创建解析器首先您需要选择解析器的类型:内置型(包含在主程序中)或插件型。对于初学者来说插件是容易编写的,所以我们还是先做一个插件型解析器吧。温馨提示,解析器由插件型转为内置型是件轻松的事情——所以我们不会因此而失去什么。例9.1.解析器初始设定.#ifdefHAVE_CONFIG_H#include"config.h"#endif#include#include

3、/*forwardreference*/voidproto_register_foo();voidproto_reg_handoff_foo();staticvoiddissect_foo(tvbuff_t*tvb,packet_info*pinfo,proto_tree*tree);staticintproto_foo=-1;staticintglobal_foo_port=1234;staticdissector_handle_tfoo_handle;voidproto_register_foo(void){if(proto_foo==-1){proto_foo=p

4、roto_register_protocol("FOOProtocol",/*name*/"FOO",/*shortname*/"foo"/*abbrev*/);}}现在来逐一分析这段代码。首先我们有一些常规的包含文件,最好依惯例在文件开始包含进来。随后是一些函数的前置声明,我们稍后定义它们。接下来我们定义了一个整型变量“proto_foo”用于记录我们的协议注册信息。它被初始化为“-1”,当解析器注册到主程序中后,其值便会得到更新。这样做可保证我们方便地判断是否已经做了初始工作。将所有不打算对外输出的全局变量和函数声明为“static”是一个良好的习惯,因为这可以保证

5、命名空间不被污染。通常这是容易做到的,除非您的解析器非常庞大以致跨越多个文件。之后的模块变量“global_foo_port”则包含了协议使用的UDP端口号,我们会对通过该端口的数据流进行解析,当然这只是一个假设。紧随其后的是解析器句柄“foo_handle”,我们稍后对它进行初始化。至此我们已经拥有了和主程序交互的基本元素,接下来最好再把那些预声明的函数定义一下,就从注册函数“proto_register_foo”开始吧。首先调用函数“proto_register_protocol”注册协议。我们能够给协议起3个名字以适用不同的地方。全名和短名用在诸如“首选项(Pre

6、ferences)”和“已激活协议(Enabledprotocols)”对话框以及记录中已生成的域名列表内。缩略名则用于过滤器。下面我们需要一个切换函数。例9.2.解析器切换.voidproto_reg_handoff_foo(void){staticgbooleaninitialized=FALSE;if(!initialized){foo_handle=create_dissector_handle(dissect_foo,proto_foo);dissector_add("udp.port",global_foo_port,foo_handle);initiali

7、zed=TRUE;}}这段代码做了什么呢?如果解析器尚未初始化,则对它进行初始化。首先创建解析器。这时注册了了函数“dissect_foo”用于完成实际的解析工作。之后将该解析器与UDP端口号相关联,以使主程序收到该端口的UDP数据流时通知该解析器。至此我们终于可以写一些解析代码了。不过目前我们仅写点儿基本功能占个位置。例9.3.解析.staticvoiddissect_foo(tvbuff_t*tvb,packet_info*pinfo,proto_tree*tree){if(check_col(pinfo->cinfo,COL_PRO

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。