roPcap
27 min
ropcap se utiliza para analizar archivos pcap en busca de flujos de tráfico udp, prepararlos para la reproducción (filtrando y reescribiendo encabezados opcionalmente), reproducirlos en una interfaz de red con sincronización sin deriva y extraer flujos de carga útil udp sin procesar de capturas pcap está disponible a partir de bos 9 1 143 si se establece un puerto de mensajes mediante setport() , el objeto publica mensajes ropcapevent para eventos del ciclo de vida de la reproducción (iniciada, detenida, repetida en bucle, underrun, descartada) solo puede existir una instancia de ropcap a la vez createobject("ropcap") devuelve inválido si otra instancia ya está activa si utiliza tmp\ / debe tener en cuenta el tamaño del pcap si es grande, no cabrá en un tmp\ / basado en ram y debería usar almacenamiento local en su lugar (por ejemplo, sd / ) ifpcap analyze(filename as string) as object escanea todos los paquetes en nombre de archivo y devuelve un roarray de roassociativearray , una entrada por cada flujo udp encontrado los flujos se ordenan por cantidad de paquetes en orden descendente devuelve una matriz vacía si el archivo no puede abrirse o no contiene flujos udp cada entrada en la matriz devuelta contiene las siguientes claves clave tipo descripción src ip string dirección ipv4 de origen src port integer puerto udp de origen dst ip string dirección ipv4 de destino dst port integer puerto udp de destino packet count integer número de paquetes udp en el flujo prepare(params as roassociativearray) as integer filtra paquetes del pcap de entrada y escribe un pcap de salida listo para reproducción, reemplazando opcionalmente los encabezados de ip de destino y puerto udp la dirección mac de origen y la dirección ip de origen de cada paquete de salida siempre se reescriben con los valores de la interfaz de red especificada si rewriteoutputdestaddress es una dirección multicast, la mac de destino se deriva utilizando la fórmula rfc 1112 si es una dirección unicast, la mac de destino se resuelve mediante la caché arp del kernel; el destino ya debe ser accesible (por ejemplo, mediante un ping previo) antes de llamar a prepare() devuelve un código entero pcapengineerror ; 0 en caso de éxito consulte códigos de error /#cdigos de error parámetros obligatorios clave tipo descripción archivo de entrada string ruta al archivo pcap de origen archivodesalida string ruta para escribir el pcap preparado (debe ser diferente de archivo de entrada ) interfaz string nombre de la interfaz de red utilizada para resolver la mac e ip de origen (p ej "eth0" ) parámetros de filtro opcionales clave tipo descripción filterinputsourceaddress string conservar solo los paquetes con esta dirección ipv4 de origen filterinputsourceport integer conservar solo los paquetes udp de este puerto de origen (1024–65535) filterinputdestaddress string conservar solo los paquetes con esta dirección ipv4 de destino filterinputdestport integer conservar solo los paquetes udp hacia este puerto de destino (1024–65535) autoflowselect boolean vea la nota a continuación parámetros de reescritura opcionales clave tipo descripción rewriteoutputdestaddress string reescribir la dirección ip de destino (unicast o multicast) rewriteoutputdestport integer reescribir el puerto udp de destino (1024–65535) comportamiento predeterminado de autoflowselect cuando no se proporcionan claves campo de filtro keys, autoflowselect toma el valor predeterminado de verdadero el flujo con el mayor número de paquetes se selecciona automáticamente cuando cualquier clave campo de filtro está presente, autoflowselect toma el valor predeterminado de falso si los criterios de filtro coinciden con más de un flujo, prepare() devuelve pcap err ambiguous flow ( 7) en lugar de seleccionar uno una clave explícita de autoflowselect siempre reemplaza el valor predeterminado extractstream(params as roassociativearray) as integer concatena los bytes de carga útil udp sin procesar de cada paquete coincidente en archivo de entrada y los escribe en archivodesalida no se requiere una llamada previa a prepare() esto es útil para recuperar el flujo de bytes original de una captura udp; por ejemplo, extraer un archivo mpeg ts de una grabación ts over udp los criterios de filtro deben resolverse exactamente en un flujo udp use autoflowselect para seleccionar automáticamente el flujo con el mayor recuento cuando el filtro es amplio devuelve un código entero pcapengineerror ; 0 en caso de éxito consulte códigos de error /#cdigos de error puede devolver pcap err read failed ( 8) si el archivo de entrada está dañado o truncado parámetros obligatorios clave tipo descripción archivo de entrada string ruta al archivo pcap de origen archivodesalida string ruta donde escribir el flujo extraído; se crea o se trunca parámetros de filtro opcionales igual que en prepare() filterinputsourceaddress , filterinputsourceport , filterinputdestaddress , filterinputdestport , autoflowselect (misma lógica predeterminada que prepare() ) start(params as roassociativearray) as boolean comienza a reproducir el archivo pcap preparado en la interfaz de red especificada los paquetes se sincronizan según sus intervalos originales entre paquetes utilizando marcas de tiempo monotónicas absolutas para que el exceso de tiempo en un paquete no pueda acumularse como deriva en los paquetes posteriores bloquea hasta que el hilo del remitente se haya iniciado o haya fallado al iniciarse publica un ropcapevent con el tipo 1 (started) en el puerto de mensajes en caso de éxito devuelve verdadero en caso de éxito; falso si no se pudo iniciar el hilo del remitente parámetros obligatorios clave tipo descripción nombre del archivo string ruta al archivo pcap preparado para reproducir interfaz string nombre de la interfaz de red desde la que se enviará (p ej , "eth0" ) parámetros opcionales clave tipo descripción loopcount integer número de veces que se recorrerá el archivo en bucle; 0 (predeterminado) se repite indefinidamente precargarenmemoria boolean si verdadero , carga el archivo completo en ram antes de que comience la reproducción (limitado al 50 % de la ram total del sistema) use esto cuando se requiera una temporización determinística por paquete y el archivo quepa cómodamente en la memoria el valor predeterminado es el modo de streaming, que lee desde el disco con un búfer de lectura anticipada de 20 mib y es adecuado para cualquier tamaño de archivo stop() as void devuelve verdadero mientras el hilo emisor está ejecutando el bucle de reproducción devuelve falso una vez que se agota el recuento de bucles, se llama a stop() o se produce un error fatal después de que start() devolvió verdadero getstats() as roassociativearray devuelve una instantánea de las estadísticas de reproducción es seguro llamarlo en cualquier momento, incluso mientras la reproducción está en ejecución clave tipo descripción packets sent integer tramas transmitidas correctamente desde la última llamada a start() packets dropped integer tramas descartadas debido a que no había espacio de búfer o por ocupado, desde la última llamada a start() loops completed integer pasadas de bucle completas que finalizaron correctamente subdesbordamientos integer veces que el búfer de lectura anticipada de streaming estuvo vacío; siempre 0 cuando precargarenmemoria es verdadero elapsed ms integer milisegundos de reloj transcurridos desde la última llamada a start() o resetstats() ; 0 cuando está detenido timing sample count integer número de paquetes que contribuyen a los campos de temporización a continuación timing mean us integer error de temporización medio en microsegundos; positivo significa que el paquete salió tarde, negativo significa que salió temprano timing min us integer error de temporización mínimo (más temprano) en microsegundos timing max us integer error de temporización máximo (más tardío) en microsegundos timing stddev us integer desviación estándar de muestra del error de temporización en microsegundos los campos de temporización son 0 hasta que se haya enviado al menos un paquete resetstats() como void restablece todas las estadísticas de reproducción a cero es seguro llamarlo mientras la reproducción está en ejecución los contadores actualizados por el hilo de reproducción después de la llamada reflejan solo la actividad desde el restablecimiento ifmessageport setport(port as romessageport) publica mensajes de tipo ropcapevent en el puerto de mensajes adjunto ifuserdata setuserdata(user data as object) establece los datos de usuario que se devolverán cuando se generen eventos getuserdata() as object devuelve los datos de usuario establecidos previamente mediante setuserdata() devuelve inválido si no se han establecido datos ropcapevent ropcapevent se publica en el puerto de mensajes establecido en ropcap siempre que ocurre un evento del ciclo de vida de reproducción ifpcapevent getint() as integer devuelve el código de tipo de evento valor nombre descripción 1 iniciado el hilo de reproducción se inició y está enviando paquetes 2 detenido el hilo de reproducción se detuvo (se agotó el recuento de bucles, se llamó a stop() o se produjo un error fatal) 3 en bucle se completó una pasada completa; getdata() devuelve el número de bucle indexado desde 1 4 subdesbordamiento el búfer de lectura anticipada de streaming estaba vacío; el tiempo de reproducción puede haberse visto afectado 5 descartado se descartó un paquete; getdata() devuelve el recuento acumulado de descartes en el momento del descarte getdata() as integer devuelve datos específicos del evento consulte la tabla anterior devuelve 0 para eventos en los que no se aplican datos adicionales códigos de error prepare() y extractstream() devuelven uno de los siguientes códigos enteros valor nombre descripción 0 pcap ok correcto 1 pcap err file not found archivo de entrada no existe o no puede abrirse 2 pcap err invalid flow port un valor de puerto está fuera del rango válido \[1024, 65535] 3 pcap err write failed archivodesalida no pudo escribirse 4 pcap err invalid interface el nombre de la interfaz es inválido o no se encontró en el sistema 5 pcap err invalid param se proporcionó un parámetro inválido formato de dirección ip incorrecto, archivo de entrada y archivodesalida son la misma ruta, o una dirección unicast rewriteoutputdestaddress no pudo resolverse a una mac mediante arp 6 pcap err no matching flow los criterios de filtro no coincidieron con ningún flujo; proporcione un filtro menos restrictivo o verifique que el archivo de entrada contenga el tráfico esperado 7 pcap err ambiguous flow los criterios de filtro coincidieron con más de un flujo distinto; ajuste el filtro para seleccionar exactamente uno, o establezca autoflowselect verdadero para elegir automáticamente el flujo con el mayor conteo 8 pcap err read failed extractstream() solamente el archivo de entrada está dañado o truncado ejemplos analizar un archivo pcap imprima todos los flujos udp encontrados en un archivo de captura pcap = createobject("ropcap") flows = pcap analyze("sd /capture pcap") for each flow in flows print flow\ src ip + " " + flow\ src port tostr() + " > " + flow\ dst ip + " " + flow\ dst port tostr() + " packets=" + flow\ packet count tostr() end for preparar y reproducir con manejo de eventos seleccione un flujo, reescríbalo a un grupo multicast local y reprodúzcalo tres veces mientras supervisa eventos pcap = createobject("ropcap") port = createobject("romessageport") pcap setport(port) ' step 1 — inspect the capture to find the flow flows = pcap analyze("sd /source pcap") if flows count() = 0 print "no udp flows found" stop end if ' step 2 — prepare filter to the largest flow, rewrite destination params = createobject("roassociativearray") params inputfile = "sd /source pcap" params outputfile = "tmp\ /prepared pcap" params interface = "eth0" ' autoflowselect defaults to true when no filterinput keys are given, ' so the highest count flow is selected automatically params rewriteoutputdestaddress = "239 1 2 3" params rewriteoutputdestport = 1234 result = pcap prepare(params) if result <> 0 print "prepare failed " + result tostr() stop end if ' step 3 — replay three times startparams = createobject("roassociativearray") startparams filename = "tmp\ /prepared pcap" startparams interface = "eth0" startparams loopcount = 3 if not pcap start(startparams) print "start failed" stop end if ' step 4 — event loop while true msg = wait(0, port) if type(msg) = "ropcapevent" select case msg getint() case 3 ' looped print "completed loop " + msg getdata() tostr() case 5 ' dropped print "drop count " + msg getdata() tostr() case 2 ' stopped print "replay finished" exit while end select end if end while stats = pcap getstats() print "sent=" + stats packets sent tostr() + " dropped=" + stats packets dropped tostr() + " underruns=" + stats underruns tostr() extraer un flujo sin procesar de un pcap recupere un archivo mpeg ts de una captura ts over udp no se necesita ninguna prepare() ni interfaz de red pcap = createobject("ropcap") params = createobject("roassociativearray") params inputfile = "sd /recording pcap" params outputfile = "sd /extracted ts" ' autoflowselect defaults to true when no filterinput keys are given ' set explicit filter keys to target a specific flow in a multi flow capture params filterinputdestaddress = "239 10 20 30" params filterinputdestport = 1234 ' autoflowselect defaults to false because filterinput keys are present; ' set it explicitly to true to auto pick if the filter still matches multiple flows params autoflowselect = true result = pcap extractstream(params) if result = 0 print "stream extracted successfully" else print "extractstream failed " + result tostr() end if