首页 > 其他分享 >scapy编写自定义协议

scapy编写自定义协议

时间:2024-03-12 14:55:57浏览次数:29  
标签:TRILL val scapy BitField length 编写 pkt op 自定义

编写自定义格式的步骤如下

  1. 首先先定义一个类,把所有的字段标注下来,每个字段占用几个字节或者几个bit
    例子:我们这里需要构造一个trill协议的数据包,但是scapy没有对这个的支持,查看官方的协议手册 https://www.rfc-editor.org/rfc/rfc6325.html#section-3.8
class TRILL(Packet):
    name = "TRILL"
    fields_desc = [
        # TRILL 版本号(2位)
        BitField("version", 0, 2),
        # 保留字段(2位)
        BitField("reserved", 0, 2),
        # 多播标志(1位)
        BitField("multicast", 0, 1),
        # 操作长度(Op-Length,5位)
        BitField("op_length", 0, 5),
        # 跳数限制(6位)
        BitField("hop_count", 0, 6),
        # 入口 RBridge 昵称(16位)
        ShortField("ingress_nick", None),
        # 出口 RBridge 昵称(16位)
        ShortField("egress_nick", None),
        # TRILL 头部选项(可变长度)
        # 这里仅作为示例,实际中可能需要根据 TRILL 规范定义具体的选项字段
        # ByteField("options", 0),
    ]

然后上面缺少一个可变字段option,接下来需要自定义field成帧函数,实现可变字段的功能,
上面的BitField,ShortField,ByteField都是成帧函数

class OptionField(Field):
    def __init__(self, name, default):
        Field.__init__(self,name, default)
    def addfield(self,pkt,s,val):
        if pkt.op_length:
            if type(val)==bytes:
                return s+val+bytes(pkt.op_length*4-len(val))
            else:
                return s+val.encode()+bytes(pkt.op_length*4-len(val))
        else:
            return s

我们一般只要写add就可以组包,getField是解析的时候用的,如果你不要解析就不用
其中关于参数pkt,s,val的说明
pkt是指当前的数据包是一个对象,s 是数据包的bytes真实数据,val是传进来的参数的值,传进来是什么类型就是什么 类型,然后修改trill协议类,增加一个option字段,option字段受op_length控制

class TRILL(Packet):
    name = "TRILL"
    fields_desc = [
        # TRILL 版本号(2位)
        BitField("version", 0, 2),
        # 保留字段(2位)
        BitField("reserved", 0, 2),
        # 多播标志(1位)
        BitField("multicast", 0, 1),
        # 操作长度(Op-Length,5位)
        BitField("op_length", 0, 5),
        # 跳数限制(6位)
        BitField("hop_count", 0, 6),
        # 入口 RBridge 昵称(16位)
        ShortField("ingress_nick", None),
        # 出口 RBridge 昵称(16位)
        ShortField("egress_nick", None),
        # TRILL 头部选项(可变长度)
        # 这里仅作为示例,实际中可能需要根据 TRILL 规范定义具体的选项字段
        OptionField("options", None)
    ]

标签:TRILL,val,scapy,BitField,length,编写,pkt,op,自定义
From: https://www.cnblogs.com/codedingzhen/p/18067636

相关文章

  • carousel 轮播自定义进度条
    <!--VueSFC--><template><divclass="propor-box"><divclass="p20"><div><el-carousel:interval="5000"arrow="always"height="250px">&......
  • cnetos7 ISO 镜像自定义制作
    简介:  此自定义镜像针对centos7系统版本,通过tar打包原系统服务将其放入ISO镜像中在安装时执行解压导入新安装系统中实现系统服务的自定义安装。针对cnetos7目前只测试出这一种方案,暂时没找到其他好的方案实现系统的模板ISO制作,目前版本存在缺陷镜像中的tar包非加密......
  • Vue3自定义指令实现权限控制
    使用Pinia(Vue.js的轻量级状态管理库,是Vuex的替代品)来管理用户权限,并结合自定义指令控制元素的显隐。步骤操作如下:1、安装Pinia:npminstallpinia或yarnaddpinia解释:安装Pinia库,这是一个轻量级的状态管理库,适用于Vue3。2、创建PiniaStore://stores/user.jsimport{......
  • SpringBoot自定义validation注解校验参数只能为指定的值
    需求:实体类中某个属性的值必须为指定的值,比如0或者1SpringBoot版本:2.4.8validation 依赖<!--数据校验--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>......
  • 用Python编写自己的微型Redis
    building-a-simple-redis-server-with-python前几天我想到,写一个简单的东西会很整洁 雷迪斯-像数据库服务器。虽然我有很多WSGI应用程序的经验,数据库服务器展示了一种新颖挑战,并被证明是学习如何工作的不错的实际方法Python中的套接字。在这篇文章中,我将分享我在此过程中......
  • 实验1 C语言输入输出和简单程序编写
    task1_1.c`#include<stdio.h>include<stdlib.h>intmain(){printf("O\n");printf("\n");printf("II\n");printf("O\n");printf("\n");printf("II\n");system("pause&......
  • Qt 自定义控件
    参考:https://blog.csdn.net/danshiming/article/details/134383612https://blog.csdn.net/u011832219/article/details/128531359 1、创建自定义控件新建qt项目(项目1),选择其他项目中的“Qt设计师自定义控件”,构建套件的版本类型需要与'帮助'列表中'AboutQtCreator'弹窗的......
  • uniapp自定义导航栏
    uniapp项目自定义顶部导航栏1.创建组件完整代码navigation.vue<template><viewclass="navbar-header":style="isfixed?'padding-top'+navHeight+'px':'padding-top:0px'"><viewclass="navbarcustom......
  • RAG实战5-自定义prompt
    RAG实战5-自定义prompt在阅读本文之前,先阅读RAG实战4。在RAG实战4中我们分析了LlamaIndex中RAG的执行过程,同时留下了一个尚待解决的问题:LlamaIndex中提供的prompttemplate都是英文的,该如何使用中文的prompttemplate呢?直接看以下代码:importloggingimportsysimporttorchf......
  • 自定义事件提醒程序
    因为各大软件无法实现每隔自定义固定天数进行事件提醒的功能,在此用Python写了一个简易的Windows端事件提醒弹窗程序。注意没有做界面,只是把事件写死在了程序中,设置为开机自启动,挂在后台一直运行(cpu占用率几乎为0%),到点就会进行弹窗提醒。Step0.环境配置建议新建一个环境,后面用......