Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Filter Lua-显示字段ASCII解析器_Filter_Lua_Wireshark Dissector_Protofield - Fatal编程技术网

Filter Lua-显示字段ASCII解析器

Filter Lua-显示字段ASCII解析器,filter,lua,wireshark-dissector,protofield,Filter,Lua,Wireshark Dissector,Protofield,我目前正在开发我的第一个协议剖析器。我面临着一个我无法解决的问题。基本上我有一个8字节长的字段,但定义的长度超过9字节,所以我创建了一个位字段来定义这个原型字段 以下是我到目前为止测试的字段的定义: a) local harer_id = ProtoField.string ("myProto.harer_id","Harer ID", base.ASCII) b) local harer_id = ProtoField.uint64 ("myProto.harer_id", "Har

我目前正在开发我的第一个协议剖析器。我面临着一个我无法解决的问题。基本上我有一个8字节长的字段,但定义的长度超过9字节,所以我创建了一个位字段来定义这个原型字段

以下是我到目前为止测试的字段的定义:

a) local harer_id = ProtoField.string   ("myProto.harer_id","Harer ID", base.ASCII)
b) local harer_id =  ProtoField.uint64   ("myProto.harer_id", "Harer ID", base.HEX )
然后我通过以下方式将其添加到解剖树:

  local harer_id_long = tvbuf:range(16,9)
  body:add(harer_id, harer_id_long:bitfield(4,64))
最终导致以下错误:

a) Gives no error but it doesnt return the value on ASCII format
    What I get: 0x0000000000313030
    What I want: 0x0000000000313030 (100)
b) calling 'add' on bad self (string expected, got userdata)
如果你们有任何建议,我将感谢你们的帮助

提前谢谢大家,

马丁

编辑1:

我编写了这段代码,它将从字段值的每个字节中获取ASCII表值:

我不知道如何使它工作,以便它在数据包视图上显示ASCII值

 function getASCII (str)
    resultStr = ""
    asciiValue="" 
    for i = 3, string.len(tostring(str))-1, 2 do
        asciiValue = string.char(tonumber(tostring(string.sub(tostring(str),i,i+1)), 16))
        if asciiValue~=nil then 
            resultStr = resultStr .. tostring(tonumber(asciiValue))
        end
    end
    resultStr = string.gsub(resultStr, "nil", "") 
    return resultStr
 end

也许有一种更有效的方法,但你可以试试这样的方法

harer_id = ProtoField.string("myProto.harer_id", "Harer ID", base.ASCII)

harer_item = body:add(harer_id, tvbuf(16, 9))
harer_item:set_text("Harer ID: " ..
    tonumber(
        string.char(bit.bor(bit.band(bit.lshift(tvbuf(16, 1):uint(), 4), 0xf0), bit.rshift(tvbuf(17, 1):uint(), 4))) ..
        string.char(bit.bor(bit.band(bit.lshift(tvbuf(17, 1):uint(), 4), 0xf0), bit.rshift(tvbuf(18, 1):uint(), 4))) ..
        string.char(bit.bor(bit.band(bit.lshift(tvbuf(18, 1):uint(), 4), 0xf0), bit.rshift(tvbuf(19, 1):uint(), 4))) ..
        string.char(bit.bor(bit.band(bit.lshift(tvbuf(19, 1):uint(), 4), 0xf0), bit.rshift(tvbuf(20, 1):uint(), 4))) ..
        string.char(bit.bor(bit.band(bit.lshift(tvbuf(20, 1):uint(), 4), 0xf0), bit.rshift(tvbuf(21, 1):uint(), 4))) ..
        string.char(bit.bor(bit.band(bit.lshift(tvbuf(21, 1):uint(), 4), 0xf0), bit.rshift(tvbuf(22, 1):uint(), 4))) ..
        string.char(bit.bor(bit.band(bit.lshift(tvbuf(22, 1):uint(), 4), 0xf0), bit.rshift(tvbuf(23, 1):uint(), 4))) ..
        string.char(bit.bor(bit.band(bit.lshift(tvbuf(23, 1):uint(), 4), 0xf0), bit.rshift(tvbuf(24, 1):uint(), 4)))
        )
    )

这里有一种替代方法,对我也适用。我不确定您喜欢哪一种,但您现在有两种选择,假设您可以使用我的原始方法:

local harer_id = ProtoField.uint64("myProto.harer_id", "Harer ID", base.HEX)

harer_item = body:add(harer_id, tvbuf(16, 9):bitfield(4, 64))
harer_item:set_len(9)

vals = {}
for i = 0, 7 do
    vals[i] = bit.bor(buf(16 + i, 2):bitfield(4, 8), 0x30)
end
harer_item:append_text(" (" ..
    tonumber(string.format("%c%c%c%c%c%c%c%c", vals[0], vals[1], vals[2], vals[3], vals[4], vals[5], vals[6], vals[7])) ..
    ")")
编辑:这是一个简单的Lua剖析器和示例数据包,可用于测试此解决方案:

