WireShark编译C语言.dll插件全程(详细)

一.编译一遍WireShark源代码

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

1.1安装预备环境

首先安装Chocolately,类似ubuntu的apt-get,用这个省力很多

使用管理员权限打开windows powershell,执行下面指令

 

PS$>Set-ExecutionPolicy AllSigned
PS$>Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

 

安装完成后,继续使用powershell窗口进行下面操作。

1.1.1安装VS2019 Community(已安装的请跳过,或者也可以直接去微软官方下载)

PS$> choco install -y visualstudio2019community visualstudio2019-workload-nativedesktop

在Visual Studio Installer勾选如下组件:

(1)选中C++桌面开发

WireShark编译C语言.dll插件全程(详细)

 

 

 (2)

WireShark编译C语言.dll插件全程(详细)WireShark编译C语言.dll插件全程(详细)

 

 

 1.1.2 安装QT

推荐安装QT5.15.2(官方教程里使用的版本,现在QT出到6了不知道能不能使)

https://download.qt.io/official_releases/online_installers/

下载.exe,选中Qt 5.15.2,必须勾选msvc2019_64,Qt Debug Information Files,其余随意

推荐默认目录,空间不足也可安装至其他盘符,最好在根目录下

1.1.3安装Python3

PS$> choco install -y python3

执行即可,也可官网安装,尽量安装在默认目录

Py官方安装的缺省目录是在你的用户文件夹下,而WireShark希望你安装在C盘根目录下,所以推荐choco安装

1.1.4安装Perl

Strawberry和Active二选一即可,如果后面编译报错了提示perl奔溃,卸载然后回来重装

PS$> choco install -y strawberryperl
# ...or...
PS$> choco install -y activeperl

1.1.5 安装Git,用来获取WireShark源代码

PS$> choco install -y git

1.1.6安装CMake

PS$> choco install -y cmake

1.1.7 安装 Asciidoctor, Xsltproc, DocBook

 

 

 

 安装Asciidoctor需要一个java runtime,可以自选一种,或者直接按照下面的来就行

PS$>choco install -y zulu
PS$> choco install -y asciidoctorj xsltproc docbook-bundle

1.1.8 安装winflexbison

PS$> choco install -y winflexbison3

1.2 开始编译

在c盘根目录下创建文件夹"Development"

启动一个CMD命令行

>cd C:\Development
>git clone https://gitlab.com/wireshark/wireshark.git

克隆完成后,点击开始菜单,找到Visual Studio 2019->x64 Native Tools Command Prompt for VS 2019

使用Vs2019的命令行窗口,全程不要关闭,执行以下操作:

> set WIRESHARK_BASE_DIR=C:\Development\wireshark
> rem set WIRESHARK_LIB_DIR=c:\wireshark-win64-libs
> set QT5_BASE_DIR=C:\Qt\5.15.2\msvc2019_64
WIRESHARK_BASE_DIR指的是wireshark原目录,clone到哪填哪
QT5_BASE_DIR是你的QT5编译器目录,若不是默认安装,填入相应的目录即可

接着创建文件夹wsbuild64,
> mkdir C:\Development\wsbuild64
> cd C:\Development\wsbuild64

执行

> cmake -G "Visual Studio 16 2019" -A x64 ..\wireshark

提示以下信息:

-- Configuring done
-- Generating done
-- Build files have been written to: C:/Development/wsbuild64

即构建成功

开始编译

> msbuild /m /p:Configuration=RelWithDebInfo Wireshark.sln

若C:\Development\wsbuild64\run\RelWithDebInfo\下有Wireshark.exe,可运行,第一阶段结束

2.编译插件

创建wireshark\plugins\epan\foo目录,并在该目录创建packet-foo.c文件(这个foo是你的插件名)

//这段代码仅供参考与演示,只能显示个协议名。TCP协议端口号43300

编写插件的教程劳烦各位百度,之后我可能也写一篇关于编写C插件的随笔

