2011-04-18 32 views
7

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?

+0

Ý 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. –

+0

@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

+0

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ả. –

Trả lời

8

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:

enter image description here

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 
+0

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

+0

@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? –

+0

@Bruce: btw, tôi đã thử nghiệm tập lệnh này trên Wireshark 1.4.6 trên Windows XP SP3. –

2

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:

img

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.

0

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.

2

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) 
Các vấn đề liên quan