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 fuera de línea 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 permite detectar problemas e irregularidades.
Puede usar 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, lo que le permite eliminar ciertos aspectos que requieren 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 manera efectiva. 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, debe asignar un objeto 'Proto' a su disector, que verá a continuación.
- Cuando llama 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: una raíz de árbol que representa un solo nodo en un árbol de datos.
- Objeto Pinfo: un registro de información de paquetes.
- 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 a través de la función 'Decodificar como'. Pero incluso entonces, solo puede forzar el disector si la DissectorTable que configuró en su objeto 'Proto' es del tipo correcto.
Configuración de su disector usando LUA
Como Wireshark está escrito y usa 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 usar Lua. Este lenguaje de secuencias de comandos es más simple que C y, por lo tanto, más accesible para los recién llegados a la codificación o para aquellos que simplemente desean crear un disector usando un lenguaje más liviano.
cómo comprobar la velocidad de mi ram
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
Deberá configurar Lua si no lo ha usado en Wireshark antes:
- Haga clic en 'Ayuda', seguido de 'Acerca de Wireshark'.
- Haz clic en 'Carpetas'.
- Elija uno de los siguientes 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 realice un cambio en ese script, debe reiniciar Wireshark para registrar el cambio o presionar 'Ctrl + Shift + L' para volver a cargar todos sus scripts de Lua para activar sus 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 de 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.
- MessageType: 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 indica 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 de árbol (que crea el árbol que agregará a un subárbol). También debe crear un 'búfer', que se encuentra en la parte superior de su TCP.
- Especifique tanto el protocolo como el puerto para los que Wireshark debe usar el disector. Por ejemplo, puede establecer el protocolo en 'TCP' y el número de puerto en el que desee utilizar.
Paso 3: agregue su disector a Wireshark
En este momento, su disector es como una bombilla sin electricidad. Existe, pero no te sirve de nada hasta que puedas pasar algo de energía a través de él. En otras palabras, su disector aún no se ha 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 'Personal Lua Plugins'. Recarga 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 debe entregar 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.
cómo ver quién te sigue en twitch
Algo de código de muestra
Si no ha creado un disector antes (o es nuevo en Lua), Tiburón alambre ofrece un útil 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 desee profundizar un poco más en el uso de su disector una vez que haya dominado su creación en Lua. Wireshark ofrece dos tipos adicionales de disectores, postdisectores y disectores encadenados, que ofrecen más funcionalidad.
Un disector posterior se parece mucho 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 que use, y puede usarlo para filtrar las columnas 'Protocolo' e 'Información'. Esta función es especialmente útil si desea filtrar varios paquetes en una sesión en la que ha tenido una gran brecha entre los conjuntos de datos y no puede recordar cada uno individualmente.
El encadenamiento de disectores cumple una función similar (al menos en términos de filtrado a través de disectores usados anteriormente) al brindarle acceso a los datos de un solo disector. La ventaja clave aquí es que el disector encadenado no tiene que volver a ejecutar todos los paquetes, 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 capacidad 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 sientan cómodos con C, así como aquellos que ya dominan Lua, pueden encontrar que la secuencia de comandos ligera de Lua facilita 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.
Dicho esto, queremos saber de usted. ¿Con qué frecuencia utiliza disectores en Wireshark? ¿Ha intentado crearlos en C antes y qué beneficios cree que ofrece la creación de disectores en Lua? Háganos saber en la sección de comentarios.