2012-05-01 8 views
6

सबसे पहले, मैं पूरी तरह से लुआ के लिए नया हूं, और यह वायरसहार्क विच्छेदन लिखने का मेरा पहला प्रयास है।लुआ में वायरसहार्क डिसेक्टर

मेरा प्रोटोकॉल सरल है - एक 2 बाइट लंबाई फ़ील्ड, उसके बाद उस लंबाई की एक स्ट्रिंग के बाद।

जब मैं लुआ कंसोल के माध्यम से कोड चलाता हूं, तो सब कुछ अपेक्षित काम करता है।

कोड Wireshark प्लगइन्स निर्देशिका के लिए जोड़ा जाता है, मैं त्रुटि

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

रेखा 15 मेल खाती मिल t:add(f_text... लाइन है।

क्या कोई निष्पादन विधियों के बीच विसंगति को समझा सकता है?

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

मुझे लगता है कि मैंने http: //www.wireshark का उपयोग किया है प्रेरणा के लिए .org/docs/wsug_html_chunked/wslua_dissector_example.html और http://wiki.wireshark.org/Lua/Dissectors। क्या एपीआई दस्तावेज के कोई अच्छे स्रोत हैं? उपयोगकर्ता की मार्गदर्शिका के – Edgemaster

+0

[अध्याय 11] (http://www.wireshark.org/docs/wsug_html_chunked/wsluarm.html) लुआ इंटरफ़ेस के लिए एपीआई दस्तावेज है। अनुभाग 11.10, 11.11, और 11.12 कार्यात्मक इंटरफ़ेस हैं। इसके अलावा, वास्तव में कोई दस्तावेज नहीं होना चाहिए। ऐसा लगता है कि आपके विच्छेदन को लिखित रूप में काम करना चाहिए। आपका कोड दिखाता है कि आपको डेटा विच्छेदन ('स्थानीय data_dis = Dissector.get (" डेटा ")') का संदर्भ मिलता है, लेकिन आप इसका उपयोग नहीं करते हैं। क्या यह आपका पूरा डिस्सेसर कोड है? यदि नहीं, तो आप यहां कहीं भी नहीं दिखाए गए 't' को गलती से बदल सकते हैं। – multipleinterfaces

+0

यह मेरा पूरा डिस्सेक्टर कोड है, data_dis जुड़े नमूनों से एक हैंग-ओवर है। – Edgemaster

उत्तर

6

आपका चीड़फाड़ कोड बहुत दूर करने के लिए करीब है, लेकिन आप अतिरिक्त काम है कि इंटरफ़ेस को स्वीकार नहीं करेगा कर रहे हैं। यदि आप ऐसा तरह

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 

अपने dissector समारोह बदलते हैं तो आपको वांछित व्यवहार मिलेगा। लेबल "टेक्स्ट" और "लम्बाई" पहले से ही आपके फ़ील्ड के लिए परिभाषित किए गए हैं, इसलिए उन्हें 15 और 16 लाइनों पर फिर से प्रदान करने की आवश्यकता नहीं है।

+0

धन्यवाद। मैंने काम छोड़ने से पहले इस सवाल को एक भीड़ में पोस्ट किया, और इसके बारे में सोचने के लिए समय निकाला और इससे अब और अधिक समझ में आता है। हालांकि, मैं अभी भी उलझन में हूं कि यह लुआ कंसोल के माध्यम से क्यों काम करता है! – Edgemaster