wireshark使用lua解析自定义协议

wireshark解析自定义协议

  • 1.自定义的lua放入路径
  • 2.修改init.lua
    • 2.1 开启lua
    • 2.2 init.lua文件最后加入自己的lua文件位置,这里需要确保与自己的文件名相同
  • 3.编写lua
  • 4.编写c抓包
  • 5.wireshark添加自定义协议
  • 如何加调试信息

1.自定义的lua放入路径

一般是自己软件的安装位置,也可以通过wireshark查看,这里我是直接放到init.lua同一路径就行
在这里插入图片描述

2.修改init.lua

2.1 开启lua

在这里插入图片描述

2.2 init.lua文件最后加入自己的lua文件位置,这里需要确保与自己的文件名相同

在这里插入图片描述

3.编写lua


--  这里custom_protocol 就是下一步在wireshark 新增协议的名字
-- 注册协议名称
local proto_custom = Proto("custom_protocol", "Custom Protocol")  -- 创建一个名为 "custom_protocol" 的协议,显示名称为 "Custom Protocol"--下面的格式就是协议解析出来输出的格式,理论上前两个字段必填,base.DEC为输出的格式,DEC:十进制  HEX:十六进制 BIN:二进制
-- 定义协议字段
local f_dest_mac = ProtoField.bytes("custom_protocol.dest_mac", "Destination MAC")  -- 目标MAC地址字段
local f_src_mac = ProtoField.bytes("custom_protocol.src_mac", "Source MAC")  -- 源MAC地址字段
local f_eth_type = ProtoField.uint16("custom_protocol.eth_type", "Ethernet Type")  -- 以太网类型字段
local f_three_bit = ProtoField.uint8("custom_protocol.three_bit", "3-bit Field", base.DEC, nil, 0xE0)  -- 3位字段,位掩码为0xE0
local f_five_bit = ProtoField.uint8("custom_protocol.five_bit", "5-bit Field", base.DEC, nil, 0x1F)  -- 5位字段,位掩码为0x1F
local f_version = ProtoField.uint8("custom_protocol.version", "IP Version")  -- IP版本字段
local f_type = ProtoField.uint8("custom_protocol.type", "Type")  -- 类型字段
local f_length = ProtoField.uint16("custom_protocol.length", "Packet Length")  -- 包长度字段
local f_src_ip = ProtoField.ipv4("custom_protocol.src_ip", "Source IP")  -- 源IP地址字段
local f_dest_ip = ProtoField.ipv4("custom_protocol.dest_ip", "Destination IP")  -- 目标IP地址字段
local f_ttl = ProtoField.uint8("custom_protocol.ttl", "TTL")  -- 生存时间(TTL)字段
local f_flags = ProtoField.uint8("custom_protocol.flags", "Flags")  -- 标志字段
local f_proto_type = ProtoField.uint16("custom_protocol.proto_type", "Protocol Type")  -- 协议类型字段
local f_data_len = ProtoField.uint16("custom_protocol.data_len", "Data Length")  -- 数据长度字段
local f_data = ProtoField.string("custom_protocol.data", "Data")  -- 数据字段-- 将字段添加到协议
proto_custom.fields = {  -- 将所有定义的字段添加到协议字段列表中f_dest_mac,f_src_mac,f_eth_type,f_three_bit,f_five_bit,f_version,f_type,f_length,f_src_ip,f_dest_ip,f_ttl,f_flags,f_proto_type,f_data_len,f_data
}--buffer(offset, 1):bitfield(0, 3)  offset代表起始地址,1代表从起始地址开始的1字节  bitfield中0代表从这个字节的0bit开始, 3代表取三位(也就是取1字节的前3位)
--buffer(offset, 3):bitfield(4, 16)	这个就是取三字节中的4--20-- 解析函数
function proto_custom.dissector(buffer, pinfo, tree)-- 设置协议名称pinfo.cols.protocol = proto_custom.name  -- 将协议名称显示在协议列中-- 检查缓冲区长度是否足够local packet_len = buffer:len()if packet_len < 14 then  -- 如果包长度小于14字节,则退出解析returnend-- 解析以太网头部local eth_dst_mac = buffer(0, 6)  -- 获取前6字节为目标MAC地址local eth_src_mac = buffer(6, 6)  -- 接下来的6字节为源MAC地址local eth_type = buffer(12, 2):uint()  -- 接下来的2字节为以太网类型-- 解析自定义二层字段local offset = 14  -- 偏移量设置为14,跳过以太网头部local three_bit = buffer(offset, 1):bitfield(0, 3)  -- 提取自定义字段的前3位local five_bit = buffer(offset, 1):bitfield(3, 5)  -- 提取剩下的5-- 解析三层协议offset = offset + 1  -- 更新偏移量local version = buffer(offset, 1):uint()  -- 读取IP版本字段local type = buffer(offset + 1, 1):uint()  -- 读取类型字段local length = buffer(offset + 2, 2):uint()  -- 读取包长度字段local src_ip = buffer(offset + 4, 4):ipv4()  -- 读取源IP地址字段local dest_ip = buffer(offset + 8, 4):ipv4()  -- 读取目标IP地址字段local ttl = buffer(offset + 12, 1):uint()  -- 读取TTL字段local flags = buffer(offset + 13, 1):uint()  -- 读取标志字段-- 解析四层协议offset = offset + 14  -- 更新偏移量local proto_type = buffer(offset, 2):uint()  -- 读取协议类型字段local data_len = buffer(offset + 2, 2):uint()  -- 读取数据长度字段local data = buffer(offset + 4, data_len):string()  -- 读取数据字段-- 在树形视图中添加协议local custom_tree = tree:add(proto_custom, buffer(), "USLP")  -- 添加自定义协议的根节点到树形视图custom_tree:add(f_dest_mac, eth_dst_mac)  -- 显示目标MAC地址custom_tree:add(f_src_mac, eth_src_mac)  -- 显示源MAC地址custom_tree:add(f_eth_type, eth_type)  -- 显示以太网类型-- 添加 Layer 2 协议字段local layer2_tree = tree:add(proto_custom, buffer(), "TFDZ")  -- 添加自定义二层协议节点到树形视图layer2_tree:add(f_three_bit, buffer(14, 1))  -- 显示3位字段layer2_tree:add(f_five_bit, buffer(14, 1))  -- 显示5位字段-- 添加 Layer 3 协议字段local layer3_tree = tree:add(proto_custom, buffer(), "EPP")  -- 添加自定义三层协议节点到树形视图layer3_tree:add(f_version, version)  -- 显示IP版本layer3_tree:add(f_type, type)  -- 显示类型字段layer3_tree:add(f_length, length)  -- 显示包长度layer3_tree:add(f_src_ip, src_ip)  -- 显示源IP地址layer3_tree:add(f_dest_ip, dest_ip)  -- 显示目标IP地址layer3_tree:add(f_ttl, ttl)  -- 显示TTLlayer3_tree:add(f_flags, flags)  -- 显示标志-- 添加 Layer 4 协议字段-- 假如这里需要将layer4_tree 假如到layer3_tree去,而不是单独显示则-- local layer4_tree = layer3_tree:add(proto_custom, buffer(), "IPE")local layer4_tree = tree:add(proto_custom, buffer(), "IPE")  -- 添加自定义四层协议节点到树形视图layer4_tree:add(f_proto_type, proto_type)  -- 显示协议类型layer4_tree:add(f_data_len, data_len)  -- 显示数据长度layer4_tree:add(f_data, data)  -- 显示数据字段
end-- 147 要与抓包是写入的值相等
-- 注册 dissector 并绑定到 DLT 147
local wtap_encap_table = DissectorTable.get("wtap_encap")  -- 获取用于注册自定义协议的封装类型表
wtap_encap_table:add(147, proto_custom)  -- 将自定义协议绑定到封装类型147,用于指定的捕获文件格式

