Como una de las mejores herramientas de captura de paquetes de red del mundo, Wireshark le permite obtener paquetes de datos específicos para que pueda analizarlos tanto sin conexión como en tiempo real. Piense en la aplicación como una forma de examinar de cerca los datos que fluyen a través de su red, lo que le permitirá detectar problemas e irregularidades.
Puede utilizar disectores si desea analizar una parte específica de los datos de un paquete. Como su nombre lo indica, este proceso “disecciona” el código, permitiéndole eliminar ciertos aspectos que necesitan su atención. Este tutorial explica cómo crear y usar disectores en Wireshark usando el lenguaje de programación Lua.
Antes de comenzar: lo que necesita saber sobre los disectores
Aunque los disectores ofrecen una forma rápida de analizar partes de un paquete de datos en Wireshark, deben seguir algunos protocolos para funcionar de forma eficaz. Estos protocolos incluyen lo siguiente:
- Cada disector que cree debe estar registrado para manejar un tipo determinado de carga útil de un protocolo diferente. Para completar este registro, debes asignar un objeto “Proto” a tu disector, que verás a continuación.
- Cuando llamas a un disector a través de Wireshark, recibe tres cosas de la aplicación:
- Objeto TVB: un búfer TVB del paquete de datos.
- Objeto TreeItem: raíz de un árbol que representa un único nodo en un árbol de datos.
- Objeto Pinfo: un registro de información de paquete.
- Solo puede llamar a un disector si su paquete de datos coincide con la DissectorTable que configuró en su objeto “Proto”.
- Puede solucionar este requisito forzando el uso de un disector mediante la función “Decodificar como”. Pero incluso entonces, sólo puedes forzar el disector si el DissectorTable que configuraste para tu objeto “Proto” es del tipo correcto.
Configurando su disector usando LUA
Como Wireshark está escrito y utiliza el lenguaje de programación C, la mayoría de los disectores están escritos de manera similar en C. Sin embargo, es posible que desee utilizar Lua. Este lenguaje de programación es más simple que C y, por lo tanto, más accesible para los recién llegados a la programación o para aquellos que simplemente desean crear un disector utilizando un lenguaje más liviano.
Aunque su código será más simple, el disector que obtiene al usar Lua suele ser más lento que el que crearía usando C. Sin embargo, estos son los pasos a seguir si desea crear un disector Wireshark usando Lua.
Paso 1: configurar Lua en Wireshark
Necesitará configurar Lua si no lo ha usado antes en Wireshark:
- Haga clic en “Ayuda”, seguido de “Acerca de Wireshark”.

- Haga clic en “Carpetas”.

- Elija una de las siguientes opciones para crear un script Lua activo:
- Complementos globales de Lua
- Complementos personales de Lua
- Personal
Una vez activado, su script estará listo cada vez que inicie Wireshark. Cada vez que realiza un cambio en ese script, debe reiniciar Wireshark para registrar el cambio o presionar “Ctrl + Shift + L” para recargar todos sus scripts Lua y activar los cambios.
Paso 2: los pasos básicos para crear su disector
Si ya está familiarizado con Lua, puede seguir los siguientes pasos para crear su propio script de disector que funcionará en Wireshark:
- Declare el protocolo para su disector, lo que requiere que establezca un nombre largo para usar en el árbol de protocolos y un nombre corto que sirva como nombre del filtro de visualización del disector.
- Cree los siguientes tres campos, con sus tipos apropiados:
- Pregunta: muestra el tipo de pregunta.
- Respuesta: muestra el tipo de respuesta.
- Tipo de mensaje: demuestra si su paquete solicita una pregunta o una respuesta.
- Registre sus campos para que Wireshark sepa cómo mostrarlos. Sin campos registrados, recibirá un mensaje de “Error de Lua”, que generalmente le indicará que su ProtoField de elemento de árbol no es válido.
- Cree una función de disección que incluya el Pinfo mencionado anteriormente (que contiene datos sobre su paquete) y el Elemento del árbol (que crea el árbol que agregará a un subárbol). También debe crear un “búfer” que se ubica encima de su TCP.
- Especifique tanto el protocolo como el puerto para el cual Wireshark debe utilizar el disector. Por ejemplo, puede configurar el protocolo en “TCP” y el número de puerto en el que desee utilizar.
Paso 3: agregue su disector a Wireshark
Ahora mismo tu disector es como una bombilla sin electricidad. Existe, pero no te sirve de nada hasta que puedas ejecutar algo de energía a través de él. En otras palabras, su disector aún no está agregado a Wireshark, por lo que debe agregarlo manualmente para que funcione siguiendo estos pasos:
- Haga clic en “Ayuda” y diríjase al menú “Acerca de Wireshark”.

