手把手教你编译wireshark3.1的c语言插件(windows平台2019-3-20)

手把手教你编译wireshark3.1的c语言插件(windows平台2019-3-20)

资料来源:
https://www.wireshark.org/docs/wsdg_html_chunked/ChSetupWin32.html (官方教程)
http://eucifyy.com/wireshark-dissector-mwe.html (python代码)

简介

wireshark是一个著名的网络嗅探软件,前阵子央视著名的315晚会也有一个教授使用wireshark向我们展示某些不法app非法获取用户隐私的过程。在wireshark中用户可以自行编写插件来做自定义的协议的解析器。有两种途径,一种是c插件的方式,在windows平台下,体现为一个动态链接库.dll文件,放在wireshark插件目录下,这个c插件的优点是速度快,但缺点也很明显,编译工程量大,兼容性差,你这个版本下编译的插件,到另一个版本的wireshark下就完全不能用了。还有一个是lua脚本的方式,这个十分方便,兼容性也好,制作也简单,网上教程也一大堆,但不知道为什么,wireshark官方并不推荐这个。总之,我们还是按照wireshark官方的教程来编译c插件吧。

步骤一、编译一次wireshark源码

这个步骤十分繁琐,但好在官方写的十分详细:https://www.wireshark.org/docs/wsdg_html_chunked/ChSetupWin32.html。按照官方说好的编译完一遍。这样你就安装好了环境,同时编译出了不少目标文件,这些目标文件待会编译插件的时候要用。

步骤二、编译c插件

1.创建源文件

按照这个https://www.wireshark.org/docs/wsdg_html_chunked/ChDissectAdd.html
创建wireshark\plugins\epan\foo目录,并在里面写出packet-foo.c文件(这个foo是你的插件名)

#include "config.h"

#include <epan/packet.h>

#define FOO_PORT 1234

static int proto_foo = -1;

static int dissect_foo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree _U_, void *data _U_)
{
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "FOO");
    /* Clear out stuff in the info column */
    col_clear(pinfo->cinfo,COL_INFO);

    return tvb_captured_length(tvb);
}


void proto_register_foo(void)
{
    proto_foo = proto_register_protocol (
        "FOO Protocol", /* name       */
        "FOO",      /* short name */
        "foo"       /* abbrev     */
        );
}
void proto_reg_handoff_foo(void)
{
    static dissector_handle_t foo_handle;

    foo_handle = create_dissector_handle(dissect_foo, proto_foo);
    dissector_add_uint("udp.port", FOO_PORT, foo_handle);
}


2.复制其他插件文件作为模板

之后将wireshark\plugins目录下的plugin.rc.in文件复制进foo目录,以及wireshark\plugins\epan\gryphon目录下的CMakeLists.txt也复制进foo目录。

3.修改插件信息

使用记事本打开CMakeLists.txt,将里面的“gryphon”文本都替换为foo。

4.修改自制插件配置

进入wireshark目录,把里面的“CMakeListsCustom.txt.example”重命名为“CMakeListsCustom.txt”,打开CMakeListsCustom.txt,去掉里面的某个"#",使得"set(CUSTOM_PLUGIN_SRC_DIR plugins/epan/foo)"这样一个语句完整,这里的plugins/epan/foo就是你的插件的目录。

set(CUSTOM_PLUGIN_SRC_DIR
    plugins/epan/foo
)

# Do not fail CMake stage if any of the optional plugins are missing from source tree
set(_OPTIONAL_CUSTOM_PLUGIN_SRC_DIR
    plugins/epan/bar
)

foreach(  _plugin_dir ${_OPTIONAL_CUSTOM_PLUGIN_SRC_DIR} )
    if( EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${_plugin_dir}/CMakeLists.txt )
        list( APPEND CUSTOM_PLUGIN_SRC_DIR ${_plugin_dir} )
    else()
        message( WARNING "Custom plugins: No ${_plugin_dir}/CMakeLists.txt file found - ignoring" )
    endif()
endforeach()

步骤四、重新编译wireshark源码

这次的重新编译,比初次编译要快不少,原因就是初次编译以及生成了足够了目标文件,这次编译只要编译你这个插件就行了。
编译完后你会在你的build目录下run\RelWithDebInfo\plugins\3.1\epan里看到foo.dll,这样就算编译成功了。


捕获2.JPG

步骤五、启动wireshark并测试

启动run\RelWithDebInfo下的wireshark.exe,使用python写一个基于foo协议的程序并测试,脚本如下:

# server.py
from socket import *

serverSocket = socket(AF_INET, SOCK_DGRAM) # UDP
serverSocket.bind(('', 1234))

while True:
    message, address = serverSocket.recvfrom(1024) # buffer size
    serverSocket.sendto('thanks', address)
# client.py
import time
from socket import *

clientSocket = socket(AF_INET, SOCK_DGRAM)
clientSocket.settimeout(1)
message = 'test'
addr = ('127.0.0.1', 1234)

start = time.time()
clientSocket.sendto(message, addr)
try:
    data, server = clientSocket.recvfrom(1234)
    end = time.time()
    elapsed = end - start
    print '%s %d' % (data, elapsed)
except timeout:
    print 'REQUEST TIMED OUT'

注意以上脚本必须用python2来运行,如果你已经安装了python3,你可以再安装一个python2并在bin目录里面添加如下内容的python2.bat:

@echo off
%~dp0/python.exe %*

将bin目录添加到环境变量path即可通过python2命令执行python2。
还需要注意的是,按照默认配置编译的wireshark并不支持监听127.0.0.1这种本机回环地址。你需要安装一个Npcap loopback adapter(https://nmap.org/download.html)
来使得wireshark能够监听该地址。
分别打开两个终端执行如下命令

>python2 server.py
>python2 client.py

如果以上命令成功,你的client窗口会收到一个thanks的返回结果,你可以通过过滤器设置udp.port==1234来获得类似如下嗅探结果(为了测试,我没有采用本机回环地址,而是将server在另一台机子上执行):


捕获.JPG

这样,一个wireshark的c语言插件就初步编好了,需要更加详细的协议解析器(dissector)编程方法,可以去看官方的技术文档:https://www.wireshark.org/docs/wsdg_html_chunked/ChDissectAdd.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,302评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,232评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,337评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,977评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,920评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,194评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,638评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,319评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,455评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,379评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,426评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,106评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,696评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,786评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,996评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,467评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,043评论 2 341