用lua为wireshark开发的一个smpp+自定义解析插件

--新建协议
zc_smpp_plus = Proto("zc_smpp_plus","Use for ZC SMPP+ Query","ZC smpp plus Protocol")


--定义协议字段
local f_Command_Length  = ProtoField.uint32("zc_smpp_plus.Command_Length", "Command_Length", base.DEC)
local f_Command_ID      = ProtoField.uint16("zc_smpp_plus.Command_ID", "Command_ID", base.HEX,
                          {[0x00000011]="sm_sub",[0x80000011]="sm_sub_resp"})
local f_Command_status  = ProtoField.uint32("zc_smpp_plus.Command_status", "Command_status", base.DEC)
local f_Sequence_No     = ProtoField.uint32("zc_smpp_plus.Sequence_No", "Sequence_No", base.DEC)


local f_SN          = ProtoField.string("zc_smpp_plus.SN", "SN")
local f_NetType     = ProtoField.uint32("zc_smpp_plus.NetType", "NetType", base.DEC,
                      {[0]="CDMA",[1]="GSM"})
local f_CallingMsdn = ProtoField.string("zc_smpp_plus.CallingMsdn", "CallingMsdn")
local f_CalledMsdn  = ProtoField.string("zc_smpp_plus.CalledMsdn", "CalledMsdn")
local f_CallTime    = ProtoField.string("zc_smpp_plus.CallTime", "CallTime")
local f_Pay_msdn    = ProtoField.string("zc_smpp_plus.Pay_msdn", "Pay_msdn")
local f_servicekey  = ProtoField.uint32("zc_smpp_plus.servicekey", "servicekey", base.DEC,
                      {[1]="PPC",[2]="UAS",[3]="PPS"})
local f_FeeValue    = ProtoField.uint32("zc_smpp_plus.FeeValue", "FeeValue", base.DEC)
local f_SvcType     = ProtoField.uint32("zc_smpp_plus.SvcType", "SvcType", base.DEC,
                      {[1]="P2P",[2]="sp2p",[100]="DATA",[101]="WAP",[102]="Java",[103]="BREW"})
local f_Forbideid   = ProtoField.uint32("zc_smpp_plus.Forbideid", "Forbideid", base.DEC,
                      {[0]="NO",[1]="YES"})


local f_SM_Result   = ProtoField.uint32("zc_smpp_plus.SM_Result", "SM_Result", base.DEC)
local f_Balance     = ProtoField.uint32("zc_smpp_plus.Balance", "Balance", base.DEC)


--将协议字段添加到协议中
zc_smpp_plus.fields = {f_Command_Length, f_Command_ID, f_Command_status, f_Sequence_No, f_SN, f_NetType,
                       f_CallingMsdn, f_CalledMsdn, f_CallTime, f_Pay_msdn, f_servicekey, f_FeeValue,
                       f_SvcType, f_Forbideid, f_SM_Result, f_Balance}


--建立协议适配器
function zc_smpp_plus.dissector(buffer, pinfo, tree)
    --设置pinfo窗口“协议”字段现实的协议名称
    pinfo.cols.protocol:set("ZC_SMPP_PLUS")
    --获取协议协议字节长度
    local v_buffer_len = buffer:len()
    
    if v_buffer_len >= 1 then
        --截取协议字段
        local v_head       = buffer(0, 16)
        local v_Command_ID = v_head(4, 4)
        local v_body       = buffer(16, v_buffer_len - 16)
        
        --初始tree窗口协议树
        local t = tree:add(zc_smpp_plus, buffer(0, v_buffer_len), "zc_smpp_plus Query info")
        local th = t.add(t,v_head, "SMPP+ Head info")
        local tb = t.add(t,v_body, "SMPP+ Body info")
        
        --在树指定分支添加解析后字段
        th:add(f_Command_Length, v_head(0, 4))
        th:add(f_Command_ID, v_Command_ID)
        th:add(f_Command_status, v_head(8, 4))
        th:add(f_Sequence_No, v_head(12, 4))
        
        --设置一些pinfo窗口info字段内容
        pinfo.cols.info:set("Command_ID = ".. v_Command_ID)
        
        --判断消息体类型,分别解析
        if v_Command_ID:uint() == 0x00000011 then
            tb:add(f_SN,            v_body(0, 21))
            tb:add(f_NetType,       v_body(21, 1))
            tb:add(f_CallingMsdn,   v_body(22, 14))
            tb:add(f_CalledMsdn,    v_body(36, 14))
            tb:add(f_CallTime,      v_body(50, 15))
            tb:add(f_Pay_msdn,      v_body(65, 14))
            tb:add(f_servicekey,    v_body(79, 1))
            tb:add(f_FeeValue,      v_body(80, 4))
            tb:add(f_SvcType,       v_body(84, 1))
            tb:add(f_Forbideid,     v_body(85, 1))
            
        elseif v_Command_ID:uint() == 0x80000011 then
            tb:add(f_SM_Result, v_body(0, 1))
            tb:add(f_Balance,   v_body(1, 4))
        else
            t:add(zc_smpp_plus, "undef body v_Command_ID=" .. v_Command_ID)
            return
        end
        
    else
        pinfo.cols.info:set("Invalid MessageType("..v_Command_ID..")")
        return
    end
    
    return
    
end


--获取DissectorTable
local tcp_port_table = DissectorTable.get("tcp.port")
--将指定端口映射
tcp_port_table:add(1575, zc_smpp_plus)
--init.lua中插入
dofile(DATA_DIR..'lua_script\\ZCSmppPlus.lua')


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值