wireshark插件开发总结.docx
- 文档编号:30037316
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:11
- 大小:19.26KB
wireshark插件开发总结.docx
《wireshark插件开发总结.docx》由会员分享,可在线阅读,更多相关《wireshark插件开发总结.docx(11页珍藏版)》请在冰豆网上搜索。
wireshark插件开发总结
Wireshark插件开发总结
一.Windows环境下wireshark编译环境的设置:
<一>.准备好编译wireshark所必须使用到的工具及文件:
1.MicrosoftVisualStudio2010;
2.Cygwin;
3.Python2.7;
4.Wireshark-win32-libs;
5.Wireshark1.6.5源码包;
<二>.配置环境:
1.安装好VS2010,找到vsvars32.bat的路径。
(每次编译开始前,需运行该bat文件,设置好VS2010编译环境)。
我的该bat文件路径为:
F:
\VS2010\Common7\Tools;
2.选择在线或本地安装Cygwin,Cygwin主要是用来在Windows下模拟UNIX系统环境。
在安装过程中,必须保证已安装以下几个包:
a.Archive/unzip
b.Devel/bison
c.Devel/flex
d.Interpreters/perl
e.Utils/patch
f.Web/wget
3.下载并安装Python到默认路径下,我下载的版本为:
Python2.7.2。
4.在http:
//anonsvn.wireshark.org/wireshark-win32-libs/trunk/packages/网站下载编译wireshark所依赖的库文件。
注:
不要解压,将下载的zip包放至C:
\wireshark-win32-libs目录下即可。
5.在wireshark官网下载将编译的源码包,网址为:
http:
//www.wireshark.org/download/src/all-versions/%E4%B8%8A%E4%B8%8B%E8%BD%BD,我下载的版本为1.6.5。
<三>.更改wireshark源码配置文件:
打开wireshark源码所在目录,修改其根目录下的config.nmake文件:
1.VERSION_EXTRA:
这里可以自定义个人版本信息。
2.WIRESHARK_LIBS:
设置编译所依赖的库文件所在目录。
3.PROGRAM_FILES:
设置本机程序安装目录,默认即可。
4.MSVC_VARIANT:
我使用的是VS2010,将MSVC_VARIANT为MSVC2010行的#去掉即可。
5.CYGWIN_PATH:
设置Cygwin的bin目录。
我的bin文件目录为:
D:
\Linux\cygwin\bin。
6.PYTHON及其后的PATH:
将其修改问自己安装的Python文件目录即可。
7.MSVCR_DLL:
用绝对路径修改成自己VS2010的安装目录。
8.MAKENSIS:
该选项为安装程序制作工具,如果没有用#注释掉。
<四>.编译wireshark源码:
在确定上述准备工作已经完成的基础上,打开运行vsvars32.bat文件后,跳转到wireshark源码所在目录,首先通过下面的命令行验证一下:
nmake–fMakefile.nmakeverify_tools,如果有错误的话,可能是变量设置错误或者版本不符合要求,根据错误提示修改相应错误。
然后编译库文件,执行:
nmake–fMakefile.nmakesetup,该命令执行后会将wireshark-libs目录下的库文件解压。
执行:
nmake–fMakefile.nmakedistclean清除其他平台的冗余代码,最后执行:
nmake–fMakefile.nmakeall完成整个编译过程。
执行完上述操作后,打开C:
\wireshark\wireshark-gtk2目录,运行其中的wireshark.exe。
将会看到wireshark的主界面。
至此整个源码编译过程就告一段落了。
二.编写代码:
本文主要的对新添加的Scoreboard协议进行解析,ScoreBoard协议用于更新比分牌的数值的背景颜色,服务端监听UDP1127端口,客户端端口任意。
报文格式
每个报文的前16字节是固定的识别符identifier:
e2cbb580cb094ebaa36bf607ce953f2b
第17字节表示报文类型operator:
∙00get-value获取比分数值
∙01set-value设置比分数值
∙80resp-value应答比分数值
∙10get-color获取背景色
∙11set-color设置背景色
∙90resp-color应答背景色
数据部分:
∙01、80类型的报文
o第18~21字节为左边的比分数值(32位无符号整数,bigendian)
o第22~25字节为右边的比分数值(32位无符号整数,bigendian)
∙11、90类型的报文
o第18字节为红色分量
o第19字节为绿色分量
o第20字节为蓝色分量
在plugins文件夹下新建scoreboard目录,在该目录下新建packet-scoreboard.c文件,代码内容如下:
#ifdefHAVE_CONFIG_H
#include"config.h"
#endif
#include
staticvoiddissect_scoreboard(tvbuff_t*tvb,packet_info*pinfo,proto_treetree);
staticintproto_scoreboard=-1;
staticinthf_scoreboard_id=-1;
staticinthf_scoreboard_cmd=-1;
staticinthf_scoreboard_score_left=-1;
staticinthf_scoreboard_score_right=-1;
staticinthf_scoreboard_color_red=-1;
staticinthf_scoreboard_color_green=-1;
staticinthf_scoreboard_color_blue=-1;
staticgintett_scoreboard=-1;
staticconstvalue_stringnames_cmd[]={
{0x00,"requestscore"},
{0x01,"setscore"},
{0x80,"responsescore"},
{0x10,"requestcolor"},
{0x11,"setcolor"},
{0x90,"responsecolor"},
{0,NULL}
};
voidproto_register_scoreboard(void)
{
statichf_register_infohf[]={
{&hf_scoreboard_id,{
"ScoreBoardID","scoreboard.id",FT_BYTES,
BASE_NONE,NULL,0,NULL,HFILL}},
//FT_BYTES仅能为BASE_NONE方式显示
{&hf_scoreboard_cmd,{
"Command","scoreboard.cmd",FT_UINT8,
BASE_HEX,VALS(names_cmd),0,NULL,HFILL}},
//VALS()宏,仅进行类型转换
{&hf_scoreboard_score_left,{
"ScoreLeft","scoreboard.sleft",FT_UINT32,
BASE_DEC,NULL,0,NULL,HFILL}},
{&hf_scoreboard_score_right,{
"ScoreRight","scoreboard.sright",FT_UINT32,
BASE_DEC,NULL,0,NULL,HFILL}},
{&hf_scoreboard_color_red,{
"ColorRed","scoreboard.r",FT_UINT8,
BASE_HEX,NULL,0,NULL,HFILL}},
{&hf_scoreboard_color_green,{
"ColorGreen","scoreboard.g",FT_UINT8,
BASE_HEX,NULL,0,NULL,HFILL}},
{&hf_scoreboard_color_blue,{
"ColorBlue","scoreboard.b",FT_UINT8,
BASE_HEX,NULL,0,NULL,HFILL}},
};
staticgint*ett[]={
&ett_scoreboard
};//我们只需要一个子树,显示分值与颜色分量
proto_scoreboard=proto_register_protocol("ScoreBoardProtocol",
"ScoreBoard",
"scoreboard");
proto_register_field_array(proto_scoreboard,hf,array_length(hf));
proto_register_subtree_array(ett,array_length(ett));
}
voidproto_reg_handoff_scoreboard(void)
{
dissector_handle_tscoreboard_handle;
scoreboard_handle=create_dissector_handle(dissect_scoreboard,proto_scoreboard);
dissector_add("udp.port",1127,scoreboard_handle);
}
staticvoiddissect_scoreboard(tvbuff_t*tvb,packet_info*pinfo,proto_tree*tree)
{
intoffset=0;//偏移变量,记录偏移位置
col_set_str(pinfo->cinfo,COL_PROTOCOL,"ScoreBoard");//显示协议
col_clear(pinfo->cinfo,COL_INFO);
if(tree){
guint8cmd_result=0;//用于保存获取到的操作类型值
proto_item*ti=NULL;//方便添加结点而定义
proto_tree*tt=NULL;//方便添加结点而定义
ti=proto_tree_add_item(tree,proto_scoreboard,tvb,0,-1,FALSE);//添加结点
tt=proto_item_add_subtree(ti,ett_scoreboard);//添加子树,用以显示数据
proto_tree_add_item(tt,hf_scoreboard_id,tvb,offset,16,FALSE);offset+=16;
proto_tree_add_item(tt,hf_scoreboard_cmd,tvb,offset,1,FALSE);
cmd_result=tvb_get_guint8(tvb,offset);offset+=1;//获取操作类型
switch(cmd_result)
{
case0x00:
case0x01:
//添加左边比分结点
proto_tree_add_item(tt,hf_scoreboard_score_left,tvb,offset,4,FALSE);
offset+=4;
//添加右边比分结点
proto_tree_add_item(tt,hf_scoreboard_score_right,tvb,offset,4,FALSE);
offset+=4;
break;
case0x80:
proto_tree_add_item(tt,hf_scoreboard_score_left,tvb,offset,4,FALSE);proto_tree_add_item(tt,hf_scoreboard_score_right,tvb,offset,4,FALSE);
offset+=4;
break;
case0x10:
case0x11:
//添加颜色分量结点
proto_tree_add_item(tt,hf_scoreboard_color_red,tvb,offset,1,FALSE);
offset+=1;
proto_tree_add_item(tt,hf_scoreboard_color_green,tvb,offset,1,FALSE);
offset+=1;
proto_tree_add_item(tt,hf_scoreboard_color_blue,tvb,offset,1,FALSE);
offset+=1;
break;
case0x90:
proto_tree_add_item(tt,hf_scoreboard_color_red,tvb,offset,1,FALSE);
offset+=1;
proto_tree_add_item(tt,hf_scoreboard_color_green,tvb,offset,1,FALSE);
offset+=1;
proto_tree_add_item(tt,hf_scoreboard_color_blue,tvb,offset,1,FALSE);
offset+=1;
break;
default:
break;
offset+=4;
}
}
}
至此协议解析代码部分编写完成。
三.插件的插入及编译:
1.在自己编写的插件目录(scoreboard)下,放入以下文件:
AUTHORS
COPYING
ChangeLog
CMakeLists.txt
Makefile.am
Mmon
Makefile.nmake
moduleinfo.h
moduleinfo.nmake
plugin.rc.in
这些文件,可以从plugins/gryphon/目录下拷贝,然后在对其修改。
具体修改步骤参考后面2,3步骤。
Wireshark文件介绍:
Makefile.am:
这个是UNIX/Linux平台下的makefile模板。
Mmon:
这个文件包含了内置插件所依赖的文件。
Makefile.nmake:
这个文件是Windows平台下WireShark内置插件的makefile。
moduleinfo.h:
内置插件的版本信息。
moduleinfo.nmake:
Windows平台下DLL的版本信息。
plugin.rc.in:
Windows平台下的DLL资源模板。
2.修改本目录下的相关文件:
(1).将makefile.am文件中的gryphon单词全部替换成scoreboard。
(2).mon文件中的变量DISSECTOR_SRC中,需要将自己插件会导出,register_*()和handoff_*()的主要的源代码文件列入,本例中即packet-scoreboard.c。
(3).moduleinfo.h文件中,将版本号改为自己需要的版本号即可.
(4).moduleinfo.nmake文件中,仅需改动版本号,但要和前一步的版本号相同。
(5).plugin.rc.in文件是windows下编译使用的资源文件,用于添加给dll
文件的特定信息。
(6).修改mon文件中的PLUGIN_NAME为scoreboard。
3.修改自己插件目录以外的文件:
(1).plugins/Makefile.am文件中,需要将自己插件所在的目录(本例中为scoreboard)添加入SUBDIRS变量中。
(2).在最顶层的Makefile.am中,添加dlopenplugins/scoreboard/scoreboard.la语句到plugin_ldadd中。
(3).在最顶层的configure.in文件中,添加plugins/scoreboard/Makefile语句到AC_OUTPUT规则中。
(4).在epan/Makefile.am文件中添加../plugins/scoreboard/packet-scoreboard.c到plugin_src中。
(5).在packaging/nsis/Makefile.nmake文件中,给PLUGINS变量添
加../../plugins/scoreboard/scoreboard.dll。
(6).在packaging/nsis/wireshark.nsi文件中,在DissectorPlugins区块中,给File声明添加如下语句:
File“..\..\plugins\scoreboard\scoreboard.dll”。
(7).修改plugins/Makefile.nmake,在PLUGIN_LIST下添加scoreboard目录。
四.执行编译及测试:
在“开始”中的VisualStudio2010CommandPrompt黑框中手动编译,先把路径设置
为wireshark\plugins\你的协议下,然后依次输入以下的命令行:
nmake-fMakefile.nmakedistclean(删除其他平台的冗余代码),nmake-fMakefile.nmakeall(编译插件)。
编译Wireshark如果正常的话,会在你的协议的目录下生成插件的.DLL文件,如果有错误的话,在黑框框中会有相应的提示。
把你的DLL文件拷贝到你wireshark的安装目录下的plugins文件夹下,例如我的是:
C:
\wireshark-1.6.5\wireshark-gtk2\plugins\1.6.5然后重启wireshark.exe,进行抓包测试,看wireshark能否正确解析,如果有问题,再修改你的解析代码。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- wireshark 插件 开发 总结