- Seleccione la pestaña “Carpeta” para encontrar una lista de rutas para su archivo Lua.

- Elija “Complementos personales de Lua”. Cree un directorio si es necesario.

- Copie y pegue el archivo Lua que creó en el directorio “Complementos personales de Lua”. Vuelva a cargar Wireshark para encender el disector.
Es una buena idea realizar una prueba en su nuevo disector abriendo algunos de los paquetes que ha capturado. Wireshark debería enviar un mensaje que muestre el nombre largo que eligió para su disector, junto con información sobre el tipo de mensaje (pregunta o respuesta) y el resultado de su verificación.
Algún código de muestra
Si no has creado un disector antes (o eres nuevo en Lua), Wireshark ofrece un práctico disector de ejemplo para que lo pruebe:
local p_multi = Proto("multi", "MultiProto");
local vs_protos = {
[2] = "mtp2",
[3] = "mtp3",
[4] = "alcap",
[5] = "h248",
[6] = "ranap",
[7] = "rnsap",
[8] = "nbap"
}
local f_proto = ProtoField.uint8("multi.protocol", "Protocol", base.DEC, vs_protos)
local f_dir = ProtoField.uint8("multi.direction", "Direction", base.DEC, { [1] = "incoming", [0] = "outgoing"})
local f_text = ProtoField.string("multi.text", "Text")
p_multi.fields = { f_proto, f_dir, f_text }
local data_dis = Dissector.get("data")
local protos = {
[2] = Dissector.get("mtp2"),
[3] = Dissector.get("mtp3"),
[4] = Dissector.get("alcap"),
[5] = Dissector.get("h248"),
[6] = Dissector.get("ranap"),
[7] = Dissector.get("rnsap"),
[8] = Dissector.get("nbap"),
[9] = Dissector.get("rrc"),
[10] = DissectorTable.get("sctp.ppi"):get_dissector(3), -- m3ua
[11] = DissectorTable.get("ip.proto"):get_dissector(132), -- sctp
}
function p_multi.dissector(buf, pkt, tree)
local subtree = tree:add(p_multi, buf(0,2))
subtree:add(f_proto, buf(0,1))
subtree:add(f_dir, buf(1,1))
local proto_id = buf(0,1):uint()
local dissector = protos[proto_id]
if dissector ~= nil then
-- Dissector was found, invoke subdissector with a new Tvb,
-- created from the current buffer (skipping first two bytes).
dissector:call(buf(2):tvb(), pkt, tree)
elseif proto_id < 2 then
subtree:add(f_text, buf(2))
-- pkt.cols.info:set(buf(2, buf:len() - 3):string())
else
-- fallback dissector that just shows the raw data.
data_dis:call(buf(2):tvb(), pkt, tree)
end
end
local wtap_encap_table = DissectorTable.get("wtap_encap")
local udp_encap_table = DissectorTable.get("udp.port")
wtap_encap_table:add(wtap.USER15, p_multi)
wtap_encap_table:add(wtap.USER12, p_multi)
udp_encap_table:add(7555, p_multi)
Postdisectores y disectores encadenados
Es posible que desees profundizar un poco más en el uso de tu disector una vez que domines su creación en Lua. Wireshark ofrece dos tipos adicionales de disectores (postdisectores y disectores encadenados) que ofrecen más funcionalidad.
Un postdisector es muy parecido a una verificación final de todos los disectores que ha ejecutado para un paquete. Lo registra para recibir una notificación una vez que Wireshark haya llamado a todos los demás disectores que desea usar y puede usarlo para filtrar las columnas “Protocolo” e “Información”. Esta característica es especialmente útil si desea filtrar varios paquetes en una sesión en la que ha habido un largo intervalo entre conjuntos de datos y no puede recordar cada uno de ellos inpidualmente.
El encadenamiento de disectores cumple una función similar (al menos en términos de filtrado a través de disectores utilizados anteriormente) al brindarle acceso a los datos de un solo disector. La ventaja clave aquí es que el disector encadenado no tiene que revisar cada paquete nuevamente, lo que le brinda un resultado sin obligarlo a esperar a que el disector original vuelva a ejecutarse.
Diseccionar en Lua
Dado que Wireshark ya ofrece la posibilidad de crear disectores en C (su lenguaje natural), es posible que no vea la necesidad de crearlos también en Lua. Aún así, aquellos que no se sienten cómodos con C, así como aquellos que ya dominan Lua, pueden encontrar que las secuencias de comandos livianas de Lua facilitan la creación de sus disectores. Por supuesto, debe compensar un tiempo de carga más largo cuando ejecuta el proceso en comparación con los disectores basados en C, pero es útil tener la opción de todos modos.