4.编写c抓包

这里需要注意的就是147一定与lua中的值相等

#include <sys/time.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <arpa/inet.h>struct _timeval {uint32_t tv_sec;   uint32_t tv_usec;  
};struct _pcap_pkthdr {struct _timeval ts;uint32_t caplen;uint32_t len;
};struct pcap_global_header {uint32_t magic_number;uint16_t version_major;uint16_t version_minor;int32_t thiszone;uint32_t sigfigs;uint32_t snaplen;uint32_t network;
};struct layer2_header {uint8_t dest_mac[6];uint8_t src_mac[6];uint16_t eth_type;uint8_t custom_field1:3;  // 3-bit 字段uint8_t custom_field2:5;  // 5-bit 字段
};struct layer3_header {uint8_t version;uint8_t type;uint16_t length;uint32_t src_ip;uint32_t dest_ip;uint8_t ttl;uint8_t flags;
};struct layer4_header {uint16_t proto_type;uint16_t data_len;uint8_t data[256];
};int writePcap(int fd, char *buf, int len, struct timeval tv) {struct _pcap_pkthdr h;h.ts.tv_sec = (uint32_t)tv.tv_sec;h.ts.tv_usec = (uint32_t)tv.tv_usec;h.caplen = len;h.len = len;write(fd, &h, sizeof(h));write(fd, buf, len);return 0;
}int writeGlobalHeader(int fd) {struct pcap_global_header global_header;global_header.magic_number = 0xa1b2c3d4;global_header.version_major = 2;global_header.version_minor = 4;global_header.thiszone = 0;global_header.sigfigs = 0;global_header.snaplen = 65535;global_header.network = 147;  // 自定义协议类型编号return write(fd, &global_header, sizeof(global_header)) == sizeof(global_header) ? 0 : -1;
}int main() {int fd = open("./custom_protocol.pcap", O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR);if (fd == -1) {perror("打开文件失败");return 1;}if (writeGlobalHeader(fd) != 0) {close(fd);return 1;}struct layer2_header l2 = {.dest_mac = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff},.src_mac = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06},.eth_type = htons(0x1234),.custom_field1 = 2,.custom_field2 = 8};struct layer3_header l3 = {.version = 4,.type = 1,.length = htons(20),.src_ip = htonl(0xC0A80001),.dest_ip = htonl(0xC0A80002),.ttl = 64,.flags = 2};struct layer4_header l4 = {.proto_type = htons(0x5678),.data_len = htons(5),.data = "hello"};uint8_t packet[1024];int len = 0;memcpy(packet, &l2, sizeof(l2));len += sizeof(l2);memcpy(packet + len, &l3, sizeof(l3));len += sizeof(l3);memcpy(packet + len, &l4, sizeof(l4));len += sizeof(l4);struct timeval tv;gettimeofday(&tv, NULL);writePcap(fd, (char*)packet, len, tv);close(fd);printf("Custom protocol pcap file generated successfully.\n");return 0;
}

