wireshark编译&基于openflow1.3协议开发

来源:互联网 发布:扑克牌记忆训练软件 编辑:程序博客网 时间:2024/05/09 18:08

基于wireshark的openflow1.3二次开发(协议拓展)


一、编译

1.1编译前言

本来按照一个中文博客的过程走的,过程本没有错误,只是是多年以前的流程,所需要的软件已经不一样了,,,各种软件也是自己下的,发现过程中少了这个少了那个,随便从网上搜的一些***.dll文件就放到了相应的路径下,环境变量也是设置了好久,对于此类事情也很少接触,折腾了好久好久,总是出问题,觉得做了那么久再按照官网的step by step还要重新卸载重新下载,不甘心,但是心都累了,还是错误重重,,,,这个时候,朋友们,感觉不对的话一定要果断放弃啊,憋学我,整个人都不好了,不是大神一定要按照官方的来!!!!!官方教程可以让你少走一些弯路。

首先声明本人电脑x86、64位。切记:不同系统可能所需东西各有不同。

https://www.wireshark.org/docs/wsdg_html_chunked/ChSetupWin32.html

上边网址的2.2.Win32/64: Step-by-Step Guide中有编译过程所需的所有细节。参照这个过程正常的话可以顺利编译成功。

注:Chocolately,就类似于Linux的apt –get,是不用必须安装的。

以下为编译主要流程:(按照官方教程即可)

1.2安装所需软件:

1.2.1 Microsoft Visual Studio 2013 Community Edition

软件下载网址:http://go.microsoft.com/?linkid=9863608

设置环境变量:(此处凭记忆,如有不周全,网上会有环境变量的具体设置)

INCLUDE=C:\ProgramFiles (x86)\Microsoft Visual Studio 12.0\VC\include;

 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include;

LIB=C:\ProgramFiles (x86)\Microsoft Visual Studio 12.0\VC\lib;

C:\Program Files (x86)\MicrosoftSDKs\Windows\v7.1A\Lib;

Path=C:\ProgramFiles (x86)\Microsoft Visual Studio 12.0\Common7\IDE;

C:\Program Files (x86)\Microsoft VisualStudio 12.0\VC\bin;

 C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools;

1.2.2安装Qt

http://qt-project.org/downloads

默认目录:C:\Qt

如果实在下载不下来可以从网上下载,但是一定要是对的版本,对应你的电脑配置。

1.2.3安装cygwin

http://www.cygwin.com/setup-x86_64.exe

默认目录:C:\cygwin

安装这个软件需要注意了,这个软件需要安装很多插件,但是本项目只是需要其中几个,全部安装会耗费巨大的流量和时间。


在search一栏里依次输入你需要的插件,点击,会快速出现将要安装的对应版本。


1.2.4 安装Python

http://python.org/download/

默认目录:C:\Python27

1.2.5 安装git

此处不再赘述,按照官方的教程进行即可。https://www.wireshark.org/docs/wsdg_html_chunked/ChSetupWin32.html

1.2.6 下载源码

命令行下进入到你想要放置源码的目录,比如


参照下图格式设置环境变量,


也许Python等也是需要设置环境变量的,本人环境变量设置多次,设置比较多的环境变量,不宜作为参考,故如果编译过程中如有意外,请自行酌情设置。

1.3 编译!!!


打开Visual studio tools:


对应你的电脑版本选择对应的命令提示符:我的是x86 。


进入你的安装目录,比如C:\Program Files (x86)\Microsoft VisualStudio 12.0\VC\bin

找到这个直接拖到cmd窗口中,这样:


Enter。。。(这个操作貌似是进行环境变量设置)

在这个命令行里进入你放源码的目录:

输入:nmake -f Makefile.nmake verify_tools

这说明你的各种需要的工具都全了。不要关掉这个命令窗口,接着输入:nmake -f Makefile.nmake setup

下载安装了一些东西,lib库之类。。。

然后:输入 nmake -f Makefile.nmake all 进行编译
如果编译失败:nmake –f Makefile.nmake distclean 清理一下。

编译成功的话,进入你的源码文件夹下会看到这个:


进去:找到这个,你可以使用wireshark抓包了!!!

So happy to seethis!!!

 

1.4可能出现的错误:

verify tool时出错:

不能在lib目录找到current_tag.txt。 解决:手动创建此文件,并根据提示写上内容,一般是一个日期字符串,如2014-10-01 