#include "config.h"
#include <epan/packet.h>

#define FOO_PORT 43300

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 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"           /* filter_name */
        );
}

void
proto_reg_handoff_foo(void)
{
    static dissector_handle_t foo_handle;

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

找到wireshark源码目录下的CMakeListsCustom.txt.example重命名为CMakeListsCustom.txt

找到这样一段:

1 # Fail CMake stage if any of these plugins are missing from source tree
2 set(CUSTOM_PLUGIN_SRC_DIR
3 #    private_plugins/foo
4 # or
5 #    plugins/epan/foo
6 )

去掉这里第5行的井号,如下

1 # Fail CMake stage if any of these plugins are missing from source tree
2 set(CUSTOM_PLUGIN_SRC_DIR
3 #    private_plugins/foo
4 # or
5     plugins/epan/foo
6 )

保存即可,这里的foo就是你的协议名称

将wireshark\plugins下的plugin.rc.in文件复制进foo目录,同时wireshark\plugins\epan\gryphon目录下的CMakeLists.txt复制到foo目录

将复制来的CMakeLists.txt打开,将文本中的“gryphon”都替换为"foo"

 

打开你没关闭的x64 Native Tools Command Prompt for VS 2019窗口(若关了再打开就行cd到wsbuild64)

再次执行

> msbuild /m /p:Configuration=RelWithDebInfo Wireshark.sln

若C:\Development\wsbuild64\run\RelWithDebInfo\plugins\3.5\epan下有一个foo.dll就说明成功了!

WireShark编译C语言.dll插件全程(详细)

 

 

 若失败了,执行

>msbuild /m /p:Configuration=RelWithDebInfo Wireshark.sln /t:Clean

再执行上面那条指令,若还是报错,请顺着这篇文章找错

3.测试

打开C:\Development\wsbuild64\run\下的Wireshark.exe

进行抓包,这里我使用了两个虚拟机,一个乌班图一个kali,nat连接,主机当网关,抓取对应的虚拟网卡

kali当服务器,ubuntu当客户端,使用python3网络编程,从菜鸟教程抄一段代码

ip都是服务端的ip,测试前请确保你的网络拓扑正确,都能ping通

kali下建立脚本

 1 #coding=utf-8
 2 #!/usr/bin/python3
 3 # 文件名:server.py
 4 
 5 # 导入 socket、sys 模块
 6 import socket
 7 import sys
 8 
 9 # 创建 socket 对象
10 serversocket = socket.socket(
11             socket.AF_INET, socket.SOCK_STREAM) 
12 
13 # 获取本地主机名
14 host = '192.168.226.140'
15 
16 port = 43300
17 
18 # 绑定端口号
19 serversocket.bind((host, port))
20 
21 # 设置最大连接数,超过后排队
22 serversocket.listen(5)
23 
24 while True:
25     # 建立客户端连接
26     clientsocket,addr = serversocket.accept()      
27 
28     print("连接地址: %s" % str(addr))
29     
30     msg='欢迎访问菜鸟教程!'+ "\r\n"
31     clientsocket.send(msg.encode('utf-8'))
32     clientsocket.close()

ubuntu下建立脚本

 1 #!/usr/bin/python3
 2 # 文件名:client.py
 3 
 4 # 导入 socket、sys 模块
 5 import socket
 6 import sys
 7 
 8 # 创建 socket 对象
 9 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
10 
11 
12 host = '192.168.226.140' 
13 
14 # 设置端口号
15 port = 43300
16 
17 # 连接服务,指定主机和端口
18 s.connect((host, port))
19 
20 # 接收小于 1024 字节的数据
21 msg = s.recv(1024)
22 
23 s.close()
24 
25 print (msg.decode('utf-8'))

先执行服务端脚本,然后打开主机wireshark开始抓包,再执行客户端脚本

如下即抓包成功:

WireShark编译C语言.dll插件全程(详细)

 

上一篇:Jmeter - 插件入门


下一篇:webpack基础+进阶+优化