5.wireshark添加自定义协议

在这里插入图片描述
这里header size 写0 代表从开始解析协议
在这里插入图片描述
PS:lua中不要定义名字相同的变量

如何加调试信息

直接print(“value:”, value)

需要再lua console中查看
工具 --> lua -->console
这里需要打开后双击某个具体的数据包,才会打印解析函数中的print,如果是要打印解析函数外的print,则直接cmd执行wireshark.exe

简单记录方法,方便以后回顾,具体lua语法有需要自己百度一下~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/478068.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ISAAC Gym 7. 使用箭头进行数据可视化

在这里发布一个ISAAC GYM可以使用的箭头绘制类。 gymutil默认有WireframeBoxGeometry&#xff0c;WireframeBBoxGeometry&#xff0c; WireframeSphereGeometry三个线段集生成函数&#xff0c;可以绘制盒子和球体。绘制函数分别有draw_lines和draw_line。 同理&#xff0c;使…

【计算机网络】网段划分

一、为什么有网段划分 IP地址 网络号(目标网络) 主机号(目标主机) 网络号: 保证相互连接的两个网段具有不同的标识 主机号: 同一网段内&#xff0c;主机之间具有相同的网络号&#xff0c;但是必须有不同的主机号 互联网中的每一台主机&#xff0c;都要隶属于某一个子网 -&…