Qt弄成x64的了(此时官网下的软件迟迟安不上,在网上随便下了个,不对!!!

http://down.tech.sina.com.cn/download/d_load.php?d_id=50400&down_id=4&ip=114.255.40.47这个就ok了)

错误是这个样子的:Qt5Widgets.lib(Qt5Widgets.dll):fatalerrorLNK1112:module machine type 'x64'conflicts with target machine type'x86'

http://down.tech.sina.com.cn/page/50400.html

二、协议开发前言

2.1插件技术

wireshark是开源软件,可以在版权许可下进行二次开发。有三种方式为其添加协议解析(protocol dissection)功能:

  • 内置解析器(build in)
  • 动态链接库形式的插件解析器(plugin)
  • Lua或Python语言的插件解析器(不做介绍)

插件型:构建一个插件(如一个动态链接库),并把自己注册到主程序中,执行解析工作。

插件技术,就是在程序的设计开发过程中,把整个应用程序分成宿主程序和插件两个部分,宿主程序与插件能够相互通信。并且,在宿主程序不变的情况下,可以通过增减插件或修改插件来调整应用程序的功能。运用插件技术可以开发出伸缩性良好、便于维护的应用程序。

内置型:把一个协议解析器编译进主程序中它将一直可用。

插件型和内置型的差异很小,只不过内置型的重构周期比组件型的长很多,同时没有插件型那么灵活。内置型插件只需要把plugin文件夹下对应的selfdefinedprotocol.c编译,然后将生成的***.dll文件复制到指定位置就可以使用添加的插件,而内置型则需要编译整个工程,约花费10分钟(修改代码过程中,如果没有较大错误,可以不进行nmake –f Makefile.nmake distclean清除工作,只用nmake -fMakefile.nmake all,则只对已经修改的代码部分进行编译,大大节省了编译时间)。

2.2wireshark结构框架

只针对本次开发可能用到的方面

文件目录:

                       

epan文件夹负责所有网络协议识别工作,epan/dessector文件夹下是所有的内置型解析器的代码,plugins里面存放了wireshark所有插件型解析器代码,wireshark-gtk2文件夹里面是wireshark的界面部分代码。

Dissectors:在epan/dissector目录下,各种协议解码器(内置型解析器只需将代码放到此目录下编译即可,不过初次编译需要对整个工程进行编译,耗费十分钟左右的时间)

Plugins:一些协议解码器以插件形式实现,源码在plugins目录(插件型解析器代码则放在此目录下,编译时只需要编译此文件夹下你所创建的新协议的文件夹,然后把生成的DLL复制到相应位置,还要添加一些配置文件,因本人并没有成功实施,故不做详细阐述,但是插件型编译耗费时间很短,具有很大的优势,可以尝试)。

2.3 wireshark解析流程

由于OSI的7层协议模型,协议数据是从上到下封装后发送的。对于协议分析需要从下至上进行。首先对网络层的协议识别后进行组包还原然后脱去网络层协议头。将里面的数据交给传输层分析,这样一直进行下去直到应用层。

由于网络协议种类很多,就WireShark所识别的多种协议来说,为了使协议和协议间层次关系明显。从而对数据流里的各个层次的协议能够逐层处理。WireShark系统采用了协议树的方式,如果协议A的所有数据都是封装在协议B里的,那么这个协议A就是另外一个协议B的儿子节点。我们将最低层的无结构数据流作为根节点。那么具有相同父节点的协议成为兄弟节点。那么这些拥有同样父协议兄弟节点协议如何互相区分了?WireShark系统采用协议的特征字来识别。每个协议会注册自己的特征字。这些特征字给自己的子节点协议提供可以互相区分开来的标识。比如tcp协议的port字段注册后。 Tcp.port=21就可以认为是ftp协议, 特征字可以是协议规范定义的任何一个字段。比如ip协议就可以定义proto字段为一个特征字。在WireShark中注册一个协议解析器首先要指出它的父协议是什么。另外还要指出自己区别于父节点下的兄弟接点协议的特征。

比如:

上图1.0-1.4都是wireshark已有的对于openflow协议版本(eg:0x04是openflow1.3的版本号)。0xa4是本次开发所规定的版本号,是对于1.3版本协议的扩展,故可以写为2.3(此处自定义).

比如ftp协议。在WireShark中他的父接点是tcp协议,它的特征就是tcp协议的port字段为21。这样当一个端口为21的tcp数据流来到时。首先由tcp协议注册的解析模块处理,处理完之后通过查找协议树找到自己协议下面的子协议,判断应该由那个子协议来执行,找到正确的子协议后,就转交给ftp注册的解析模块处理。这样由根节点开始一层层解析下去。由于采用了协议树加特征字的设计,这个系统在协议解析上由了很强的扩展性,增加一个协议解析器只需要将解析函数挂到协议树的相应节点上即可。

应用层

HTTP  FTP

表示层

 

会话层

 

传输层

TCP   UDP

网络层

IP

数据链路层

 

物理层

 

2.4本次开发相关(此处包含个人理解,用语或不专业,不妨碍理解。。。)

在本次开发中,wireshark本身已经包括了openflow1.0-1.4的协议解析器,在此基础上直接建立一个内置型插件十分简单,沿用之前版本的程序,将其中的部分代码做修改即可,省去了新建协议解析器dissector的大量工作(你也可以尝试做一个插件型的:插件型和内置型在代码编写上基本没有区别,插件型的好处在于,你每次修改完协议后只需要进入plugin文件夹下,你所创建协议解析器插件的目录下编译然后把编译生成的DLL文件复制到对应的位置即可,节省编译时间,此处因种种原因,用内置型)。

上图为wireshark\epan\dissectors文件夹下openflow相关的源码,其中packet-openflow.c文件包含了所有openflow版本的解码器句柄,对所有版本的openflow协议进行了注册工作。当传输层tcp数据流到来时,进行tcp注册协议的相应模块处理,处理之后找tcp的子协议,根据openflow的端口号判定对应的子协议为openflow协议,然后根据openflow协议的版本号判定数据属于哪个协议版本,然后调用对应协议的源码进行数据的详细解析。

packet-openflow_v1.c

packet-openflow_v4.c

packet-openflow_v5.c

以上分别是openflow1.0、1.3、1.4的解析源码。

 

上图源码为packet-openflow.c中对于所有协议版本的注册,其中openflow_v8是本次开发拟定的标识。

此处解释本次开发为内置插件的原因:开发plugin插件需要对于新建协议的注册工作,以及与父协议相关的衔接代码编写,而我们所进行的开发只是对于openflow1.3的拓展,完全可以基于已有的基础开展工作,减少开发量。(如果开发全新协议则首选为插件型)。

三、协议开发,源码

本节结合对应的实例代码进行阐述。

3.1.1添加节点

工作中的wireshark界面:

此处添加节点的直观效果是,会在wireshark界面内增加一条内容。


上图为wireshark图形界面中本次开发添加的datapath_id。其中port是节点/子树,port下面的各条都是port节点的子节点。

添加一条内容所需添加的代码:

1)  赋初值:

