2012-05-01 26 views
6

En primer lugar, soy nuevo en Lua en general, y este es mi primer intento de escribir un dissector wireshark.Wirshark Disector en Lua

Mi protocolo es sencillo: un campo de 2 bytes de longitud, seguido de una cadena de esa longitud.

Cuando ejecuto el código a través de la consola Lua, todo funciona como se esperaba.

Cuando se añade el código para el directorio de plugins de Wireshark, me sale el error

Lua Error: [string "C:\Users...\AppData\Roaming\Wireshark..."]:15: calling 'add' on bad self (number expected, got string)

Línea 15 corresponde es la línea t:add(f_text....

¿Alguien puede explicar la discrepancia entre los métodos de ejecución?

do 
    local p_multi = Proto("aggregator","Aggregator"); 

    local f_len = ProtoField.int16("aggregator.length","Length",base.DEC) 
    local f_text = ProtoField.string("aggregator.text","Text") 

    p_multi.fields = { f_len, f_text } 

    local data_dis = Dissector.get("data") 

    function p_multi.dissector(buf,pkt,root) 
      pkt.cols.protocol = "Aggregator" 
      local len = buf(0,2):int() 
      local t = root:add(p_multi,buf(0,len+2)) 
      t:add(f_len,buf(0,2),"Length: " .. buf(0,2):int()) 
      t:add(f_text,buf(2,len),"Text: " .. buf(2,len):string()) 
    end 

    local tcp_encap_table = DissectorTable.get("tcp.port") 
    tcp_encap_table:add(4321,p_multi) 
end 
+0

Notaré que he usado http: //www.wireshark .org/docs/wsug_html_chunked/wslua_dissector_example.html y http://wiki.wireshark.org/Lua/Dissectors en busca de inspiración. ¿Hay alguna buena fuente de documentación API? – Edgemaster

+0

[Capítulo 11] (http://www.wireshark.org/docs/wsug_html_chunked/wsluarm.html) de la Guía del usuario es la documentación de API para la interfaz de Lua. Las secciones 11.10, 11.11 y 11.12 son la interfaz funcional. Más allá de eso, no hay realmente ninguna documentación que se tenga. Me parece que su disector debería funcionar como está escrito. Su código muestra que obtiene una referencia al disector de datos ('local data_dis = Dissector.get (" data ")'), pero que no lo usa. ¿Es este tu código disector completo? Si no, puedes estar alterando accidentalmente 't' en algún lugar que no se muestra aquí. – multipleinterfaces

+0

Es mi código disector completo, data_dis es un hang-over de las muestras vinculadas. – Edgemaster

Respuesta

6

Su código de disección es muy cercano al correcto, pero usted está haciendo un trabajo extra que la interfaz no aceptará. Si cambia de función dissector como tal,

function p_multi.dissector(buf,pkt,root) 
     pkt.cols.protocol = "Aggregator" 
     local len = buf(0,2):int() 
     local t = root:add(p_multi,buf(0,len+2)) 
     t:add(f_len,buf(0,2)) --let Wireshark do the hard work 
     t:add(f_text,buf(2,len)) --you've already defined their labels etc. 
end 

que obtendrá el comportamiento deseado. Las etiquetas "Texto" y "Longitud" ya están definidas para sus campos, por lo que no es necesario volver a proporcionarlas en las líneas 15 y 16.

+0

Gracias. Publiqué esta pregunta apresuradamente antes de dejar el trabajo, y tomarme el tiempo para pensar más esto ahora tiene más sentido. Aunque, todavía estoy confundido sobre por qué funcionó a través de la consola Lua. – Edgemaster