• 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 FilesMicrosoft SDKsWindowsv7.1AInclude

    此时我的bat脚本内容如下所示:

    @echo off
    
    set PATH=%PATH%:.
    set PATH=%PATH%;d:devcygwinbin
    
    set INCLUDE=%INCLUDE%;C:Program FilesMicrosoft SDKsWindowsv7.1AInclude
    
    echo 设置 Visual Studio environment...
    "C:Program FilesMicrosoft Visual Studio 11.0Common7Toolsvsvars32.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.4CMakeLists.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()函数。

  • 相关阅读:
    Nginx 静态资源缓存设置
    Ubuntu Linux 与 Windows 7双系统安装教程(图文)
    配置可以通过http协议访问的svn服务器
    CentOS下搭建SVN服务器
    LINUX服务器下用root登录ftp
    CentOS 6下编译安装MySQL 5.6
    Jenkins代码管理
    python学习:备份文档并压缩为zip格式
    centos 7 双网卡建网桥脚本实现
    python学习:使用正则收集ip信息
  • 原文地址:https://www.cnblogs.com/zzqcn/p/3160062.html
Copyright © 2020-2023  润新知