2013-01-17 27 views
6

Tôi đang cố gắng để viết một người mổ xẻ cho giao thức gỡ lỗi từ xa Safari mà là dựa trên bplists và đã thành công một cách hợp lý (mã hiện tại là ở đây: https://github.com/andydavies/bplist-dissector).gói reassembling trong một Lua Wireshark mổ xẻ

Tôi đang gặp khó khăn với việc tập hợp lại các gói mặc dù.

Thông thường các giao thức gửi một gói tin với 4 byte chứa chiều dài của gói tin tiếp theo, sau đó các gói tin với bplist trong.

Đáng tiếc là một số gói tin từ trình giả lập iOS không tuân theo quy ước này và bốn byte hoặc được gắn thẻ vào mặt trước của gói bplist, hoặc vào cuối của gói bplist trước đó, hoặc dữ liệu là nhiều bplists.

tôi đã cố gắng ghép chúng lại sử dụng desegment_lendesegment_offset như sau:

function p_bplist.dissector(buf, pkt, root) 

    -- length of data packet 
    local dataPacketLength = tonumber(buf(0, 4):uint()) 
    local desiredPacketLength = dataPacketLength + 4 

    -- if not enough data indicate how much more we need 
    if desiredPacketLen > buf:len() then 
     pkt.desegment_len = dataPacketLength 
     pkt.desegment_offset = 0 
     return 
    end 

    -- have more than needed so set offset for next dissection 
    if buf:len() > desiredPacketLength then 
     pkt.desegment_len = DESEGMENT_ONE_MORE_SEGMENT 
     pkt.desegment_offset = desiredPacketLength 
    end 

    -- copy data needed 
    buffer = buf:range(4, dataPacketLen) 

    ... 

Những gì tôi đang cố gắng làm ở đây là luôn luôn buộc các byte kích thước là bốn byte đầu tiên của một gói tin được mổ xẻ nhưng nó không hoạt động, tôi vẫn thấy gói 4 byte, tiếp theo là gói byte x.

Tôi có thể nghĩ ra các cách khác để quản lý thêm bốn byte ở phía trước, nhưng giao thức có chứa bảng tra cứu 32 byte từ cuối gói nên cần có cách ghép chính xác gói vào bplists.

Dưới đây là giới thiệu ví dụ: http://www.cloudshark.org/captures/2a826ee6045b # 338 là ví dụ về gói có kích thước bplist ở đầu dữ liệu và có nhiều dấu trong dữ liệu.

Tôi có làm đúng này (nhìn câu hỏi khác về SO, và các ví dụ trên web tôi dường như được) hoặc là có một cách tốt hơn?

Trả lời

4

TCP mổ xẻ packet-tcp.c có tcp_dissect_pdus(), mà

Vòng cho mổ xẻ PDU trong một dòng suối TCP; giả sử rằng một PDU bao gồm một đoạn dữ liệu có độ dài cố định chứa đủ thông tin để xác định chiều dài của PDU, tiếp theo là phần còn lại của PDU.

Không có chức năng nào như vậy trong lua api, nhưng đây là một ví dụ tốt về cách thực hiện.

Một ví dụ khác. Tôi đã sử dụng cách đây một năm để thử nghiệm:

local slicer = Proto("slicer","Slicer") 
function slicer.dissector(tvb, pinfo, tree) 
    local offset = pinfo.desegment_offset or 0 

    local len = get_len() -- for tests i used a constant, but can be taken from tvb 

    while true do 
     local nxtpdu = offset + len 

     if nxtpdu > tvb:len() then 
      pinfo.desegment_len = nxtpdu - tvb:len() 
      pinfo.desegment_offset = offset 
      return 
     end 

     tree:add(slicer, tvb(offset, len)) 

     offset = nxtpdu 

     if nxtpdu == tvb:len() then 
      return 
     end 
    end 
end 
local tcp_table = DissectorTable.get("tcp.port") 
tcp_table:add(2506, slicer) 
+0

Cảm ơn vì điều này đã giúp tôi tiếp tục, bằng cách nào đó tôi không giải mã tất cả các gói vì vậy cần phải xem xét lại! –

+1

Mặc dù đây là một bài đăng khá cũ, nhưng trong tương lai, tôi nghĩ rằng nó đáng để nói rằng bắt đầu từ Wireshark 1.99.2, ở đó ** là ** API Lua cho 'tcp_dissect_pdus'. Có một cái nhìn ở đây: [wireshark.org/docs](https://www.wireshark.org/docs/wsdg_html_chunked/lua_module_Proto.html#lua_fn_dissect_tcp_pdus_tvb__tree__size__func__func___desegment__) –