wireshark源码分析问题这几天在看wireshark(ethereal)源代码。看源代码的主要兴趣点是它的分析模块(dissect)。分析之后他的数据存在哪儿,怎么打印的(-V参数)。我想把分析后的数据,提取出来,存在自己定义的数据结构里面,或者按我自己的格式写入文本中。
看了几天,对一些数据结构,似懂非懂,一些流程也是似懂非懂。可能由于经验不足的原因,搞来搞去就在几个函数,结构体里面打转。好几次以为找到切入点,发现又回来原来的起点。
这两天看晕了。有点打击,水平太差劲了。。呵呵。先这边问问,看看有没有熟悉的朋友。指点一下。先谢谢了。
这样问问题可能太细了。感觉也不大合适。
1. 我应该如何来看代码?如何找到突破点?
2. 有wireshark有了解的朋友,说说你们关于源码剖析的体会。
3. 说什么都可以,朋友觉得对我有用,有启发就好。千万别 “我顶,UP啊”。呵呵:emn23:我觉得重要的是看
pcap库 本帖最后由 peidright 于 2010-04-02 16:36 编辑
楼上说得对!。
看源代码之前,问下你自己,看代码的目的是什么?
对于 wireshark 来说,你是想学他写界面? 还是抓包? 还是业务逻辑?
界面的话,wireshark 还行
抓包的话,应该看pcap库
业务逻辑的话。不应该看wireshark,看tcpdump.看下啊,:em03:看看这个也许对你有帮助
添加一个基础的RDP解析器
下面我们将循序渐进地设计一个基础的RDP解析器。它依次包含如下构成要素:
包类型字段(占用8比特位,可能的值为:1,初始;2,终结;3,数据);
标志集字段(占用8比特位:0x01,开始包;0x02,结束包;0x04先包);
序列号字段(占用16比特位);
1. 创建解析器
首先您需要选择解析器的类型:内置型(包含在主程序中)或插件型。 插件是容易编写的,先做一个插件型解析器吧。
例1. 解析器初始设定.
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include
#include
void proto_register_rdp();
void proto_reg_handoff_rdp();
static void dissect_rdp(tvbuff_t *tvb,packet_info *pinfo,proto_tree *tree);
static int proto_rdp=-1;
static dissector_handle_t rdp_handle;
static gint ett_rdp = -1;
define TCP_PORT_RDP 3389
void proto_register_rdp(void)
{
proto_rdp=proto_register_protocol( "RDP Protocol", "RDP", "rdp");
}
现在来逐一分析这段代码。首先我们有一些常规的包含文件,最好依惯例在文件开始包含进来。随后是一些函数的前置声明,我们稍后定义它们。
接下来我们定义了一个整型变量"proto_rdp"用于记录我们的协议注册信息。它被初始化为"-1",当解析器注册到主程序中后,其值便会得到更新。这样做可保证我们方便地判断是否已经做了初始工作。将所有不打算对外输出的全局变量和函数声明为"static"是一个良好的习惯,因为这可以保证命名空间不被污染。通常这是容易做到的,除非您的解析器非常庞大以致跨越多个文件。
之后的模块变量"TCP_PORT_RDP"则包含了协议使用的TCP端口号,我们会对通过该端口的数据流进行解析。
solaris10下proc编译问题
>紧随其后的是解析器句柄"rdp_handle",我们稍后对它进行初始化。
至此我们已经拥有了和主程序交互的基本元素,接下来最好再把那些预声明的函数定义一下,就从注册函数"proto_register_rdp"开始吧。
首先调用函数"proto_register_protocol"注册协议。我们能够给协议起3个名字以适用不同的地方。全名和短名用在诸如"首选项(Preferences)"和"已激活协议(Enabled protocols)"对话框以及记录中已生成的域名列表内。缩略名则用于过滤器。
下面我们需要一个切换函数。
例2. 解析器切换.
void proto_reg_handoff_rdp(void)
{
static gboolean initialized=FALSE;
if(!initialized)
{
rdp_handle = create_di
1