-- Protocol
local p_foo = Proto("foo", "FOO Protocol")

-- Fields
local f_foo_res1 = ProtoField.uint8("foo.res1", "Reserved 1", base.DEC, nil, 0xf0)
local f_foo_str = ProtoField.uint64("foo.str", "String", base.HEX)
local f_foo_res2 = ProtoField.uint8("foo.res2", "Reserved 2 ", base.DEC, nil, 0x0f)
local f_foo_res3 = ProtoField.uint8("foo.res3", "Reserved 3", base.HEX)
local f_foo_ipv6 = ProtoField.ipv6("foo.ipv6", "IPv6 Address")

p_foo.fields = { f_foo_res1, f_foo_str, f_foo_res2, f_foo_res3, f_foo_ipv6 }

-- Dissection
function p_foo.dissector(buf, pinfo, tree)
    local foo_tree = tree:add(p_foo, buf(0,-1))

    pinfo.cols.protocol:set("FOO")
    foo_tree:add(f_foo_res1, buf(0, 1))

    str_item = foo_tree:add(f_foo_str, buf(0, 9):bitfield(4, 64))
    str_item:set_len(9)

    vals = {}
    for i = 0, 7 do
        vals[i] = bit.bor(buf(i, 2):bitfield(4, 8), 0x30)
    end
    str_item:append_text(" (" ..
        tonumber(string.format("%c%c%c%c%c%c%c%c", vals[0], vals[1], vals[2], vals[3], vals[4], vals[5], vals[6], vals[7])) ..
        ")")

    foo_tree:add(f_foo_res2, buf(9, 1))
    foo_tree:add(f_foo_res3, buf(10, 1))
    foo_tree:add(f_foo_ipv6, buf(11, 16))
end

-- Registration
local udp_table = DissectorTable.get("udp.port")
udp_table:add(33333, p_foo)
用于将此数据转换为Wireshark可以读取或使用Wireshark的文件->从十六进制转储导入的数据包。。。特色:

我的Wireshark详细信息: 使用Qt 5.6.2编译64位,使用WinPcap 4_1_3,使用GLib 2.42.0,使用 zlib 1.2.8,SMI 0.4.8,c-ares 1.12.0,Lua 5.2.4,GnuTLS 3.4.11,使用Gcrypt 1.7.6,使用MIT Kerberos,使用GeoIP,使用nghttp2 1.14.0, 使用LZ4,使用Snappy,使用libxml2.9.4,使用QtMultimedia,使用AirPcap,使用
SBC和SpanDSP.

body和harer来自哪里?您在哪里使用harer_id?请提供所有相关信息。harer_id的定义在我共享的代码上。然后,body是解剖树的子树,我在其中添加harer_id字段local tree=root:addudpProto,tvbuf:range0,pktlen local header=tree:addheader,tvbuf:range0,HDR_LEN local body=tree:addbody,tvbuf:range9,BODY_LEN这里的问题是如何定义字段,以便当它显示在数据包详细信息区域时,ASCII值也将显示。我有一个8字节长但定义超过9字节的字段-什么?是的。。。这就是使事情变得复杂的原因。。这9个字节的前4位和后4位来自我想要的前后字段。面具应该是0x0FFFFFFFFFFF0谢谢你的回答,我真的很喜欢你提出的想法。但是,我不知道我是否做错了什么,或者是什么,但是。。。它返回Harer-ID:仅此而已。您对我应该如何修改代码有什么建议吗?我没有得到任何调试错误我不知道为什么它不适合你;它在我的测试中起作用。我会提出另一种解决方案……我真的很喜欢你提出的解决方案,但它们似乎不适合我。我会做错什么?Lua错误…:尝试连接一个空值我用更多细节修改了我的答案。你应该能够使用我提供的Lua脚本,并根据我提供的包进行测试。非常感谢你,伙计!非常感谢你的努力!我已经设法让你的例子起作用了,这很好。我觉得我知道我的代码发生了什么。问题是,在我的代码中,大多数字段都是00,因此当转换为ASCII时,它会尝试连接一个nil值并中断。我设法解决了这个问题,我将编辑您的答案,使其更加完整,如果您愿意,请看一看。但是,无论如何,非常感谢!你为我节省了很多时间,并提出了非常好的可行解决方案您的编辑还可以,但我修改了我的解决方案,无条件地将0x30设置为该值。如果它已经是一个ASCII数字0x30-0x39,则无关紧要,但如果它是一个二进制0x00,则它们将转换为ASCII 0x30。这只是避免了检查它是否小于0x30。不过,还是用你更喜欢的方法吧。
0000  00 0e b6 00 00 02 00 0e b6 00 00 01 08 00 45 00
0010  00 37 00 00 40 00 40 11 b5 ea c0 00 02 65 c0 00
0020  02 66 82 35 82 35 00 23 00 00 03 03 13 23 33 43
0030  53 63 70 80 64 20 01 0d b8 00 00 00 00 00 00 00
0040  00 00 00 00 01