2)  添加条目:

此处代码是在port_tree子树(这个子树在wireshark界面显示为Port)上添加子节点,tvb表示buffer,offset表示当前位置,8表示这个子节点的数据占8字节。这句代码的大意是表示缓存里从offset位置处8字节的数据为datapath_id ,随后offset加8 ,表示如果随后还有子节点,则从这个新的offset位置处开始读取数据。

3)  定义想要显示的内容:


datapath_id字符串将会显示在wireshark界面内,这样:


FT_UINT64表示是64位8字节的数据,BASE_HEX表示用十六进制显示。

openflow_v8.port.datapath_id则会在wireshark界面中的expression选项中显示,如下:


至此,完整的添加了一个子节点。

3.1.2添加子树

本例说明本次开发中添加的一个子树onu feature的过程,添加子树有两种方式,本例只介绍其中一种,各种过程大同小异,此处本文重在阐述主要概念。

效果图:


赋初值:

添加子树:

本句代码大意:给tree树添加一个子树onu_tree,onu_tree下会有datapath_id等子节点,这些子节点一共有24字节的数据,在wireshark图形界面内显示这个子树的名称为onu feature。

绑定ID:

3.2添加dissector

本小节对于前两个例子进行汇总,添加一个简单的dissector,不做详细阐述。

主代码:


在tree树下添加onu_tree子树,在子树下添加各节点。

3.3可能用到的函数

tvb_get_ntohl(tvb,offset)表示从tvb的offset位置读取32位数据复制给type。

tvb_get_ntohs(tvb,offset)表示读取16位。

四、可能出现的错误

本节阐释开发中可能遇到的错误。

1. 子树包含的字节数确保正确(此处onu子树共有24字节的数据)。

2. openflow_v8.multipart_reply.exp_onu_features.datapath_id等字符串前不可出现空格,这是在wireshark软件界面会出现的选项,如有空格,wireshark将会无法识别,造成编译通过软件却打不开(这种错误也就我这种马大哈才会犯的吧233,复制粘贴都做的不到位。。。勤快点自己输入名称也不会有这个天杀的空格。。)


是这样报错的:


0 0
原创粉丝点击