机器学习周志华学习笔记-第5章<神经网络>

机器学习周志华学习笔记-第5章<神经网络> 卷王&#xff0c;请看目录 5模型的评估与选择5.1 神经元模型5.2 感知机与多层网络5.3 BP(误逆差)神经网络算法 5.4常见的神经网络5.4.1 RBF网络&#xff08;Radial Basis Function Network&#xff0c;径向基函数网络&#xff0…

MySQL数据库设计

数据库设计 数据库是用来存在数据的&#xff0c;需要设计合理的数据表来存放数据–能够完成数据的存储&#xff0c;同时能够方便的提取应该系统所需的数据 1. 数据库的设计流程 数据库是为应用系统服务的&#xff0c;数据库的数据存储也是由应用系统决定的 当我们进行应用系统开…

Spring Boot 3.x + OAuth 2.0:构建认证授权服务与资源服务器

Spring Boot 3.x OAuth 2.0&#xff1a;构建认证授权服务与资源服务器 前言 随着Spring Boot 3的发布&#xff0c;我们迎来了许多新特性和改进&#xff0c;其中包括对Spring Security和OAuth 2.0的更好支持。本文将详细介绍如何在Spring Boot 3.x版本中集成OAuth 2.0&#xf…

数据可视化复习2-绘制折线图+条形图(叠加条形图,并列条形图,水平条形图)+ 饼状图 + 直方图

目录 目录 一、绘制折线图 1.使用pyplot 2.使用numpy ​编辑 3.使用DataFrame ​编辑 二、绘制条形图&#xff08;柱状图&#xff09; 1.简单条形图 2.绘制叠加条形图 3.绘制并列条形图 4.水平条形图 ​编辑 三、绘制饼状图 四、绘制散点图和直方图 1.散点图 2…

logback 初探学习

logback 三大模块 记录器&#xff08;Logger&#xff09;、追加器&#xff08;Appender&#xff09;和布局&#xff08;Layout&#xff09; 配置文件外层最基本的标签如图示 xml中定义的就是这个三个东西下面进入学习 包引入参考springboot 官方文档 Logging :: Spring Boo…

Linux:自定义Shell

本文旨在通过自己完成一个简单的Shell来帮助理解命令行Shell这个程序。 目录 一、输出“提示” 二、获取输入 三、切割字符串 四、执行指令 1.子进程替换 2.内建指令 一、输出“提示” 这个项目基于虚拟机Ubuntu22.04.5实现。 打开终端界面如图所示。 其中。 之前&#x…

《图像梯度与常见算子全解析:原理、用法及效果展示》

简介:本文深入探讨图像梯度相关知识&#xff0c;详细介绍图像梯度是像素灰度值在不同方向的变化速度&#xff0c;并以 “pig.JPG” 图像为例&#xff0c;通过代码展示如何选取图像部分区域并分析其像素值以论证图像梯度与边缘信息的关联。接着全面阐述了 Sobel 算子&#xff0c…

项目进度计划表:详细的甘特图的制作步骤

甘特图&#xff08;Gantt chart&#xff09;&#xff0c;又称为横道图、条状图&#xff08;Bar chart&#xff09;&#xff0c;是一种用于管理时间和任务活动的工具。 甘特图由亨利劳伦斯甘特&#xff08;Henry Laurence Gantt&#xff09;发明&#xff0c;是一种通过条状图来…

