2011-04-18 14 views
7

Sé cómo hacerlo manualmente (mirando el volcado hexadecimal). ¿Cómo puedo obtener el mismo automáticamente? ¿Tengo que usar las API? Tengo tanto wireshark como el monitor de red de Microsoft.¿Cómo averiguar la longitud del encabezado HTTP de un paquete?

+0

¿Qué quiere decir 'automáticamente', desde una aplicación? Si solo quiere decir qué parte de la captura es el encabezado HTTP, etc., Wireshark debería diseccionar automáticamente los paquetes. Busque cualquier paquete de datos HTTP, haga clic derecho y seleccione "Seguir flujo TCP" y mostrará el tráfico HTTP con los encabezados claramente legibles. –

+0

@Tim: quiero saber la longitud del encabezado HTTP en bytes. Puedo ver la conversación HTTP, pero ¿cómo puedo decir la longitud del encabezado HTTP como una columna? – Bruce

+0

No sé lo que quiere decir "como una columna". Básicamente, debe buscar la secuencia TCP desde el comienzo de la solicitud HTTP a la primera doble línea nueva ('\ n \ n' o' \ r \ n \ r \ n'). El índice donde se encuentra es la longitud del encabezado. Si desea que esto se muestre en Wireshark, deberá desarrollar un complemento o algo así. Si está volcando los datos a tablas de Excel o algo así, tendrá que calcular la longitud tal como lo describí. –

Respuesta

8

Esto puede lograrse simplemente con un Lua dissector que añade un campo de encabezado HTTP para el árbol de paquetes, que le permite filtrar por ello, como se muestra en esta captura de pantalla:

enter image description here

Copiar este script Lua en su directorio de complementos (p. ej., ${WIRESHARK_HOME}/plugins/1.4.6/http_extra.lua) y reinicie Wireshark (si ya se está ejecutando).

do 
     local http_wrapper_proto = Proto("http_extra", "Extra analysis of the HTTP protocol"); 
     http_wrapper_proto.fields.hdr_len = ProtoField.uint32("http.hdr_len", "Header length (bytes)") 

     -- HTTP frames that contain a header usually include the HTTP 
     -- request method or HTTP response code, so declare those here 
     -- so we can check for them later in the dissector. 
     local f_req_meth = Field.new("http.request.method") 
     local f_resp_code = Field.new("http.response.code") 

     local original_http_dissector 
     function http_wrapper_proto.dissector(tvbuffer, pinfo, treeitem) 
       -- We've replaced the original http dissector in the dissector table, 
       -- but we still want the original to run, especially because we need 
       -- to read its data. Let's wrap the call in a pcall in order to catch 
       -- any unhandled exceptions. We'll ignore those errors. 
       pcall(
        function() 
         original_http_dissector:call(tvbuffer, pinfo, treeitem) 
        end 
       ) 

       -- if the request method or response code is present, 
       -- the header must be in this frame 
       if f_req_meth() or f_resp_code() then 

         -- find the position of the header terminator (two new lines), 
         -- which indicates the length of the HTTP header, and then add 
         -- the field to the tree (allowing us to filter for it) 
         local hdr_str = tvbuffer():string() 
         local hdr_len = string.find(hdr_str, "\r\n\r\n") or string.find(hdr_str, "\n\n\n\n") 
         if hdr_len ~= nil then 
          treeitem:add(http_wrapper_proto.fields.hdr_len, hdr_len):set_generated() 
         end 
       end 
     end 

     local tcp_dissector_table = DissectorTable.get("tcp.port") 
     original_http_dissector = tcp_dissector_table:get_dissector(80) -- save the original dissector so we can still get to it 
     tcp_dissector_table:add(80, http_wrapper_proto)     -- and take its place in the dissector table 
end 
+0

Muchas gracias por responder. Seguí tus pasos, pero no veo la longitud del encabezado http en la descripción del paquete. Estoy trabajando en Windows. – Bruce

+0

@Bruce: ** 1. ** ¿Qué versión de Wireshark está ejecutando? ** 2. ** Cuando va al menú "Herramientas", ¿ve un submenú "Lua"? Si no, entonces Lua está deshabilitado (habilitado por defecto en la instalación estándar). ** 3. ** El campo de longitud del encabezado HTTP solo se agrega a la descripción del paquete si el paquete contiene el encabezado HTTP. ¿Lo has verificado? –

