wireshark插件开发 - 自定义协议

虽然wireshark自带了很多知名协议的解析插件,譬如HTTP、DHCP等等,然而在实际应用环境中,有不少软件之间的通信协议都是私有的,如游戏客户端和服务器之间的交互协议通常都是私有的,wireshark无法具体解析出各种字段之间的含义,只能显示接收到的二进制数据,给协议的分析和问题的排查带来了一定的困难,尤其是协议内容比较复杂时。

本文一个自定义的简单协议入手,分析如何基于wireshark开发自定义协议分析插件。

1.1. 概述

本书使用Go语言来描述协议的交互过程。Go由Google出品,号称是互联网上的C语言,有点类似于C语言,以其简洁和高并发著称。

即使不了解Go语言也没有关系,本书给出的代码,基本可以自释其义,了解过程即可,重点不在于此。

1.2. 协议描述

 1 package packet
 2
 3 import (
 4     "bytes"
 5     "encoding/binary"
 6     "fmt"
 7     "os"
 8 )
 9
10 type NPacket struct {
11     Version int16    //两个字节
12     ID uint32       //四个字节
13     Buffer [1024]byte  //简单起见,固定为1024个字节
14 }
15
16 func (packet *NPacket) String() string {
17     return fmt.Sprintf("%v, %v, %v\n", packet.Version,
18         packet.ID, string(packet.Buffer[:]))
19 }
20
21 func CheckError(err error) {
22     if err != nil {
23         fmt.Println("Error: %s", err.Error())
24         os.Exit(1)
25     }
26 }
27
28 func ConvertToPacket(b []byte) (packet *NPacket, err error) {
29     buffer := bytes.NewBuffer(b[:])
30
31     packet = &NPacket{}
32     #将缓冲区buffer的内容转换到NPacket结构体中
33     err = binary.Read(buffer, binary.BigEndian, packet)
34
35     return packet, err
36 }
37
38 func ConvertToBuffer(packet *NPacket) (b []byte, err error) {
39     buf := new(bytes.Buffer)
40
41 #将结构体内容转换到缓冲区中
42     err = binary.Write(buf, binary.BigEndian, packet)
43
44     return buf.Bytes(), err
45 }

1.3. 客户端

 1 package main
 2
 3 import (
 4     "fmt"
 5     "net"
 6 )
 7
 8 import "packet"
 9
10 func main() {
11     #连接服务端,UDP协议
12     conn, err := net.Dial("udp", "192.168.5.4:11110")
13     defer conn.Close()
14     packet.CheckError(err)
15
16     #定义报文内容
17     pkt_send := packet.NPacket{Version: 1, ID: 1}
18     copy(pkt_send.Buffer[:], "Ping")
19
20     send_buff, err := packet.ConvertToBuffer(&pkt_send)
21     packet.CheckError(err)
22     #发送报文
23     conn.Write(send_buff)
24
25     var recv_msg [4096]byte
26     #读取报文
27     n, err := conn.Read(recv_msg[0:])
28     packet.CheckError(err)
29
30     #报文转换到结构体中
31     pkt_recv, err := packet.ConvertToPacket(recv_msg[0:n])
32     packet.CheckError(err)
33
34     #会调用NPacket结构体的String方法
35     fmt.Println(pkt_recv)
36 }

1.4. 服务端

 1 package main
 2
 3 import (
 4     "fmt"
 5     "net"
 6 )
 7
 8 import "packet"
 9
10 func recvUDPMsg(conn *net.UDPConn) {
11     var buf [4096]byte
12
13     #读取UDP报文
14     n, raddr, err := conn.ReadFromUDP(buf[0:])
15     packet.CheckError(err)
16
17     #网络数据转换到结构体中
18     pkt_recv, err := packet.ConvertToPacket(buf[0:n])
19     packet.CheckError(err)
20
21     fmt.Println(pkt_recv)
22
23     #构造响应报文
24     pkt_send := packet.NPacket{Version: pkt_recv.Version, ID: pkt_recv.ID}
25     copy(pkt_send.Buffer[:], "Pong")
26
27     send_buff, err := packet.ConvertToBuffer(&pkt_send)
28     packet.CheckError(err)
29     #发送报文
30     _, err = conn.WriteToUDP(send_buff, raddr)
31     packet.CheckError(err)
32 }
33
34 func main() {
35     udp_addr, err := net.ResolveUDPAddr("udp", ":11110")
36     packet.CheckError(err)
37
38     conn, err := net.ListenUDP("udp", udp_addr)
39     defer conn.Close()
40     packet.CheckError(err)
41
42     recvUDPMsg(conn)
43 }

1.5. 启动方式

1、启动服务端

打开CMD窗口,进入源码所在目录

set GOPATH=源码所在目录

go run src\main\server.go

2、启动客户端

打开CMD窗口,进入源码所在目录

set GOPATH=源码所在目录

