用lua语言编写Wireshark插件解析自定义协议
- 格式:doc
- 大小:340.50 KB
- 文档页数:8
wireshark协议分析Wireshark协议分析Wireshark是一个功能强大的网络协议分析工具,它能够捕获、分析和显示网络数据包中的数据。
通过使用Wireshark,我们可以深入了解网络通信过程中的协议细节,追踪数据包的传输路径,发现潜在的安全风险,并进行网络性能优化。
在进行协议分析之前,我们首先需要捕获网络数据包。
Wireshark支持在多个平台上运行,包括Windows、Mac OS和Linux。
它能够通过本地网络接口或远程连接捕获网络数据包。
当我们开始捕获数据包时,Wireshark会显示一个实时的数据包列表,并提供详细的信息,如源IP地址、目标IP地址、协议类型、端口号等。
在开始分析数据包之前,我们可以通过使用过滤器来限制需要关注的数据包。
Wireshark支持使用协议、源IP地址、目标IP地址、端口号等作为过滤条件。
通过设置适当的过滤器,我们可以只关注我们感兴趣的数据包,而忽略其他不相关的数据。
一旦我们捕获了数据包,我们就可以开始进行协议分析了。
Wireshark提供了许多工具和功能来帮助我们分析协议。
其中一个很有用的功能是重构TCP流。
当网络中的数据包是以多个片段的形式传输时,Wireshark可以将它们重新组装成完整的数据流,以便我们更好地分析和理解通信内容。
此外,Wireshark还可以对数据包进行解码。
它支持解码多种网络协议,包括TCP/IP、UDP、HTTP、DNS等。
通过解码数据包,我们可以查看每个协议中的字段和值,以便更好地理解和分析网络通信过程。
在分析数据包时,我们还可以使用Wireshark提供的统计功能。
Wireshark可以统计网络中的数据包数量、协议类型、数据包大小等信息,并以图表的形式展示。
通过分析这些统计信息,我们可以了解网络的负载情况、流量模式以及网络性能状况。
除了基本的协议分析功能外,Wireshark还支持操作和导出数据包。
我们可以对数据包进行重发、制作过滤器、设置标记等操作。
Wireshark基本⽤法过滤规则协议详解基本使⽤:协议解析:(1)版本,占4位,指IP协议的版本,⽬前⼴泛使⽤的IP协议版本号为4(即)。
2)⾸部长度,占4位,可表⽰的最⼤⼗进制数值是15。
请注意,这个字段所表⽰数的单位是32位字长(1个32位字长是4字节),因此,当IP 的⾸部长度为1111时(即⼗进制的15),⾸部长度就达到60字节。
当IP分组的⾸部长度不是4字节的整数倍时,必须利⽤最后的填充字段加以填充。
因此数据部分永远在4字节的整数倍开始,这样在实现IP协议时较为⽅便。
⾸部长度限制为60字节的缺点是有时可能不够⽤。
但这样做是希望⽤户尽量减少开销。
最常⽤的⾸部长度就是20字节(即⾸部长度为0101),这时不使⽤任何选项。
(3)服务类型,占8位,⽤来获得更好的服务,但实际上⼀直没有被使⽤过。
1998年IETF把这个字段改名为区分服务DS(Differentiated Services)。
只有在使⽤区分服务时,这个字段才起作⽤。
(4)总长度,总长度指⾸部和数据之和的长度,单位为字节。
总长度字段为16位,因此数据报的最⼤长度为2^16-1=65535字节。
在IP层下⾯的每⼀种数据链路层都有⾃⼰的帧格式,其中包括帧格式中的数据字段的最⼤长度,这称为最⼤传送单元MTU(Maximum Transfer Unit)。
当⼀个数据报封装成链路层的帧时,此数据报的总长度(即⾸部加上数据部分)⼀定不能超过下⾯的数据链路层的MTU值。
PS:图中总长度为84个字节,ping包默认为56个字节,ICMP包头是8个字节,再加上⾸部长度20个字节。
下图我将包长度设置为112个字节后,总长度就变成140个字节了(5)标识(identification),占16位。
IP软件在存储器中维持⼀个计数器,每产⽣⼀个数据报,计数器就加1,并将此值赋给标识字段。
但这个“标识”并不是序号,因为IP是⽆连接服务,数据报不存在按序接收的问题。
wireshark协议树解析步骤Wireshark是一款功能强大的网络分析工具,可以用于捕获、分析和解码网络数据包。
它可以解析多种网络协议,并以可视化的方式呈现协议树的结构。
以下是解析Wireshark协议树的一般步骤:2. 启动Wireshark:安装完成后,启动Wireshark应用程序。
主界面显示了可用的网络接口。
3. 选择捕获接口:Wireshark支持同时捕获多个网络接口的数据包。
选择一个接口来捕获所有传入和传出的数据包。
单击所需的接口即可开始捕获。
4. 开始数据包捕获:在单击接口后,Wireshark开始捕获数据包。
捕获进程将始终处于活动状态,直到您停止捕获。
5. 分析捕获的数据包:一旦停止捕获,Wireshark将显示捕获的数据包列表。
每个数据包都会显示源、目标IP地址、协议类型、长度和时间戳等信息。
6.选择要分析的数据包:从列表中选择您要分析的数据包。
您可以单击其中一个数据包以查看详细信息。
7. 查看协议树:选中一个数据包后,Wireshark将在下半部分显示包含协议树的详细信息。
协议树以树状结构显示,从最底层的数据链路层开始,逐级向上解析各个网络层,直到应用层。
8.展开协议树:在协议树中,您可以展开不同的协议层级以查看更详细的信息。
单击“+”或双击具有“+”符号的协议名称,以展开该层级。
9.查看协议详细信息:展开每个协议层级后,您可以查看该协议的详细信息。
例如,如果展开了“传输层”协议,您将看到TCP或UDP的详细信息。
10. 分析协议字段:在协议的详细信息中,您可以查看不同的字段和值。
Wireshark在对每个字段进行解码时会提供解析结果,如源端口、目标端口、标志位等。
11. 过滤数据包:如果您只想查看特定类型的数据包,可以使用Wireshark的过滤功能。
通过在过滤框中输入过滤条件,可以只显示符合该条件的数据包。
12.导出协议树:如果您想保存协议树,可以将其导出为纯文本或HTML格式。
使用wireshark进行协议分析实验报告一、实验目的本次实验旨在掌握使用Wireshark进行网络协议分析的方法与技巧,了解网络通信特点和协议机制。
二、实验内容及步骤1.实验准备b.配置网络环境:保证实验环境中存在数据通信的网络设备和网络流量。
2.实验步骤a. 打开Wireshark软件:启动Wireshark软件并选择需要进行抓包的网络接口。
b. 开始抓包:点击“Start”按钮开始抓包,Wireshark将开始捕获网络流量。
c.进行通信:进行网络通信操作,触发网络流量的产生。
d. 停止抓包:点击“Stop”按钮停止抓包,Wireshark将停止捕获网络流量。
e. 分析流量:使用Wireshark提供的分析工具和功能对抓包所得的网络流量进行分析。
三、实验结果通过Wireshark软件捕获的网络流量,可以得到如下分析结果:1. 抓包结果统计:Wireshark会自动统计捕获到的数据包数量、每个协议的数量、数据包的总大小等信息,并显示在界面上。
2. 协议分析:Wireshark能够通过解析网络流量中的各种协议,展示协议的各个字段和值,并提供过滤、等功能。
3. 源和目的地IP地址:Wireshark能够提取并显示各个IP数据包中的源IP地址和目的地IP地址,帮助我们分析网络通信的端点。
四、实验分析通过对Wireshark捕获到的网络流量进行分析,我们可以得到以下几个重要的分析结果和结论:1.流量分布:根据抓包结果统计,我们可以分析不同协议的数据包数量和比例,了解网络中各个协议的使用情况。
2. 协议字段分析:Wireshark能够对数据包进行深度解析,我们可以查看各个协议字段的值,分析协议的工作机制和通信过程。
3.网络性能评估:通过分析网络流量中的延迟、丢包等指标,我们可以评估网络的性能,并找出网络故障和瓶颈问题。
4. 安全分析:Wireshark能够分析HTTP、FTP、SMTP等协议的请求和响应内容,帮助我们发现潜在的网络安全问题。
使用LUA 编写WIRESHARK 协议解析插件一、平台操作系统:windows 7wireshark:1.10.3lua:5.1二、准备lua 语言基本语法,特别是关于表操作和循环wireshark 文档,包括用户使用文档和开发者文档,这些在wireshark 官方网站都能找到三、开始我们首先定义一个简单的协议,我们使用 C 语言的语法描述,1struct foo2{3char protocol_type[16]; /* request response notify */4 char service_type[16]; /* 我们定义的各种服务类型 */5 unsigned intmsg_len; /* 消息体的长度 */6char msg_content[0]; /* 消息体的内容,由于是变长的所以采用此方法定义 */7 };现在可以让我们使用lua 定义一个最基本的框架1do 2--[[ 3创建一个新的协议结构 foo_proto 4第一个参数是协议名称会体现在过滤器中 5第二个参数是协议的描述信息,无关紧要 6 --]] 7local foo_proto = Proto("foo", "Foo Protolcol") 8 9--[[10下面定义字段11 --]]12local foo_protocol_type =ProtoField.string("foo.prototype", "Protocol Type", base.NONE)13local foo_service_type = ProtoField.string("foo.servicetype", "Service Type", base.NONE)14local foo_msg_len = ProtoField.uint32("foo.msglen", "Message Length", base.DEC)15local foo_msg_content =ProtoField.string("foo.msgcontent", "Message Content", base.NONE)1617 -- 将字段添加都协议中18 foo_proto.fields = {19 foo_protocol_type,20 foo_service_type,21 foo_msg_len,22 foo_msg_content23 }24 25--[[26下面定义 foo 解析器的主函数,这个函数由 wireshark调用27第一个参数是 Tvb 类型,表示的是需要此解析器解析的数据28第二个参数是 Pinfo 类型,是协议解析树上的信息,包括 UI 上的显示29第三个参数是 TreeItem 类型,表示上一级解析树30 --]]31function foo_proto.dissector(tvb, pinfo,treeitem)3233-- 设置一些 UI 上面的信息34pinfo.cols.protocol:set("FOO")35 :set("FooProtocol")3637local offset = 038local tvb_len = tvb:len()3940-- 在上一级解析树上创建 foo 的根节点41local foo_tree = treeitem:add(foo_proto, tvb:range(offset))4243-- 下面是想该根节点上添加子节点,也就是自定义协议的各个字段44-- 注意 range 这个方法的两个参数的意义,第一个表示此时的偏移量45-- 第二个参数代表的是字段占用数据的长度46 foo_tree:add(foo_protocol_type, tvb:range(offset, 16))47offset = offset+16 48 foo_tree:add(foo_service_type,tvb:range(offset, 16))49 offset = offset+1650foo_tree:add(foo_msg_len, tvb:range(offset, 4))51 offset = offset+452 53-- 计算消息内容的长度54local foo_content_len =tvb_len-offset55 foo_tree:add(foo_msg_content, tvb:range(offset, foo_content_len))56 offset = offset+foo_content_len5758end5960-- 向 wireshark 注册协议插件被调用的条件61localtcp_port_table = DissectorTable.get("tcp.port")62tcp_port_table:add(12345, foo_proto)63end四、扩展(1)单TCP 分节多应用PDU这种情况可以在我们的协议解析函数中使用循环解决,但是应用层PDU 一般都需要有我们自定义的分割标识符,不然无法区分,这里我们使用协议尾端标记的方式,采用0xFF分割,这里我们假设我们的协议体中不会出现这个值,也就是我们的消息体长度字段的值不会出现这个值。
Wireshark录取自定义报文的方法Wireshark是一款开源的网络协议分析工具,它可以捕获和分析网络流量。
Wireshark支持多种协议,并且允许用户录取自定义的报文进行进一步分析。
下面将介绍一种使用Wireshark录取自定义报文的方法。
首先,我们需要准备一个自定义的报文。
一个典型的报文由报文头和报文体组成。
报文头通常包括各种字段,例如源IP地址、目标IP地址、协议类型等信息。
报文体通常包含报文的具体内容,可以是文本数据、二进制数据或其他类型的数据。
接下来,打开Wireshark并选择一个适当的接口进行网络抓包。
Wireshark支持多种接口,可以是以太网、无线网络或其他类型的接口。
在Wireshark的主界面中,会显示一个实时的网络流量列表。
这个列表显示了从所选接口捕获的所有网络流量。
要录取自定义报文,需要设置过滤器来仅显示希望捕获的报文。
在Wireshark的过滤栏处,可以输入一个过滤表达式。
过滤表达式可以用于选择特定类型的报文。
例如,可以使用IP过滤表达式来仅显示与IP协议相关的报文:ip。
还可以使用端口过滤表达式来仅显示特定端口号的报文:tcp.port == 80。
当我们输入适当的过滤表达式后,Wireshark会自动应用过滤器,并只显示符合条件的报文。
接下来,我们需要发送自定义报文。
我们可以使用一个网络工具,例如cURL或Telnet,来发送自定义报文。
这些工具使我们能够以各种方式与服务器进行交互。
使用cURL发送自定义报文时,可以使用以下命令格式:```curl -X [请求方法] -H "Content-Type: [内容类型]" -d '[报文内容]' [目标URL]```其中,[请求方法]是报文的请求方法,例如GET、POST等。
[内容类型]是报文的内容类型,例如application/json。
[报文内容]是报文的具体内容,例如JSON格式的文本数据。
Wireshark解析自定义加密协议By Terry 2015年3月15日一、概述网上撰文写wireshark使用lua脚本解析协议的文章比较多。
笔者最近也因工作需要使用wireshark解析协议。
但因网络安全,协议的数据部分被加密了。
无法简单的使用lua脚本进行解析。
考虑到加密算法和压缩算法的复杂性,采用调用lua C库的方法,完成解密(解压)。
下面与大家分享下大致思路。
二、思路和目标协议的大致格式如下:协议字段命名协议版本(1字节)protoVersion协议命令类型(2字节)protoCmdType协议加密类型(1字节)protoEncrytionType协议压缩类型(1字节)protoCompressionType协议数据长度(4字节)protoDataLength协议数据(protoDataLength字节)protoData:本文仅专注于解码,为简化复杂性,暂时不考虑一个UDP/TCP包出现多个自定义数据包的情况。
Lua脚本的伪代码:local p_multi = Proto("multi","MultiProto");local f_protoVersion =ProtoField.uint8("multi.protoVersion","Version",base.DEC)local f_protoCmdType =ProtoField.uint16("multi.protoCmdType","CmdType",base.DEC,{[1] = "CmdType_1",[2] = "CmdType_2",[3] = "CmdType_3",})local f_protoEncrytionType = ProtoField.uint8("multi.protoEncrytionType","EncrytionType",base.DEC,{[1] = "EncrytionType_1",[2] = "EncrytionType_2",[3] = "EncrytionType_3",})local f_protoCompressionType = ProtoField.uint8("multi.protoCompressionType","CompressionType",base.DEC,{[1] = "CompressionType_1",[2] = "CompressionType_2",[3] = "CompressionType_3",})local f_protoDataLength =ProtoField.uint32("multi.protoDataLength","DataLength",base.DEC)p_multi.fields = { f_protoVersion, f_protoCmdType, f_protoEncrytionType, f_protoCompressionType, f_protoDataLength }function DecodeBufferFunction(protoEncrytionType, protoCompressionType, buf, pos, buf_len)local decodeBuf = buf-- TODO: This artical jobreturn decodeBufendfunction p_multi.dissector(buf,pkt,root)local pos = 0local buf_len = buf:len()local t = root:add(p_multi,buf(0,buf_len))-- 协议版本(1字节)t:add(f_protoVersion, buf(pos, 1))pos = pos + 1-- 协议命令类型(2字节)t:add(f_protoCmdType, buf(pos, 2))pos = pos + 2-- 协议加密类型(1字节)t:add(f_protoEncrytionType, buf(pos, 1))local protoEncrytionType = buf(pos, 1):uint()pos = pos + 1-- 协议压缩类型(1字节)t:add(f_protoCompressionType, buf(pos, 1))local protoCompressionType = buf(pos, 1):uint()pos = pos + 1-- 协议数据长度(4字节)t:add(f_protoDataLength, buf(pos, 1))local protoDataLength = buf(pos, 4):uint()pos = pos + 4-- 协议数据(protoDataLength字节)buf = DecodeBuffer(protoEncrytionType, protoCompressionType, buf, pos, buf_len)new_buf_len = buf:len()-- TODO: add your codeend本文的主要任务是DecodeBufferFunction的实现。
完整利用wireshark分析HTTP协议HTTP协议是超文本传输协议的缩写。
它是一种应用层协议,用于在Web浏览器和Web服务器之间传输数据。
Wireshark是一个用于网络分析和协议开发的免费开源程序,它可以用来捕获和分析网络数据包。
在使用Wireshark分析HTTP协议时,我们可以通过以下步骤来进行:1. 启动Wireshark并选择要捕获的网卡。
在Wireshark的主界面上,可以选择“Capture”选项卡来选择网卡。
点击“Start”按钮来开始捕获数据包。
3. 分析捕获的HTTP数据包。
Wireshark将以表格的形式显示捕获的数据包,其中列出了源IP地址、目的IP地址、协议类型等信息。
我们可以查看数据包的详细信息,包括源端口、目的端口、传输层协议等。
4.分析HTTP请求。
选择一个HTTP请求的数据包,点击“+]”按钮来展开其详细信息。
在详细信息中,可以查看请求的方法(GET、POST等)、请求的URL、请求的头部信息等。
5.分析HTTP响应。
选择一个HTTP响应的数据包,点击“+]”按钮来展开其详细信息。
在详细信息中,可以查看响应的状态码、响应的头部信息以及响应的正文内容。
6. 进一步分析HTTP请求和响应的头部信息。
HTTP请求和响应的头部信息包含了很多有用的信息。
例如,可以通过查看“Content-Type”来确定返回的数据类型是HTML、CSS、JavaScript还是其他类型的文件。
可以查看“Cookie”来查看是否存在会话信息。
还可以查看其他头部信息,如“User-Agent”来确定浏览器和操作系统的类型。
7. 查看HTTP的传输过程。
Wireshark可以以图形化的方式显示HTTP请求和响应的传输过程。
在摘要视图中,选择一个HTTP请求或响应,右键单击并选择“Follow”>“HTTP Stream”,可以查看完整的HTTP报文的传输过程。
8. 分析HTTP压缩。
如何用Wireshark lua编写的协议解析器,查看HTTP包的URIURL的Query String里的参数Wireshark解析HTTP GET方法不会解析URI里Query 字符串里的参数(通常由GET方式提交form数据),本文介绍用lua编写一个简单的协议解析器,让这些参数解析出来,并显示在wireshark协议解析窗口里。
首先编写以下解析器lua脚本(用文本编辑器编辑即可),取文件名为my_http_querystring_decoder.lua[python] view plaincopy-- Decode param=value from query string of http request uri (http.request.uri) -- Author: Huang Qiangxiong (qiangxiong.huang@) -- change log: --2010-07-01 -- Just can play.------------------------------------------------------------------------------------------------ do local querystring_decoder_proto = Proto("my_http_querystring_decoder","Decoded HTTP URI Query String [HQX's plugins]")---- url decode (from guide) function unescape (s) s = string.gsub(s, "+", " ")s = string.gsub(s, "%%(%x%x)", function (h)return string.char(tonumber(h, 16)) end)return s end ---- convert string to hexstring function string2hex (s) local hex = ""; for i=1, #s, 1 do hex = hex ..string.format("%x", s:byte(i)) endreturn hex end local f_http_uri =Field.new("http.request.uri") ---- my dissector function querystring_decoder_proto.dissector(tvb, pinfo, tree) local http_uri = f_http_uri() -- ignore packages without "http.request.uri" if not http_uri then return end -- begin build my tree local content = http_uri.valuelocal idx = content:find("?") if not idx then return end -- not include query string, so stop parsinglocal tab =ByteArray.new(string2hex(content)):tvb("Decoded HTTP URI Query String") local tab_range = tab()-- add proto item to tree local subtree =tree:add(querystring_decoder_proto, tab_range)-- add raw data to tree subtree:add(tab_range, "[HTTP Request URI] (" .. tab_range:len() .. " bytes)"):add(tab_range, content) -- add param value pair to tree local pairs_tree =subtree:add(tab_range, "[Decoded Query String]")local si = 1 local ei = idx local count = 0 while ei do si = ei + 1ei = string.find(content, "&", si) local xlen = (ei and (ei - si)) or (content:len() - si + 1)if xlen > 0 thenpairs_tree:add(tab(si-1, xlen), unescape(content:sub(si,si+xlen-1))) count = count + 1end end pairs_tree:append_text(" (" .. count .. ")") end -- register this dissectorregister_postdissector(querystring_decoder_proto) end 然后修改wireshark安装目录下的init.lua文件:(1)把disable_lua = true; do return end;这行注释掉:在前面加“--”(2)然后在init.lua文件最后面加一句:dofile("my_http_querystring_decoder.lua")OK大功告成,打开HTTP抓包,若其请求中URI带QueryString,则界面如下:可以看到,在协议解析树上新增了Decoded HTTP URI Query String ... 节点。
Wireshark是一款开源的网络数据包分析软件,它能够帮助用户捕获和解析网络数据包,以便于深入分析网络通信过程。
在Wireshark中,用户可以通过添加解析规则来对特定的数据包进行解析,让其在显示时能够更加清晰和易于理解。
本文将介绍如何在Wireshark中添加解析数据包规则,以及一些常见的解析规则的应用场景和示例。
一、如何添加解析规则1. 打开Wireshark软件,选择“Edit”菜单下的“Preferences”选项,打开“Preferences”对话框。
2. 在“Preferences”对话框中,选择“Protocols”选项,然后选择需要添加解析规则的协议,比如TCP、UDP、HTTP等。
3. 点击“Edit”按钮,打开“Edit Protocol”对话框,可以在该对话框中添加自定义的解析规则。
4. 在“Edit Protocol”对话框中,可以添加字段名称、字段偏移、字段长度等信息,以及解析规则的具体内容。
5. 添加完成后,点击“OK”按钮保存设置,然后重新启动Wireshark 软件,新添加的解析规则就会生效。
二、解析规则的应用场景和示例1. 解析TCP数据包中的数据字段假设我们需要分析TCP数据包中的某个特定字段,比如“Payload”字段,我们可以添加解析规则来将该字段的内容解析成十六进制或者ASCII码的形式进行显示,以便于更好地理解数据包的内容和通信过程。
2. 解析HTTP协议中的请求和响应在Wireshark中,我们经常会捕获到HTTP协议的请求和响应数据包,如果能够对这些数据包进行解析并显示其详细内容,将有助于我们更好地分析Web应用程序的通信过程,发现潜在的安全问题或性能瓶颈。
3. 解析DNS协议中的域名查询结果对于DNS协议中的域名查询结果,我们可以通过添加解析规则来将域名解析成IP位置区域的形式进行显示,这样可以更直观地了解域名解析的结果,并帮助排查网络连接问题。
编译wireshark源码Wireshark是一款著名的开源网络协议分析工具,其源代码可以通过官网或 Github 获取。
本文将介绍如何编译 Wireshark 源码。
环境准备在编译 Wireshark 之前,需要安装以下依赖库:- libglib2.0-dev- libpcap-dev- libgtk2.0-dev- libgcrypt20-dev- libkrb5-dev- libsmi-dev- flex- bison- qt5-default- qttools5-dev-tools可以通过以下命令进行安装:sudo apt-get install libglib2.0-dev libpcap-devlibgtk2.0-dev libgcrypt20-dev libkrb5-dev libsmi-dev flex bison qt5-default qttools5-dev-tools编译获取源码后,进入源码目录,执行以下命令进行编译:./configuremakesudo make install其中,configure 命令用于生成 Makefile,make 命令用于编译生成可执行文件,sudo make install 命令用于安装可执行文件。
编译过程中可能会提示缺少某些依赖库,需要手动安装。
如果编译成功,可执行文件将被安装到 /usr/local/bin 目录下,可以通过wireshark 命令启动。
总结本文介绍了编译 Wireshark 源码的步骤,需要安装一些依赖库,并通过 configure、make 和 make install 命令进行编译和安装。
对于网络协议分析工具的开发和维护者来说,掌握源码编译技能是必须的。
wireshark插件开发-Lua插件解析wireshark⽀持C语⾔和Lua语⾔开发插件,本部分内先介绍Lua插件部分开发。
Lua语⾔相对C语⾔开发有⼀个巨⼤的优势,就是不需要编译代码,因为Lua语⾔是脚本语⾔,只需要编写相关协议解析的脚本内容,然后由wireshark加载即可(Wireshark⾃带Lua解析器),wireshark封装丰富的接⼝给Lua使⽤,实现代码1-----------------------------------------------------------------2-- wireshark分析udp sample协议插件3-- 将⾃定义协议以可读的⽅式展⽰在wireshark中4-----------------------------------------------------------------5--基于UDP协议6local udp_table = DissectorTable.get("udp.port")7local my_proto = Proto("udp-sample", "udp sample protocol", "udp sample protocol")8--协议端⼝号9local my_port = 111101011--定义协议字段内容12local versionField = ProtoField.uint16("Version", "Version", base.DEC)13local idField = ProtoField.uint32("ID", "ID", base.DEC)14local stringField = ProtoField.string("Buffer", "Buffer")1516 my_proto.fields = {versionField, idField, stringField}1718--协议分析器19function my_proto.dissector(buffer, pinfo, tree)20 pinfo.cols.protocol:set("udp-sample")2122local len = buffer:len()23local myProtoTree = tree:add(my_proto, buffer(0, len), "udp sample protocol")24local offset = 025 myProtoTree:add(versionField, buffer(offset, 2))26 offset = offset + 22728 myProtoTree:add(idField, buffer(offset, 4))29 offset = offset + 43031 myProtoTree:add(stringField, buffer(offset, 1024))32end3334--增加协议到Wireshark中35 udp_table:add(my_port, my_proto)加载修改wireshark根⽬录下⾯的init.lua⽂件。
基于Wireshark和Lua的数据链协议解析插件开发作者:张海斌周翔张松梁静来源:《中国新通信》 2017年第15期【摘要】研究了Wireshark 协议解析插件的功能组成和传统开发方法存在的问题,探讨了在Wireshark 中使用Lua 进行数据链协议解析插件的开发方法,并通过实验对开发方法进行了测试验证。
实验结果表明该方法简单高效,降低了协议解析插件的开发难度,适用于数据链协议的快速分析。
【关键词】 Wireshark Lua 协议解析插件开发一、引言随着计算机网络的快速发展,各种网络协议层出不穷,为了保障网络的正常运行,需要对众多的网络协议进行解析处理,数据链协议的开发调试也需借助协议解析工具。
Wireshark 是一款便捷高效的网络协议分析工具,目前已支持数千种网络协议,并且其架构允许以插件的方式增加对新协议的支持。
传统的Wireshark 插件采用C 语言进行开发,对用户的编程能力要求较高,并且其开发环境比较复杂,不适合非专业人士使用。
本文研究了在Wireshark 中使用Lua脚本进行协议解析插件开发的方法,该方法具有开发环境简单、对用户能力要求低和开发高效等优点。
二、开发工具介绍2.1 Wireshark 简介Wireshark 是一个网络协议分析工具,其主要功能是捕获网络包,并尽可能多的解析和显示网络包的详细信息。
Wireshark 已广泛的应用于网络问题定位、网络安全分析、网络协议学习和协议开发调试等众多领域。
Wireshark 最大的特色就是支持大量的过滤器,当前最新版本2.2.4 支持超过2000 多种协议和206000 个协议字段。
Wireshark 可以插件的方式不断扩充过滤器,插件功能组成包括:协议树、解析器、解析器插件和显示过滤器。
2.2 Lua 简介Lua 是一种功能强大、高效、轻量和可嵌入的脚本语言,用标准C 语言编写,并且源代码开放,支持过程式编程、面向对象编程、函数式编程、数据驱动编程和数据描述。
Wireshark解析自定义加密协议By Terry 2015年3月15日一、概述网上撰文写wireshark使用lua脚本解析协议的文章比较多。
笔者最近也因工作需要使用wireshark解析协议。
但因网络安全,协议的数据部分被加密了。
无法简单的使用lua脚本进行解析。
考虑到加密算法和压缩算法的复杂性,采用调用lua C库的方法,完成解密(解压)。
下面与大家分享下大致思路。
二、思路和目标协议的大致格式如下:协议字段命名协议版本(1字节)protoVersion协议命令类型(2字节)protoCmdType协议加密类型(1字节)protoEncrytionType协议压缩类型(1字节)protoCompressionType协议数据长度(4字节)protoDataLength协议数据(protoDataLength字节)protoData:本文仅专注于解码,为简化复杂性,暂时不考虑一个UDP/TCP包出现多个自定义数据包的情况。
Lua脚本的伪代码:local p_multi = Proto("multi","MultiProto");local f_protoVersion =ProtoField.uint8("multi.protoVersion","Version",base.DEC)local f_protoCmdType =ProtoField.uint16("multi.protoCmdType","CmdType",base.DEC,{[1] = "CmdType_1",[2] = "CmdType_2",[3] = "CmdType_3",})local f_protoEncrytionType = ProtoField.uint8("multi.protoEncrytionType","EncrytionType",base.DEC,{[1] = "EncrytionType_1",[2] = "EncrytionType_2",[3] = "EncrytionType_3",})local f_protoCompressionType = ProtoField.uint8("multi.protoCompressionType","CompressionType",base.DEC,{[1] = "CompressionType_1",[2] = "CompressionType_2",[3] = "CompressionType_3",})local f_protoDataLength =ProtoField.uint32("multi.protoDataLength","DataLength",base.DEC)p_multi.fields = { f_protoVersion, f_protoCmdType, f_protoEncrytionType, f_protoCompressionType, f_protoDataLength }function DecodeBufferFunction(protoEncrytionType, protoCompressionType, buf, pos, buf_len)local decodeBuf = buf-- TODO: This artical jobreturn decodeBufendfunction p_multi.dissector(buf,pkt,root)local pos = 0local buf_len = buf:len()local t = root:add(p_multi,buf(0,buf_len))-- 协议版本(1字节)t:add(f_protoVersion, buf(pos, 1))pos = pos + 1-- 协议命令类型(2字节)t:add(f_protoCmdType, buf(pos, 2))pos = pos + 2-- 协议加密类型(1字节)t:add(f_protoEncrytionType, buf(pos, 1))local protoEncrytionType = buf(pos, 1):uint()pos = pos + 1-- 协议压缩类型(1字节)t:add(f_protoCompressionType, buf(pos, 1))local protoCompressionType = buf(pos, 1):uint()pos = pos + 1-- 协议数据长度(4字节)t:add(f_protoDataLength, buf(pos, 1))local protoDataLength = buf(pos, 4):uint()pos = pos + 4-- 协议数据(protoDataLength字节)buf = DecodeBuffer(protoEncrytionType, protoCompressionType, buf, pos, buf_len)new_buf_len = buf:len()-- TODO: add your codeend本文的主要任务是DecodeBufferFunction的实现。
用Lua语言编写Wiresharkdissector插件Wireshark是一款著名的网络协议分析工具,基于GPLv2协议开源,支持Linux、Windows、MacOS等多个操作系统。
Wireshark is the world's foremostnetwork protocol analyzer, and is the defacto (and often de jure) standard acrossmany industries and educationalinstitutions.Wireshark development thrivesthanks to the contributions of networkingexperts across the globe. It is thecontinuation of a project that started in1998.[via]Wireshark已经支持数千种协议,对新协议的支持还在不断增加。
今天,你发明了一个新的网络协议,也想让Wireshark识别,你该怎么办呢?你有两个选择:1.发布你的网络协议,等到有1,000,000人每天使用你的协议时,Wireshark就会支持你的协议2.编写一个Wireshark插件,自己动手、丰衣足食如果你选择了前者,请按下CTRL D,然后在你改变主意的时候再回来。
Wireshark和Wireshark dissector如果你还没有安装Wireshark,请下载并安装Wireshark。
从功能看,Wireshark可以分为以下几个模块:•核心•用户界面•抓包:调用libpcap或winpcap实现•协议分析:支持的数千种协议,都有相应的分析组件,称为dissector•保存/读取文件•……要让Wireshark识别你发明的协议,应该从“协议分析”部分入手,也就是编写一个Wireshark dissector。
Wireshark网络协议解析原理与新协议添加方法摘要:为了快速对自定义网络协议进行协议解析,对wireshark 网络协议解析原理与添加方法进行了深入的分析。
在此基础上,对wireshark添加自定义网络协议的解析器。
由于有效地利用了wireshark已有框架,该方式相对传统自行开发协议分析工具具有工作量少、功能强大与兼容性好的优点。
关键词:协议解析;wireshark; 网络分析0引言网络协议分析器(network analyzer)是对通用协议的数据包进行解码,并以人可读的格式显示网络流量内容的软件或设备。
由于网络协议种类繁多,各种新协议层出不穷,因此分析器必须具有良好的可扩展性,可方便地支持新的协议。
wireshark是一款免费开源的协议分析器,是目前应用最广泛的网络协议分析软件之一。
本文介绍了wireshark网络协议解析的原理与新协议添加的方法,并分析了向wireshark中添加新协议解析器的两种方法,并对自定义的网络协议给出添加步骤。
1wireshark系统结构wireshark的系统结构如图1所示,主要功能模块如下:①gtk 1/2:图形窗口工具,操控所有的用户输入/输出界面;②core:将其它模块连接起来,起到综合调度的作用;③epan:wireshark协议解析器;④capture:数据包捕获引擎,依赖于底层库winpcap/libpcap库;⑤wiretap:从磁盘读写数据包文件的引擎。
2数据包协议解析原理2.1协议树基于osi的7层协议模型,协议数据是从上到下封装后发送的,而对于协议解析需要从下至上进行。
首先对网络层的协议识别后进行组包还原,然后脱去网络层协议头,将里面的数据交给传输层分析,这样一直进行下去,直到应用层。
由于网络协议种类很多,就wireshark所识别的500多种协议来说,为使协议和协议间层次关系明晰,从而对数据流中各层次的协议能够逐层处理,wireshark系统采用了协议树的方式,如图2中所示。
基于Qt的Wireshark以太网TRDP协议解析Lua插件实现尹光辉;徐东超;林晓琳;李国斌
【期刊名称】《工业控制计算机》
【年(卷),期】2024(37)2
【摘要】TRDP(Train Real Time Data)协议作为IEC61375-2-3标准指定的设备间各个系统进行通信的协议,在列车控制与信息服务网络(Train Control and Service Network,TCSN)得到了广泛的应用。
由于TRDP协议是轨道交通私有协议,目前Wireshark软件对TRDP协议析解析尚不支持。
通过对TRDP协议进行分析,利用Qt读取Excel通信协议文件,自动化生成适用于TRDP协议解析的Lua代码插件,实现在Wireshark中对TRDP协议的识别以及对报文头首部、数据区协议内容解析,同时实现了对TRDP报文的丢包检测、周期分析功能,可以广泛应用于子系统通信之间数据一致性测试及现场列车通信调试。
【总页数】3页(P48-49)
【作者】尹光辉;徐东超;林晓琳;李国斌
【作者单位】中车青岛四方车辆研究所有限公司
【正文语种】中文
【中图分类】TP3
【相关文献】
1.基于Wireshark二次开发的地铁信号系统应用协议解析插件
2.基于Wireshark 的列控中心以太网通信协议解析器的研究与实现
3.基于Wireshark的pSIP协议解
析软件设计与实现4.基于Wireshark的铁路信号协议解析器的设计与实现5.基于Wireshark的EUHT MAC层协议解析插件的设计与实现
因版权原因,仅展示原文概要,查看原文内容请购买。
用lua语言编写Wireshark插件解析自定义协议Wireshark默认支持大量网络协议,我们可以在Wireshark主菜单“Internals > Support Protocols (slow!)”查看当前支持的所有协议。
Wireshark 1.6.2版本已支持1170种协议,包括我们熟悉的Diameter、GTP、FTP、SCTP等协议。
上述都是业界的通用协议,然而对我们产品的自定义协议,Wireshark是不得而知的,抓包后只能看到一串二进制码流,导致开发调试或者测试分析效率较低。
有什么办法让Wireshark也能解析自定义协议呢?本文介绍的用lua编写Wireshark解析器插件就是一种常用方法。
Wireshark软件内嵌一个lua语言执行引擎并提供一系列lua函数接口,从而满足用户各种各样的协议解析目的。
下面以一个简单的自定义协议为例,演示如何编写Wireshark解析插件。
不过本文只是业余学习的笔记和简单实践,不能覆盖“lua编写Wireshark解析器插件”的所有知识点(更全面的介绍请参考Wireshark软件自带手册第11章“Lua Support in Wireshark”,只是开源软件的手册似乎总是不够详尽。
)。
1. 配置Wireshark执行lua脚本通过Wireshark主菜单“Help > About Wireshark”可以查看当前安装版本已经内嵌Lua 5.1执行引擎。
默认安装情况下Wireshark会在安装路径下生成一个init.lua,它是Wireshark启动过程执行的第一个lua脚本。
一般来说,我们可以在此文件中添加dofile函数调用其他lua 脚本,实现各种扩展目的。
例如,默认安装后init.lua文件末尾有一句:dofile(DATA_DIR.."console.lua")此语句执行了安装目录下的console.lua脚本,该脚本也是Wireshark自带的,用途是在主菜单Tool下创建一个子菜单Lua。
我们甚至可以在上述语句之前添加注释--符来取消它。
dofile是lua基础库提供的一个函数,用途如下:dofile (filename)Opens the named file and executes its contents as a Lua chunk. When called without arguments, dofile executes the contents of the standard input (stdin). Returns all values returned by the chunk. In case of errors, dofile propagates the error to its caller (that is, dofile does not run in protected mode).我们下来编写的解析器也是以.lua脚本形式保存,然后在init.lua文件末尾中添加一个dofile调用即可。
2. 需要解析的自定义协议假设我们需要基于UDP协议实现一种根据员工ID查询员工姓名的信息服务,客户端向将上述协议实现之后,服务器端部署在192.168.56.1,客户端在192.168.56.22。
以下就是启动1次查询过程的Wireshark抓包结果:上图是QueryRequest消息,uEmployeeID指定为1。
上图是QueryResponse消息,返回uEmployeeID=1的查询结果。
从上面2个图可见,Wireshark已经自动地把以太网帧、IP报文、UDP数据报都解析出来,唯独我们自定义协议的消息无法解析,以Data来显示。
把上述抓包结果保存到一个pcap 文件中。
下面我们逐步实现对该协议的解析。
3. Wireshark的lua函数接口3.1. Proto 协议在Wireshark中Proto主要用途是声明一个新的协议,进而可以给它编写解析器函数。
3.1.1. Proto.new:声明一个新的协议例如:my_proto = Proto ("myProto","My Protocol for Query Employee","My Self-defined Protocol") 3.1.2. proto.dissector:解析器函数例如:function my_proto.dissector(buffer,pinfo,tree)pinfo.cols.protocol:set("myProto"):set("This is a message of myProto")enddissector函数的第一个参数buffer对应需要解析的二进制码流,第二个参数pinfo对应Packet List窗口的信息,tree是Packet Details窗口的树结构,如下图所示:Wireshark已经为我们提供了处理这三个参数的接口了。
有关buffer的lua API,可以参考官方手册“11.12. Functions for handling packet data”,如下图所示:有关pinfo的lua API,可以参考官方手册“11.9. Obtaining packet information ”,如下图所示:有关tree的lua API,可以参考官方手册“11.11. Adding information to the dissection tree”,如下图所示:把上述代码保存到一个d:/myproto.lua脚本中,并在init.lua脚本中末尾增加一句:dofile("d:/myproto.lua")然后启动Wireshark程序,就可以在协议列表中找到我们定义的协议了,如下图所示:3.2 ProtoField 协议字段(域)但凡协议都有具体的字段,Wireshark提供了25种函数可以创建各种类型字段(详细请参考帮助文档11.10.6. ProtoField)。
我前面定义的协议字段类型很简单,只有16位无符号整数、32位无符号整数、32字符长度的字符串三种。
下面是各字段的具体lua代码实现:然后我们把这些字段加到前面定义的Proto中去:my_proto.fields = { f_usMsgType, f_uiEmployeeID, f_usQueryResult, f_szEmployeeName }把上述代码追加到d:/myproto.lua脚本中,重启Wireshark就可以看到MYPROTO协议已经具有4个字段了:我们还可以在主窗口的“显示过滤表达式”快捷方式中,指定上述字段来做过滤:如下图所示,左侧Field name窗口中选择了usMsgType后,右侧显示了我们前面预定义的两个取值:3.2. DissectorTable 协议解析器表DissectorTable就是若干协议解析器(Dissector)汇集成Table,Wireshark默认支持了一系列Dissector和DissectorTable,在主菜单“Internals > Dissector tables”可以查看当前已支持的DissectorTable,如下图所示:图中所示的UDP port就是一个DissectorTable,它底下包含很多不同端口号,根据具体UDP端口号调用具体Dissector来解析协议消息。
例如UDP端口号69是TFTP协议采用的知名端口,Wireshark遇到这种消息将自动调用TFTP协议解析器来处理。
本文介绍的自定义协议基于UDP端口号12345,所以我也把它添加到UDP port这个DissectorTable下。
3.2.1. DissectorTable.get:返回指定的DissectorTable实例下面的代码首先通过DissectorTable.get获取了“udp.port”表:Local udp_port_table = DissectorTable.get("udp.port")3.2.2 dissectortable:add:向DissectorTable实例中添加dissectorLocal my_port = 12345Udp_port_table:add(my_port, my_proto)把上述代码追加到d:/myproto.lua脚本中,重启Wireshark就可以看到MYPROTO已经增加UDP port下面:不但如此,我们打开前面抓包的文件,可以看到有些东西悄悄变化了:说明前面的解析器函数已经被正确调用了,至此我们已经完成了一个解析器雏形。
下面将完善解析器函数,使之真正能够解析协议消息。
4. 自定义协议的解析器函数我们要怎么呈现解析结果呢?看看下图是Wireshark默认对UDP协议的解析结果:我们自定义协议的解析也将生成一个类似的树状结构。
前面我们已经写了一个简单的my_proto.dissector函数函数如下所示:function my_proto.dissector(buffer,pinfo,tree)pinfo.cols.protocol:set("myProto"):set("This is a message of myProto")end参数tree就是我们要构造的树状结构的根节点,通过下面两句代码添加一个子节点代表自定义协议:local buffer_len = buffer:len()local myProtoTree = tree:add(my_proto, buffer(0, buffer_len), "My Protocol for Query Employee Information")第1句表示获取buffer参数的字节长度;第二句调用了tree:add方法创建一个子节点并复制给myProtoTree,第1个参数是协议,第2个参数是buffer数据范围, 第3个参数是子节点的标题,作用类似于”User Datagram Protocol ….”那一行。
下面是解析第1个字段”消息类型”的代码:local offset = 0local usMsgType = buffer(offset,2):le_uint()if usMsgType <= 1 thenmyProtoTree:add_le(f_usMsgType, buffer(offset,2))else:set("Invalid MessageType("MsgType .. ")")returnendoffset = offset + 2第1句定义一个局部变量offset表示当前字段在buffer缓冲区的偏移量,后续每解析一个字段都要设置一下偏移量。