wireshark自定义协议插件开发

目录

脚本代码

报文显示


脚本代码

local NAME = "test"
test_proto = Proto("test", "test Protocol")


task_id = ProtoField.uint16("test.task_id", "test id", base.DEC)
cn = ProtoField.uint8("test.cn", "XXX", base.DEC)
sn = ProtoField.uint32("test.sn", "xxx", base.DEC)
indicator = ProtoField.uint32("test.indicator", "Indicator", base.DEC)
flag = ProtoField.uint8(NAME.."flag", "Flag", base.HEX)

local bit8 = {[0] = "XXX", [1] = "XXX"}
local bit7 = {[0] = "XXX", [1] = "XXX"}
local bit6 = {[0] = "XXX", [1] = "XXX"}
local bit5 = {[0] = "XXX", [1] = "XXX"}
local bit4 = {[0] = "XXX", [1] = "XXX"}
local bit3 = {[0] = "XXX", [1] = "XXX"}
local bit2 = {[0] = "Reserve", [1] = "Reserve"}
local bit1 = {[0] = "Reserve", [1] = "Reserve"}
msg_bit8 = ProtoField.uint8("msg_bit8", "bit8", base.DEC, bit8, 0x80)
msg_bit7 = ProtoField.uint8("msg_bit7", "bit7", base.DEC, bit7, 0x40)
msg_bit6 = ProtoField.uint8("msg_bit6", "bit6", base.DEC, bit6, 0x20)
msg_bit5 = ProtoField.uint8("msg_bit5", "bit5", base.DEC, bit5, 0x10)
msg_bit4 = ProtoField.uint8("msg_bit4", "bit4", base.DEC, bit4, 0x08)
msg_bit3 = ProtoField.uint8("msg_bit3", "bit3", base.DEC, bit3, 0x04)
msg_bit2 = ProtoField.uint8("msg_bit2", "bit2", base.DEC, bit2, 0x02)
msg_bit1 = ProtoField.uint8("msg_bit1", "bit1", base.DEC, bit1, 0x01)

test_proto.fields = {
    task_id,
    sn,
    indicator,
    flag,
    cn,
    msg_bit8,
    msg_bit7,
    msg_bit6,
    msg_bit5,
    msg_bit4,
    msg_bit3,
    msg_bit2,
    msg_bit1
}

function And(num1,num2)
    local tmp1 = num1
    local tmp2 = num2
    local str = ""
    repeat
        local s1 = tmp1 % 2
        local s2 = tmp2 % 2
        if s1 == s2 then
            if s1 == 1 then
                str = "1"..str
            else
                str = "0"..str
            end
        else
            str = "0"..str
        end
        tmp1 = math.modf(tmp1/2)
        tmp2 = math.modf(tmp2/2)
    until(tmp1 == 0 and tmp2 == 0)
    return tonumber(str,2)
end

-- buffer:包的数据
-- pinfo: 显示的信息
-- tree:包结构的关系
function test_proto.dissector(buffer, pinfo, tree)
    local buflen = buffer:len();
    if buflen == 0 then return end
    
    --显示在protocol列的名字
    pinfo.cols.protocol = test_proto.name 
    
    --显示在数据查看
    local test = tree:add(test_proto, buffer(), "test") 
    header_len = 8
    local test_header = test:add(test_proto, buffer(0, header_len), "test header") 
    local offset = 0;
    test_header:add(task_id, buffer(offset,2))
    offset = offset + 2;
    
    -- cn 字段解析
    test_header:add(cn, buffer(offset,1))
    offset = offset + 1;
    -- 根据flag字段,判断显示info信息 todo
    local flag_node = test_header:add(flag, buffer(offset,1))
    flag_node:add(msg_bit8, buffer(offset,1))
    flag_node:add(msg_bit7, buffer(offset,1))
    flag_node:add(msg_bit6, buffer(offset,1))
    flag_node:add(msg_bit5, buffer(offset,1))
    flag_node:add(msg_bit4, buffer(offset,1))
    flag_node:add(msg_bit3, buffer(offset,1))
    flag_node:add(msg_bit2, buffer(offset,1))
    flag_node:add(msg_bit1, buffer(offset,1))
    local ack = buffer(offset,1):uint() 
    ack_bit = And(ack, 0x80)
    offset = offset + 1;
    
    -- sn 字段解析
    test_header:add(sn, buffer(offset,4))
    sn_value = buffer(offset,4):uint()
    offset = offset + 4;
    if ack_bit == 0x80 then
        info = string.format("rx -> tx Ack Sn=%d Len=%d", sn_value, buflen)
        pinfo.cols.info = info 
    else 
        info = string.format("tx -> rx Sn=%d Len=%d", sn_value, buflen)
        pinfo.cols.info = info 
    end    
    
    local payload_len = buflen - offset;
    local test_header = test:add(test_proto, buffer(offset, payload_len), "test payload") 
    
end


local ip_protocol = DissectorTable.get("ip.proto")
ip_protocol:add(0xff, test_proto) --抓到的0xffff端口的数据,按test_proto的规则来解析
 

报文显示

  • 24
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
开发Wireshark件是一个相对简单的过程。首先,需要了解Wireshark件的结构和API。可以在Wireshark的官方文档中找到相关的信息和文档。然后,可以按照以下步骤进行Wireshark件的开发: 1. 使用C或者C++编写件代码。Wireshark件使用的是C语言和一些C++,所以需要熟悉这两种编程语言。 2. 在代码中使用Wireshark提供的API来访问和解析网络数据包。Wireshark提供了一系列函数和数据结构,用于访问网络数据包和解析协议。 3. 根据自己的需求,编写特定功能的件代码。可以是解析某个特定协议件,也可以是添加新的功能或者修改现有功能的件。 4. 编译件代码。可以使用Wireshark提供的编译工具链来编译件代码。编译后会生成一个.so(在UNIX/LINUX)或者.dll(在Windows)文件。 5. 将生成的.so或者.dll文件复制到Wireshark件目录中。在UNIX/LINUX下一般是/usr/local/lib/wireshark/plugins/目录,在Windows下一般是C:\Program Files\Wireshark\plugins\目录。 6. 重新启动Wireshark件将被加载并在Wireshark的菜单或者工具栏中显示。 为了能够在Wireshark开发和运行件,可能需要获得root或管理员权限,以便访问网络接口。在一些情况下,可能还需要安装一些依赖库或者软件,如WinPcap。 请注意,为了保证件的质量和安全性,应遵循Wireshark开发规范和最佳实践。同时,也应该遵守相关的法律法规,避免侵犯知识产权或者违反协议。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [wireshark开发](https://blog.csdn.net/comhaqs/article/details/7231968)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [wireshark开发详细流程(含源码)](https://blog.csdn.net/yang_chen_shi_wo/article/details/46669999)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值