go run src\main\client.go

1.6. 抓包

更多更完整的内容,请移步百度阅读:

https://yuedu.baidu.com/ebook/ca33e60d3a3567ec102de2bd960590c69ec3d89b

时间: 2024-10-22 01:04:37

wireshark插件开发 - 自定义协议的相关文章

wireshark插件开发 - 汇总

wireshark插件开发 - 自定义协议 wireshark插件开发 - Lua插件解析 wireshark插件开发 - C插件解析 wireshark插件开发 - 更多

wireshark插件开发 - Lua插件解析

wireshark支持C语言和Lua语言开发插件,本部分内先介绍Lua插件部分开发.Lua语言相对C语言开发有一个巨大的优势,就是不需要编译代码,因为Lua语言是脚本语言,只需要编写相关协议解析的脚本内容,然后由wireshark加载即可(Wireshark自带Lua解析器),wireshark封装丰富的接口给Lua使用, 实现代码 1 ----------------------------------------------------------------- 2 -- wireshark

第13章 TCP编程(3)_基于自定义协议的多进程模型

5. 自定义协议编程 (1)自定义协议:MSG //自定义的协议(TLV:Type length Value) typedef struct{ //协议头部 char head[10];//TLV中的T unsigned int checkNum; //校验码 unsigned int cbSizeContent; //协议体的长度 //协议体部 char buff[512]; //数据 }MSG; (2)自定义读写函数 ①extern int write_msg(int sockfd, cha

Netty 5 自定义协议 教程

网上好多连接好多demo都不是netty5的,都是以前的版本,况且还有好多运行时老报错.入门级demo就不写了,估计都是那些老套路.好多公司都会有最佳实践,今天就说说如何自定义协议,一般自定义协议都是公司内部各个部门定义的,当然了我写的比较简单. 注意: 本教程是采用netty-all-5.0.0.Alpha2.jar,netty5的版本,不是网上很多的例子都是采用以前老大版本. 自定义协议: 协议 {   协议头(header)   消息体(body) } header格式 {   固定头,

Google Chrome 自定义协议(PROTOCOL)问题的处理

最近在使用谷歌浏览器的时候遇到了自定义协议(PROTOCOL)的问题,比较折腾,特此记录,希望我浪费生命换来的结果能够帮助读到此文的朋友少浪费一点宝贵的时间! 由于某些原因,电脑里一直没有安装阿里旺旺,今天由于买一个东西需要和卖家沟通,就安装了一下.结果发现在网页上点击旺旺小图标不会打开旺旺软件,折腾正式开始! 由于打开了很多网页,也没立即重启Chrome测试,好半天终于把所有的网页都处理掉了,关掉Chrome再打开,还是不行! 重启电脑,再打开,还是不行!然后用IE测试了一下发现是正常的,坚决

第13章 TCP编程(4)_基于自定义协议的多线程模型

7. 基于自定义协议的多线程模型 (1)服务端编程 ①主线程负责调用accept与客户端连接 ②当接受客户端连接后,创建子线程来服务客户端,以处理多客户端的并发访问. ③服务端接到的客户端信息后,回显给客户端 (2)客户端编程 ①从键盘输入信息,并发送给服务端 ②接收来自服务端的信息 //msg.h与前一节相同 #ifndef __MSG_H__ #define __MSG_H__ #include <sys/types.h> //求结构体中成员变量的偏移地址 #define OFFSET(T

自定义协议的编码解码

2015.4.1 wqchen. 转载请注明出处 http://www.cnblogs.com/wqchen/p/4385798.html 本文介绍的是一个自定义协议的编码解码工具的实现. 游戏开发中,前端后端协议一般都会协商定制通信协议的格式,统一格式后用程序脚本对应前端和后端的编程语言,分别生成一份协议的编码和解码方案,便于协议的一致性. 这样的工具有很多,比较出名的是google的protobuf,它可以支持很多种编程语言.我也曾试用过protobuf,看过一点它的实现,protobuf完

android4.2串口jni收发数据(基于自定义协议)

代码已经验证过,没问题 ! 代码层次结构: |-----serial_communication_class--- |                     |-------src--------- |                                  |------com------ |                                             |----object----- |                                

C#综合揭秘——通过修改注册表建立Windows自定义协议

引言 本文主要介绍注册表的概念与其相关根项的功能,以及浏览器如何通过连接调用自定义协议并与客户端进行数据通信.文中讲及如何通过C#程序.手动修改.安装项目等不同方式对注册表进行修改.其中通过安装项目对注册表进行修改的情况最为常见,在一般的应用程序中都会涉及.当中最为实用的例子将介绍如何通过"安装项目"修改注册表建立自定义协议,在页面通过ajax方式发送路径请求,并在回调函数中调用自定义协议.最后一节还将介绍如何调用自定义协议去保持数据的保密性.希望本篇文章能对各位的学习研究有所帮助,当