A045-基于spring boot的个人博客系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

QT基础 编码问题 定时器 事件 绘图事件 keyPressEvent QT5.12.3环境 C++实现

一、编码问题 在计算机编程中&#xff0c;流&#xff08;Stream&#xff09;是一种抽象的概念&#xff0c;用于表示数据的输入或输出。根据处理数据的不同方式&#xff0c;流可以分为字节流&#xff08;Byte Stream&#xff09;和字符流&#xff08;Character Stream&#xff0…

Python爬虫项目 | 二、每日天气预报

文章目录 1.文章概要1.1 实现方法1.2 实现代码1.3 最终效果1.3.1 编辑器内打印显示效果实际应用效果 2.具体讲解2.1 使用的Python库2.2 代码说明2.2.1 获取天气预报信息2.2.2 获取当天日期信息&#xff0c;格式化输出2.2.3 调用函数&#xff0c;输出结果 2.3 过程展示 3 总结 1…

百度在下一盘大棋

这两天世界互联网大会在乌镇又召开了。 我看到一条新闻&#xff0c;今年世界互联网大会乌镇峰会发布“2024 年度中国互联网企业创新发展十大典型案例”&#xff0c;百度文心智能体平台入选。 这个智能体平台我最近也有所关注&#xff0c;接下来我就来讲讲它。 百度在下一盘大棋…

UG NX二次开发(C++)-UIStyler-指定平面的对象和参数获取

文章目录 1、前言2、在UG NX中创建平面和一个长方体,3、在UI Styler中创建一个UI界面4、在VS中创建一个工程4.1 创建并添加工程文件4.2 在Update_cb方法中添加选择平面的代码4.3 编译完成并测试效果1、前言 在采用NXOpen C++进行二次开发时,采用Menu/UIStyler是一种很常见的…

【软考】数据库

1. 数据模型 1.1 概念数据模型 概念数据模型一般用 E-R 图表示&#xff0c;常用术语如下&#xff1a; 实体&#xff1a;客观存在的事物&#xff0c;如&#xff1a;一个单位、一个职工、一个部门、一个项目。属性&#xff1a;学生实体有学号、姓名、出生日期等属性。码&#…

【强化学习的数学原理】第04课-值迭代与策略迭代-笔记

学习资料&#xff1a;bilibili 西湖大学赵世钰老师的【强化学习的数学原理】课程。链接&#xff1a;强化学习的数学原理 西湖大学 赵世钰 文章目录 一、值迭代算法二、策略迭代算法三、截断策略迭代算法四、本节课内容summary 一、值迭代算法 值迭代算法主要包括两部分。 第一…

jupyter notebook的 markdown相关技巧

目录 1 先选择为markdown类型 2 开关技巧 2.1 运行markdown 2.2 退出markdown显示效果 2.3 注意点&#xff1a;一定要 先选择为markdown类型 3 一些设置技巧 3.1 数学公式 3.2 制表 3.3 目录和列表 3.4 设置各种字体效果&#xff1a;加粗&#xff0c;斜体&#x…

Spring Boot3远程调用工具RestClient

Spring Boot3.2之后web模块提供了一个新的远程调用工具RestClient&#xff0c;它的使用比RestTemplate方便&#xff0c;开箱即用&#xff0c;不需要单独注入到容器之中&#xff0c;友好的rest风格调用。下面简单的介绍一下该工具的使用。 一、写几个rest风格测试接口 RestCont…

vscode可以编译通过c++项目,但头文件有红色波浪线的问题

1、打开 VSCode 的设置&#xff0c;可以通过快捷键 Ctrl Shift P 打开命令面板&#xff0c;然后搜索并选择 “C/C: Edit Configurations (JSON)” 命令&#xff0c;这将在 .vscode 文件夹中创建或修改 c_cpp_properties.json 文件 {"configurations": [{"name…