wireshark 1.10.0 编译 及 协议解析部分的一些变化
wireshark不久前升级到1.10.0稳定版,这个版本正如其版本号一样,相比1.8.x有较大变化。
我们先说说在windows下编译的问题,1.8.4/1.8.6版本的编译见我的文章:http://www.cnblogs.com/zzqcn/archive/2013/04/23/3039110.html,这是重要的参考。更早的版本编译也是大同小异。这里要说一句,我在网上搜到的wireshark Windows下编译貌似全是我写的,csdn上那个blackboyofsnp也是我。
编译时的操作系统是Windows 7 32bit, 编译器是Visual C++ 2012,并带有Windows SDK v7.1。
1. 神马?VC++ 2012?? 没错,1.10.0终于支持VC++2012了,这是我发现的最大亮点。我终于不用为了编译它而在电脑上装多个版本的VS了,而且避免了CRT冲突的问题。
2. wireshark 1.10.0在Windows下的编译需要<Windows SDK>/include目录中的win32.mak文件,正好我装了Windows SDK 7.1,于是在编译之前的环境配置批处理脚本中加入了下面这一句:
set INCLUDE=%INCLUDE%;C:\Program Files\Microsoft SDKs\Windows\v7.1A\Include
此时我的bat脚本内容如下所示:
@echo off set PATH=%PATH%:.
set PATH=%PATH%;d:\dev\cygwin\bin set INCLUDE=%INCLUDE%;C:\Program Files\Microsoft SDKs\Windows\v7.1A\Include echo 设置 Visual Studio environment...
"C:\Program Files\Microsoft Visual Studio 11.0\Common7\Tools\vsvars32.bat" title Command Prompt (MSVC++ 2012)
是的,除了以上的1,2之外,其他应该没啥变化了,照以前的编译方法编译即可。提示:注意debug/release版本和CRT版本哦,见config.nmake文件的LOCAL_LDFLAGS=/DEBUG这一行。
接下来说说1.10.0版本和动态调用libwireshark.dll协议解析库有关的一些变化。
1. 废弃了原来的/epan/libwireshark.def文件和WS_VAR_IMPORT(这个定义在\wireshark-1.8.x/CMakeLists.txt中),而是采用一种叫做C++ Visibility的技术,这种技术其实我也不懂啦,我只觉得Visibility, Niubility,傻傻分不清楚。。。 学有余力的同学请参考 http://gcc.gnu.org/wiki/Visibility。相关的宏定义在/ws_symbol_export.h中。
这会影响到我们调用时头文件的一些声明,我建议在wireshark调用函数声明所在的头文件的最上面,#include ws_symbol_export.h。比如:
#if WIRESHARK_VERSION == WIRESHARK_1_10_0
#include "ws_symbol_export.h"
#elif (WIRESHARK_VERSION == WIRESHARK_1_8_6 || WIRESHARK_VERSION == WIRESHARK_1_8_4)
// see \wireshark-1.8.4\CMakeLists.txt, #481
#define WS_VAR_IMPORT __declspec(dllimport) extern
#else
#error 不支持此版本的wireshark
#endif
2. 解析器执行函数epan_dissect_run()的第2个参数从void* pseudo_header改为struct wtap_pkthdr *phdr,这可是核心函数啊啊啊。。。必须要改,而且要多#include一个/wiretap/wtap.h。在你自己程序的具体调用的代码中,也要初始化好这个结构哦
3. (不关心IP地址查询的同学可能不需要关心第3点。但注意一下是好事)GeoIP模块的初始化不再放在epan_init()中,而是使用一个不可见的回调函数geoip_db_post_update_cb来自动更新GeoIP配置。ChangeLogs里有几个blablabla地注释了一通这种方法的好处,比如配置选项更新后不需要立即重启wireshark就可使改动生效。可尼玛苦了我了。
【以下说法可能不准确,但我确实遇到这问题。】这个改动会造成以下后果:如果你自己的调用程序(也就是调用libwireshark.dll进行解析的程序啦)所在电脑上也安装了wireshark原版,而且wireshark中的GeoIP选项(在Edit/Preferences菜单->Name Resolution->GeoIP database directories)设置了的话,可能会使你的程序只能解析到IP层,就导致运行时断言失败而返回,因为GeoIP相关的指针非法。
做为第3方调用程序,我们无法执行到回调函数。为此我HACK了wireshark源码,在/epan/geoip_db.h & .c中添加了一个导出函数geoip_update_force(),在其中调用geoip_db_post_update_cb,源码如下:
geoip_db.h
/*
* Hacked by blackboycpp, 2013/06/22
*
* for GeoIP bug in wireshark 1.10.0, becaz my app can't call the update callback
*/
WS_DLL_PUBLIC void geoip_update_force(void);
geoip_db.c
// 定义在geoip_db_post_update_cb()下面
void geoip_update_force(void)
{
const gchar* err;
uat_load(geoip_db_paths_uat, &err);
geoip_db_post_update_cb();
}
改完后编译自己的libwireshark.dll。这也意味着你的程序将无法使用原版的libwireshark.dll,因为你改了嘛。
最后记得在你程序的init_dissection()执行之前(或之后??)调用一下我们HACK上去的这个geoip_update_force()函数。
wireshark 1.10.0 编译 及 协议解析部分的一些变化的更多相关文章
- 使用 lua 编写 wireshark 协议解析插件
一.平台 操作系统:windows 7 wireshark:1.10.3 lua:5.1 二.准备 lua 语言基本语法,特别是关于表操作和循环 wireshark 文档,包括用户使用文档和开发者文档 ...
- 非寻常方式学习ApacheTomcat架构及10.0.12源码编译
概述 开启博客分享已近三个月,感谢所有花时间精力和小编一路学习和成长的伙伴们,有你们的支持,我们继续再接再厉 **本人博客网站 **IT小神 www.itxiaoshen.com 定义 Tomcat官 ...
- 在vs2010中编译log4cxx-0.10.0详细方法
本文一共包含了17个步骤,按照下面的步骤就可以完成vs2010中编译log4cxx的工作了. 1. 下载 log4cxx 以及 apr 和 apr-util 源码: a) http://www.apa ...
- 在vs2010中编译log4cxx-0.10.0具体方法(从下载、编译、解决错误具体介绍)
一. 简单介绍 log4cxx是Java社区著名的log4j的c++移植版.用于为C++程序提供日志功能,以便开发人员对目标程序进行调试和审计,log4cxx是apache软件基金会的开源项目,基于A ...
- 西门子S7comm协议解析 —— 利用Wireshark对报文逐字节进行解析详细解析S7comm所含功能码以及UserData功能
又一次成为懒蛋了,标题就这么改了改又是一篇新文章. 网上也有很多S7comm协议的解析,但还是如同我上一篇一样我只是做报文的解析对于S7comm的原理并进行阐述. 有些地方有错误的地方尽请大家指出,共 ...
- CentOS7 编译安装 nginx-1.10.0
对于NGINX 支持epoll模型 epoll模型的优点 定义: epoll是Linux内核为处理大批句柄而作改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著的 ...
- Windows XP SP3下编译安装check-0.10.0
软件环境:visual studio 2010 cmake-3.6.3-win32-x86 从github.com下载check-0.10.0到本地,解压出目录check-0.10.0 下载cmake ...
- Ubuntu 16.04源码编译安装nginx 1.10.0
一.下载相关的依赖库 pcre 下载地址 http://120.52.73.43/jaist.dl.sourceforge.net/project/pcre/pcre/8.38/pcre-8.38.t ...
- Linux(CentOS6.5)下编译安装Nginx官方最新稳定版(nginx-1.10.0)
注:此文已经更新为新版:http://comexchan.cnblogs.com/p/5815753.html ,请直接查看新版,谢谢! 本文地址http://comexchan.cnblogs.co ...
随机推荐
- Graphics.Blit
[Graphics.Blit] 需求注意第4个参数,用4个参数pass用于指定使用哪一个pass.默认值为-1,即使用所有的pass. 参考:file:///C:/Program%20Files%20 ...
- Docker配置mysql互为主从
配置准备 两台机器 两台机器:A(193.168.10.101) B(193.168.10.102) 做好ssh免密登录 mysql大版本需要一致,小版本可忽略 并且两台机器已经安装好了docker ...
- varchar和Nvarchar区别(转)
Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示 如果还为了这个纠结,就直接看看后面的解说,做决定吧. 一般如果用到中文或者其 ...
- Mybatis中DAO层接口没有写实现类,Mapper中的方法和DAO接口方法是怎么绑定到一起的
参考mybatis入门基础(二)----原始dao的开发和mapper代理开发 其实也就是通过接口名与mapper的id绑定在一起,通过SQL去写实现类,返回数据.
- rabbitmq的延迟消息队列实现
第一部分:延迟消息的实现原理和知识点 使用RabbitMQ来实现延迟任务必须先了解RabbitMQ的两个概念:消息的TTL和死信Exchange,通过这两者的组合来实现上述需求. 消息的TTL(Tim ...
- 使用mybatis提供的各种标签方法实现动态拼接Sql。使用foreach标签实现遍历查询。比如实现select * from user where id in(1,10,24)这条sql查询语句。
向sql传递数组或List,mybatis使用foreach解析,如下: 需求: 传入多个id查询用户信息,用下边的sql实现: select * from user where id in(1,10 ...
- 复利计算--web版--总结--软件工程
复利计算项目 估计用时 实际用时 时间(小时) 5.5小时 6.5小时 总共代码行 500 550 功能包含 单利/复利计算,本金计算,求投资年限,求投资项目利率估计 (计算利息和,计算时间,计算 ...
- android studio使用真机测试时点击Debug调试模式时报Error running app:No target device found,点击运行模式却是启动正常的
原因是adb没检测到设备(包括真机和虚拟机). 在Terminal执行adb devices命令,查看有没有连接到的设备. 如果没有设备,确认虚拟机是否正确打开,真机是否连接打开USB调试并安装驱动. ...
- Android Gson 操作
JSON序列化后的数据不带类名与名命空间,所以这两个服务端跟客户端可以不对应,需要保证字段对应即可 Asp.net MVC端 using System; using System.Collection ...
- POJ 2396 Budget (有源汇有上下界最大流)
题意:给定一个矩阵的每行的和和每列的和,以及每个格子的限制,让你求出原矩阵. 析:把行看成X,列看成Y,其实就是二分图,然后每个X到每个Y边一条边,然后加一个超级源点和汇点分别向X和Y连边,这样就形成 ...