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?
Respuesta
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:
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
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
@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? –
@Bruce: por cierto, probé esta secuencia de comandos en Wireshark 1.4.6 en Windows XP SP3. –
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
:
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.
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.
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)
- 1. ¿Existe un límite de longitud de encabezado HTTP práctico?
- 2. ¿Longitud del contenido y otros encabezados HTTP?
- 3. Reconstrucción de paquete HTTP
- 4. ¿Cómo eliminar un encabezado de respuesta HTTP?
- 5. Encabezado HTTP - ntCoent-Length
- 6. Nombre de visualización del paquete Longitud máxima
- 7. ¿Cómo encontrar la longitud de un paquete de parámetros?
- 8. HTTP rango encabezado
- 9. Cómo analizar la fecha del encabezado HTTP Last-Modified?
- 10. ¿necesita protobuf un encabezado de paquete de red?
- 11. Cómo enviar un encabezado HTTP en java
- 12. Configuración del encabezado HTTP Accept para JsonRestStore
- 13. ¿Cómo uso LogParser para averiguar la LONGITUD de un campo en un registro de IIS?
- 14. Scapy: ¿cómo obtengo el encabezado completo del paquete IP?
- 15. ¿Cómo se puede eliminar Nginx del encabezado de respuesta http?
- 16. longitud máxima de la solicitud HTTP GET?
- 17. Cómo determinar la longitud del contenido de un archivo descomprimido?
- 18. ¿Qué significa que la "longitud del encabezado del perfil incrustado es mayor que la longitud de los datos"? error significa?
- 19. Cómo filtrar la salida de tcpdump en función de la longitud del paquete
- 20. HTTP: Generando encabezado ETag
- 21. ¿Cómo averiguar la longitud máxima del campo en Entity Framework en .NET 4?
- 22. Obteniendo la respuesta de la solicitud http sin contenido-longitud?
- 23. ¿Cuál es la función del encabezado HTTP "Vary: Accept"?
- 24. Sistema operativo del encabezado HTTP del agente de usuario
- 25. PHP eliminar encabezado HTTP
- 26. ¿Qué es el "encabezado HTTP sin procesar"? ¿Cuál es la diferencia entre "encabezado HTTP" y "encabezado HTTP sin procesar"?
- 27. ¿La URL de solicitud HTTP no forma parte del encabezado de solicitud HTTP?
- 28. redirect_to con encabezado HTTP
- 29. encabezado HTTP Accept significa
- 30. Cabeceras HTTP para longitud desconocida de contenido
¿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. –
@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
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í. –