2012-05-01 34 views
6

Trước hết, tôi mới đến Lua hoàn toàn, và đây là nỗ lực đầu tiên của tôi trong việc viết một Wireshark dissector.Wireshark Dissector trong Lua

Giao thức của tôi rất đơn giản - trường có độ dài 2 byte, theo sau là một chuỗi có độ dài đó.

Khi tôi chạy mã thông qua bảng điều khiển Lua, mọi thứ hoạt động như mong đợi.

Khi mã được thêm vào thư mục plugins Wireshark, tôi nhận được lỗi

Lua Error: [string "C:\Users...\AppData\Roaming\Wireshark..."]:15: calling 'add' on bad self (number expected, got string)

Dòng 15 tương ứng là dòng t:add(f_text....

Có ai có thể giải thích sự khác biệt giữa các phương pháp thực thi không?

do 
    local p_multi = Proto("aggregator","Aggregator"); 

    local f_len = ProtoField.int16("aggregator.length","Length",base.DEC) 
    local f_text = ProtoField.string("aggregator.text","Text") 

    p_multi.fields = { f_len, f_text } 

    local data_dis = Dissector.get("data") 

    function p_multi.dissector(buf,pkt,root) 
      pkt.cols.protocol = "Aggregator" 
      local len = buf(0,2):int() 
      local t = root:add(p_multi,buf(0,len+2)) 
      t:add(f_len,buf(0,2),"Length: " .. buf(0,2):int()) 
      t:add(f_text,buf(2,len),"Text: " .. buf(2,len):string()) 
    end 

    local tcp_encap_table = DissectorTable.get("tcp.port") 
    tcp_encap_table:add(4321,p_multi) 
end 
+0

Tôi sẽ lưu ý rằng tôi đã sử dụng http: //www.wireshark .org/docs/wsug_html_chunked/wslua_dissector_example.html và http://wiki.wireshark.org/Lua/Dissectors để lấy cảm hứng. Có bất kỳ nguồn tài liệu API nào tốt không? – Edgemaster

+0

[Chương 11] (http://www.wireshark.org/docs/wsug_html_chunked/wsluarm.html) của Hướng dẫn Người dùng là tài liệu API cho giao diện Lua. Các phần 11.10, 11.11 và 11.12 là giao diện chức năng. Ngoài ra, không có bất kỳ tài liệu nào để có. Có vẻ như tôi là người mổ xẻ của bạn nên làm việc như được viết. Mã của bạn cho thấy rằng bạn nhận được một tham chiếu đến trình phân tích dữ liệu ('local data_dis = Dissector.get (" data ")'), nhưng bạn không sử dụng nó. Đây có phải là mã mổ xẻ hoàn chỉnh của bạn không? Nếu không, bạn có thể vô tình thay đổi 't' ở đâu đó không được hiển thị ở đây. – multipleinterfaces

+0

Đó là mã phân tích hoàn chỉnh của tôi, dữ liệu_dis là một hang-over từ các mẫu được liên kết. – Edgemaster

Trả lời

6

Mã phân tích của bạn rất gần đúng, nhưng bạn đang làm thêm công việc mà giao diện sẽ không chấp nhận. Nếu bạn thay đổi chức năng dissector như vậy,

function p_multi.dissector(buf,pkt,root) 
     pkt.cols.protocol = "Aggregator" 
     local len = buf(0,2):int() 
     local t = root:add(p_multi,buf(0,len+2)) 
     t:add(f_len,buf(0,2)) --let Wireshark do the hard work 
     t:add(f_text,buf(2,len)) --you've already defined their labels etc. 
end 

bạn sẽ nhận được hành vi mong muốn. Các nhãn "Văn bản" và "Độ dài" đã được xác định cho các trường của bạn, do đó không cần phải cung cấp lại chúng trên các dòng 15 và 16.

+0

Cảm ơn bạn. Tôi đã đăng câu hỏi này một cách vội vã trước khi rời khỏi công việc và dành thời gian để suy nghĩ về điều này, điều này có ý nghĩa hơn bây giờ. Mặc dù, tôi vẫn còn bối rối về lý do tại sao nó hoạt động thông qua bảng điều khiển Lua! – Edgemaster