+0

@Bruce: por cierto, probé esta secuencia de comandos en Wireshark 1.4.6 en Windows XP SP3. –

2

Desafortunadamente, aunque puede crear columnas personalizadas, los datos que desea en esa columna no están generados actualmente por el decodificador de protocolo HTTP. Por supuesto, puede haber otras herramientas con las que no estoy familiarizado que puedan hacer esto hoy, pero en lo que respecta a Wireshark, debería agregar esa funcionalidad.

Hay algunos buenos recursos en la creación de plugins de Wireshark, por ejemplo:

http://simeonpilgrim.com/blog/2008/04/29/how-to-build-a-wireshark-plug-in/

http://www.wireshark.org/docs/wsdg_html_chunked/ChDissectAdd.html

http://www.codeproject.com/KB/IP/custom_dissector.aspx

Y aquí hay un video que describe cómo agregar un campo que está expuesto por un protocolo decodificador como una columna personalizada:

http://www.youtube.com/watch?v=XpUNXDkfkQg

El hecho es que no desea volver a implementar el decodificador de protocolo HTTP.

Lo que me gustaría hacer es encontrar el código fuente para el decodificador incorporado HTTP y mirar a la adición de un nuevo campo como http.header_length al igual que el vigente http.content_length:

img

No he mirado en el código, pero supongo que es una cosa bastante fácil de agregar. Si envía un parche al equipo de Wireshark, probablemente también incluirán su nuevo campo en el siguiente lanzamiento.

0

he encontrado que esta forma de llamar la disección previa en la cadena de alguna manera interferre con el montaje del paquete HTTP hecho por 'fragmentada' codificación de transferencia. Es decir, si su respuesta tiene el encabezado 'Transfer-Encoding: chunked', el disector HTTP original intenta volver a ensamblar los datos y si lo engancha con tal http_wrapper, entonces el ensamblaje falla.

Por ejemplo, esto hace que las estadísticas http también fallen. Estadísticas/HTTP/Contador de paquetes le daría, digamos 6 solicitudes y 4 respuestas, que no es el caso =)

Mejor debería instalarse este tipo de disectores de "valor agregado" con la llamada API 'register_postdissector' o prueba para volver a ensamblar lógica cuidadosamente.

2

El código publicado por user568493 no funcionó para mí en absoluto, así que lo cambié a un disector de publicaciones, y también no estaba contando el número de bytes correctamente. También contaba los bytes de IP y Ethernet.

Esta es mi versión, que funciona en 1.8.2:

local http_wrapper_proto = Proto("http_extra", "Extra analysis of the HTTP protocol"); 
http_wrapper_proto.fields.hdr_len = ProtoField.uint32("http.hdr_len", "HTTP Header length (bytes)") 

-- HTTP frames that contain a header usually include the HTTP 
-- request method or HTTP response code, so declare those here 
-- so we can check for them later in the dissector. 
local f_req_meth = Field.new("http.request.method") 
local f_resp_code = Field.new("http.response.code") 

local original_http_dissector 
function http_wrapper_proto.dissector(tvbuffer, pinfo, treeitem) 
     -- if the request method or response code is present, 
     -- the header must be in this frame 
     if f_req_meth() or f_resp_code() then 
       local start_offset = 0 
       local end_offset = 0 
       -- find the position of the header terminator (two new lines), 
       -- which indicates the length of the HTTP header, and then add 
       -- the field to the tree (allowing us to filter for it) 
       local hdr_str = tvbuffer():string() 
       if f_req_meth() then 
        start_offset = string.find(hdr_str, "GET") 
        end_offset = string.find(hdr_str, "\r\n\r\n") 
       end 
       if f_resp_code() then 
        start_offset = string.find(hdr_str, "HTTP") 
        end_offset = string.find(hdr_str, "\r\n\r\n") 
       end 
       local hdr_len = end_offset - start_offset + 4 
       -- 4 Bytes because the \r\n\r\n are not part of the HTTP Payload, hence should be counted in the header length. 
       if hdr_len ~= nil then 
        treeitem:add(http_wrapper_proto.fields.hdr_len, hdr_len):set_generated() 
       end 
     end 
end 

register_postdissector(http_wrapper_proto) 
Cuestiones relacionadas