Tôi biết cách thực hiện thủ công (bằng cách nhìn vào kết xuất hex). Làm thế nào tôi có thể có được cùng một tự động? Tôi có phải sử dụng API không? Tôi có cả wireshark và màn hình mạng của Microsoft.Làm thế nào để tìm ra chiều dài tiêu đề HTTP của một gói?
Trả lời
này có thể được thực hiện đơn giản với một Lua dissector có thêm một trường tiêu đề HTTP đến cây gói, cho phép bạn lọc cho nó, như thể hiện trong ảnh chụp màn hình này:
Sao chép kịch bản Lua này vào thư mục plugin của bạn (ví dụ: ${WIRESHARK_HOME}/plugins/1.4.6/http_extra.lua
) và khởi động lại Wireshark (nếu đã chạy).
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
Cảm ơn rất nhiều vì đã trả lời. Tôi đã làm theo các bước của bạn nhưng tôi không thấy chiều dài tiêu đề http trong mô tả gói. Tôi đang làm việc trên Windows. – Bruce
@Bruce: ** 1. ** Bạn đang chạy phiên bản Wireshark nào? ** 2. ** Khi bạn vào menu "Tools", bạn có thấy menu phụ "Lua" không? Nếu không, sau đó Lua bị vô hiệu hóa (được kích hoạt theo mặc định trong cài đặt chuẩn). ** 3. ** Trường độ dài tiêu đề HTTP chỉ được thêm vào mô tả gói nếu gói chứa tiêu đề HTTP. Bạn đã xác minh điều đó chưa? –
@Bruce: btw, tôi đã thử nghiệm tập lệnh này trên Wireshark 1.4.6 trên Windows XP SP3. –
Thật không may, mặc dù bạn có thể tạo cột tùy chỉnh, dữ liệu bạn muốn trong cột đó hiện không được bộ giải mã giao thức HTTP tạo. Tất nhiên, có thể có những công cụ khác mà tôi không quen thuộc mà có thể làm điều này ngày hôm nay, nhưng theo như Wireshark là có liên quan bạn sẽ phải thêm chức năng đó.
Có một số nguồn lực tốt vào việc tạo ra các plugin Wireshark, ví dụ:
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
Và đây là một đoạn video mô tả làm thế nào để thêm một trường không tiếp xúc bởi một giao thức bộ giải mã dưới dạng cột tùy chỉnh:
http://www.youtube.com/watch?v=XpUNXDkfkQg
Vấn đề là bạn không muốn triển khai lại bộ giải mã giao thức HTTP.
gì tôi sẽ làm là tìm ra mã nguồn cho các built-in giải mã HTTP và nhìn vào thêm một lĩnh vực mới như http.header_length
giống như hiện http.content_length
:
Tôi đã không nhìn tại mã, nhưng tôi đoán rằng đây là một điều khá dễ dàng để thêm vào. Nếu bạn gửi một bản vá cho nhóm Wireshark, họ cũng có thể sẽ bao gồm trường mới của bạn trong bản phát hành tiếp theo.
tôi đã tìm thấy rằng cách này gọi người mổ xẻ trước đó trong chuỗi bằng cách nào đó interferre với HTTP gói reassembly làm cho 'chunked' mã hóa chuyển nhượng. Đó là nếu phản hồi của bạn có tiêu đề 'Chuyển mã hóa: chunked', trình phân tích cú pháp HTTP ban đầu sẽ cố gắng tập hợp lại dữ liệu và nếu bạn kết nối nó với http_wrapper như vậy, thì việc ghép lại không thành công.
Ví dụ: điều này làm cho số liệu thống kê http cũng không thành công. Thống kê/Bộ đếm HTTP/Gói sẽ cung cấp cho bạn, giả sử 6 yêu cầu và 4 câu trả lời, không phải là trường hợp =)
Bạn nên cài đặt loại trình phân tích 'giá trị gia tăng' như vậy với cuộc gọi API 'register_postdissector' hoặc kiểm tra để lắp ráp lại logic cẩn thận.
Mã do người dùng568493 đăng không làm việc cho tôi chút nào, Vì vậy, iv'e đã thay đổi nó thành một người phân tích bài đăng và cũng không tính số lượng byte chính xác. Nó cũng đang đếm IP và byte Ethernet.
Đây là phiên bản của tôi, mà hoạt động trên 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. Làm thế nào để tìm ra chiều dài của một LPCSTR
- 2. Làm thế nào để kéo dài một tiêu đề trên một nền trang web với CSS
- 3. tìm ra "chuỗi dài" của một int
- 4. Làm thế nào để ghi đè lên tiêu đề http "Máy chủ" trong một HttpURLConnection?
- 5. PHP CRON việc làm, tiêu đề HTTP không ra
- 6. Làm thế nào để có được chiều dài của char **?
- 7. Làm thế nào để có được chiều dài của chuỗi dài nhất trong một mảng
- 8. Tiêu đề phạm vi HTTP
- 9. Làm thế nào để tìm chiều dài của chuỗi chậm mà không buộc phải thực hiện?
- 10. Nén tiêu đề Http
- 11. Làm cách nào để xóa tiêu đề phản hồi HTTP?
- 12. Độ dài nội dung và các tiêu đề HTTP khác?
- 13. Làm cách nào để phù hợp với tiêu đề dài?
- 14. Tiêu đề HTTP tiêu đề và nnCoection
- 15. Tiêu đề HTTP - ntCoent-Length
- 16. làm thế nào để thiết lập chiều dài của một cột trong ngủ đông với chiều dài tối đa
- 17. Làm thế nào để tạo ra một định danh duy nhất của một chiều dài cố định trong Java?
- 18. Cách tìm chiều dài của một chuỗi trong R?
- 19. D3 làm thế nào để thay đổi chiều rộng và chiều dài của SVG
- 20. Làm thế nào để chiều dài danh sách đếm Python
- 21. Làm thế nào để tạo ra một chức năng đóng gói tối ưu trong python?
- 22. Tìm chiều dài của mảng 2D Python
- 23. Làm thế nào để thoát khỏi một ngắt dòng chữ trong tiêu đề HTTP?
- 24. Làm thế nào để tìm bù đắp của bảng chuỗi tiêu đề phần của tệp elf?
- 25. tìm chiều dài của chuỗi số liên tiếp dài nhất
- 26. Làm thế nào để tìm ra chiều rộng hình ảnh base64 và chiều cao
- 27. Tìm chiều dài của một Mảng nhân vật trong C
- 28. Có cần đặt chiều dài Nội dung trong tiêu đề phản hồi của tôi không?
- 29. C/C++: Làm thế nào để tìm ra chuỗi các tệp tiêu đề cho một định nghĩa đã cho?
- 30. Làm thế nào để tìm ra nơi xảy ra lỗi R?
Ý anh là gì 'tự động', từ một ứng dụng? Nếu bạn chỉ có nghĩa là tìm ra những gì một phần của chụp là tiêu đề HTTP, vv, Wireshark nên tự động phân tích các gói tin. Tìm bất kỳ gói dữ liệu HTTP nào, nhấp chuột phải và chọn "Theo dõi luồng TCP" và nó sẽ hiển thị lưu lượng HTTP với các tiêu đề có thể đọc được rõ ràng. –
@Tim: Tôi muốn biết Độ dài Tiêu đề HTTP tính theo byte. Tôi có thể thấy cuộc hội thoại HTTP, nhưng làm cách nào để đặt độ dài tiêu đề HTTP làm cột cho phép nói? – Bruce
Tôi không biết ý bạn là "một cột". Về cơ bản, bạn cần phải tìm kiếm luồng TCP từ đầu của yêu cầu HTTP đến dòng mới kép đầu tiên ('\ n \ n' hoặc' \ r \ n \ r \ n'). Chỉ mục được tìm thấy là độ dài của tiêu đề. Nếu bạn muốn điều này hiển thị trong Wireshark, bạn sẽ cần phải phát triển một plug-in hoặc một cái gì đó. Nếu bạn đang đổ dữ liệu vào bảng excel hoặc một cái gì đó, sau đó bạn sẽ cần phải tính toán chiều dài như tôi đã mô tả. –