หลัก อื่น วิธีใช้ Lua Dissector ใน Wireshark

วิธีใช้ Lua Dissector ใน Wireshark



ในฐานะหนึ่งในเครื่องมือจับแพ็กเก็ตเครือข่ายที่ดีที่สุดในโลก Wireshark ช่วยให้คุณได้รับแพ็กเก็ตข้อมูลเฉพาะ เพื่อให้คุณสามารถวิเคราะห์แพ็กเก็ตเหล่านั้นได้ทั้งแบบออฟไลน์และแบบเรียลไทม์ ให้คิดว่าแอปนี้เป็นวิธีตรวจสอบข้อมูลที่ไหลผ่านเครือข่ายของคุณอย่างใกล้ชิด ทำให้คุณสามารถตรวจจับปัญหาและความผิดปกติต่างๆ ได้

  วิธีใช้ Lua Dissector ใน Wireshark

คุณสามารถใช้ตัวแยกส่วนถ้าคุณต้องการวิเคราะห์ส่วนใดส่วนหนึ่งของข้อมูลของแพ็กเก็ต ตามชื่อที่บอกไว้ กระบวนการนี้จะ 'แยกส่วน' ของโค้ด ทำให้คุณสามารถตัดบางประเด็นที่ต้องให้ความสนใจออกไปได้ บทช่วยสอนนี้อธิบายวิธีสร้างและใช้ตัวแยกส่วนใน Wireshark โดยใช้ภาษาสคริปต์ Lua

ก่อนที่คุณจะเริ่ม - สิ่งที่คุณต้องรู้เกี่ยวกับ Dissectors

แม้ว่าตัวแยกจะเสนอวิธีที่รวดเร็วในการวิเคราะห์ส่วนต่างๆ ของแพ็กเก็ตข้อมูลใน Wireshark แต่พวกเขาก็ต้องปฏิบัติตามโปรโตคอลบางอย่างเพื่อให้ทำงานได้อย่างมีประสิทธิภาพ โปรโตคอลเหล่านี้มีดังต่อไปนี้:

  • ทุกๆ Dissector ที่คุณสร้างจะต้องได้รับการลงทะเบียนเพื่อจัดการประเภทเพย์โหลดที่กำหนดจากโปรโตคอลอื่น ในการลงทะเบียนนี้ให้เสร็จสมบูรณ์ คุณต้องกำหนดวัตถุ 'Proto' ให้กับผู้แยกส่วนของคุณ ซึ่งคุณจะเห็นด้านล่าง
  • เมื่อคุณเรียก Dissector ผ่าน Wireshark ระบบจะได้รับสามสิ่งจากแอป:
    • TVB Object – บัฟเฟอร์ TVB จากแพ็คเก็ตข้อมูล
    • TreeItem Object – รูทของต้นไม้ที่แสดงถึงโหนดเดียวในแผนผังข้อมูล
    • Pinfo Object – บันทึกข้อมูลแพ็คเก็ต
  • คุณสามารถเรียกใช้ dissector ได้ก็ต่อเมื่อแพ็คเก็ตข้อมูลของคุณตรงกับ DissectorTable ที่คุณตั้งค่าเป็นวัตถุ 'Proto'
    • คุณสามารถหลีกเลี่ยงข้อกำหนดนี้ได้โดยบังคับให้ใช้ตัวแยกส่วนผ่านฟังก์ชัน 'ถอดรหัสเป็น' แต่ถึงกระนั้น คุณสามารถบังคับ dissector ได้ก็ต่อเมื่อ DissectorTable ที่คุณตั้งค่าเป็นวัตถุ 'Proto' เป็นประเภทที่ถูกต้อง

การตั้งค่า Dissector ของคุณโดยใช้ LUA

เนื่องจากทั้ง Wireshark เขียนและใช้ภาษาโปรแกรม C ดังนั้นตัวแยกส่วนส่วนใหญ่จะเขียนด้วยภาษา C ในลักษณะเดียวกัน อย่างไรก็ตาม คุณอาจต้องการใช้ Lua ภาษาสคริปต์นี้ง่ายกว่าภาษาซี ดังนั้นจึงเข้าถึงได้มากขึ้นสำหรับผู้มาใหม่หรือผู้ที่ต้องการสร้างตัวแยกส่วนโดยใช้ภาษาที่เบากว่า

วิธีดูประวัติของใครบางคนบน Instagram

แม้ว่าโค้ดของคุณจะง่ายกว่า แต่ตัวแยกส่วนที่คุณได้รับเมื่อใช้ Lua มักจะช้ากว่าตัวแยกที่คุณสร้างโดยใช้ C อย่างไรก็ตาม นี่คือขั้นตอนที่ต้องปฏิบัติตามหากคุณต้องการสร้างตัวแยก Wireshark โดยใช้ Lua

ขั้นตอนที่ 1 – ตั้งค่า Lua ใน Wireshark

คุณจะต้องตั้งค่า Lua หากคุณยังไม่เคยใช้ใน Wireshark มาก่อน:

  1. คลิก “Help” ตามด้วย “About Wireshark”
  2. คลิก “โฟลเดอร์”
  3. เลือกข้อใดข้อหนึ่งต่อไปนี้เพื่อสร้างสคริปต์ Lua ที่ใช้งานอยู่:
    • ปลั๊กอิน Lua สากล
    • ปลั๊กอิน Lua ส่วนตัว
    • ส่วนตัว

เมื่อเปิดใช้งาน สคริปต์ของคุณจะพร้อมเมื่อใดก็ตามที่คุณเริ่ม Wireshark ทุกครั้งที่คุณทำการเปลี่ยนแปลงในสคริปต์นั้น คุณต้องรีสตาร์ท Wireshark เพื่อลงทะเบียนการเปลี่ยนแปลงหรือกด “Ctrl + Shift + L” เพื่อโหลดสคริปต์ Lua ทั้งหมดของคุณใหม่เพื่อให้การเปลี่ยนแปลงมีผล

ขั้นตอนที่ 2 – ขั้นตอนพื้นฐานสำหรับการสร้าง Dissector ของคุณ

หากคุณคุ้นเคยกับ Lua อยู่แล้ว คุณสามารถใช้ขั้นตอนต่อไปนี้เพื่อสร้างสคริปต์แยกส่วนของคุณเองที่จะทำงานใน Wireshark:

  • ประกาศโปรโตคอลสำหรับตัวแยกส่วนของคุณ ซึ่งคุณต้องกำหนดทั้งชื่อยาวสำหรับใช้ในแผนผังโปรโตคอลและชื่อสั้นที่ทำหน้าที่เป็นชื่อตัวกรองที่แสดงของส่วนแยก
    • สร้างฟิลด์สามฟิลด์ต่อไปนี้ ด้วยประเภทที่เหมาะสม:
    • คำถาม – แสดงประเภทคำถาม
    • คำตอบ – แสดงประเภทคำตอบ
  • MessageType – แสดงให้เห็นว่าแพ็กเก็ตของคุณขอคำถามหรือคำตอบหรือไม่
  • ลงทะเบียนฟิลด์ของคุณเพื่อให้ Wireshark รู้วิธีแสดงฟิลด์เหล่านั้น หากไม่มีฟิลด์ที่ลงทะเบียน คุณจะได้รับข้อความ 'Lua Error' ซึ่งโดยปกติจะแจ้งให้คุณทราบว่า ProtoField ของรายการต้นไม้ของคุณไม่ถูกต้อง
  • สร้างฟังก์ชันการแยกที่มี Pinfo ที่กล่าวถึงก่อนหน้านี้ (ที่มีข้อมูลเกี่ยวกับแพ็กเก็ตของคุณ) และรายการต้นไม้ (สร้างแผนภูมิที่คุณจะต่อท้ายทรีย่อย) คุณต้องสร้าง 'บัฟเฟอร์' ซึ่งอยู่ด้านบนของ TCP ของคุณด้วย
  • ระบุทั้งโปรโตคอลและพอร์ตที่ Wireshark ต้องใช้ตัวแยกส่วน ตัวอย่างเช่น คุณสามารถตั้งค่าโปรโตคอลเป็น “TCP” และหมายเลขพอร์ตที่คุณต้องการใช้

ขั้นตอนที่ 3 – เพิ่ม Dissector ของคุณไปยัง Wireshark

ตอนนี้ ดิสเซคเตอร์ของคุณก็เหมือนหลอดไฟที่ไม่มีไฟฟ้า มันมีอยู่ แต่มันไม่มีประโยชน์สำหรับคุณจนกว่าคุณจะสามารถใช้พลังบางอย่างผ่านมันได้ กล่าวอีกนัยหนึ่ง ตัวแยกส่วนของคุณยังไม่ถูกเพิ่มไปยัง Wireshark ดังนั้นคุณต้องเพิ่มด้วยตนเองเพื่อให้มันทำงานโดยใช้ขั้นตอนเหล่านี้:

  1. คลิกที่ “Help” และไปที่เมนู “About Wireshark”
  2. เลือกแท็บ 'โฟลเดอร์' เพื่อค้นหารายการเส้นทางสำหรับไฟล์ Lua ของคุณ
  3. เลือก “ปลั๊กอิน Lua ส่วนตัว” สร้างไดเร็กทอรีหากจำเป็น
  4. คัดลอกและวางไฟล์ Lua ที่คุณสร้างไว้ในไดเร็กทอรี “Personal Lua Plugins” โหลด Wireshark อีกครั้งเพื่อเปิด Dissector

เป็นความคิดที่ดีที่จะทำการทดสอบตัวแยกส่วนใหม่ของคุณโดยเปิดแพ็กเก็ตบางส่วนที่คุณจับได้ Wireshark ควรส่งข้อความที่แสดงชื่อยาวที่คุณเลือกสำหรับการแยกส่วนของคุณ พร้อมด้วยข้อมูลเกี่ยวกับประเภทข้อความ (คำถามหรือคำตอบ) และผลการตรวจสอบของคุณ

โค้ดตัวอย่างบางส่วน

หากคุณยังไม่เคยสร้างตัวแยกส่วนมาก่อน (หรือคุณยังใหม่กับ Lua) ไวร์ชาร์ค เสนอตัวแยกตัวอย่างที่มีประโยชน์เพื่อให้คุณลองใช้:

local p_multi = Proto("multi", "MultiProto");
local vs_protos = {
    [2] = "mtp2",
    [3] = "mtp3",
    [4] = "alcap",
    [5] = "h248",
    [6] = "ranap",
    [7] = "rnsap",
    [8] = "nbap"
}
local f_proto = ProtoField.uint8("multi.protocol", "Protocol", base.DEC, vs_protos)
local f_dir = ProtoField.uint8("multi.direction", "Direction", base.DEC, { [1] = "incoming", [0] = "outgoing"})
local f_text = ProtoField.string("multi.text", "Text")
p_multi.fields = { f_proto, f_dir, f_text }
local data_dis = Dissector.get("data")
local protos = {
    [2] = Dissector.get("mtp2"),
    [3] = Dissector.get("mtp3"),
    [4] = Dissector.get("alcap"),
    [5] = Dissector.get("h248"),
    [6] = Dissector.get("ranap"),
    [7] = Dissector.get("rnsap"),
    [8] = Dissector.get("nbap"),
    [9] = Dissector.get("rrc"),
    [10] = DissectorTable.get("sctp.ppi"):get_dissector(3), -- m3ua
    [11] = DissectorTable.get("ip.proto"):get_dissector(132), -- sctp
}
function p_multi.dissector(buf, pkt, tree)
    local subtree = tree:add(p_multi, buf(0,2))
    subtree:add(f_proto, buf(0,1))
    subtree:add(f_dir, buf(1,1))
    local proto_id = buf(0,1):uint()
    local dissector = protos[proto_id]
    if dissector ~= nil then
        -- Dissector was found, invoke subdissector with a new Tvb,
        -- created from the current buffer (skipping first two bytes).
        dissector:call(buf(2):tvb(), pkt, tree)
    elseif proto_id < 2 then
        subtree:add(f_text, buf(2))
        -- pkt.cols.info:set(buf(2, buf:len() - 3):string())
    else
        -- fallback dissector that just shows the raw data.
        data_dis:call(buf(2):tvb(), pkt, tree)
    end
end
local wtap_encap_table = DissectorTable.get("wtap_encap")
local udp_encap_table = DissectorTable.get("udp.port")
wtap_encap_table:add(wtap.USER15, p_multi)
wtap_encap_table:add(wtap.USER12, p_multi)
udp_encap_table:add(7555, p_multi)

Postdissectors และ Chained Dissectors

คุณอาจต้องการเจาะลึกเพิ่มเติมอีกเล็กน้อยเกี่ยวกับการใช้ตัวแยกส่วนของคุณ เมื่อคุณสร้างมันใน Lua ได้อย่างชำนาญแล้ว Wireshark นำเสนอตัวแยกส่วนเพิ่มเติมอีกสองประเภท ได้แก่ ตัวแยกส่วนหลังและส่วนแยกส่วนที่ถูกล่ามโซ่ ซึ่งมีฟังก์ชันการทำงานที่มากกว่า

postdissector เป็นเหมือนการตรวจสอบขั้นสุดท้ายของ dissectors ทั้งหมดที่คุณเรียกใช้สำหรับแพ็กเก็ต คุณลงทะเบียนเพื่อรับการแจ้งเตือนเมื่อ Wireshark เรียกตัวแยกส่วนอื่นๆ ทั้งหมดที่คุณต้องการใช้ และคุณสามารถใช้มันเพื่อกรองคอลัมน์ 'โปรโตคอล' และ 'ข้อมูล' คุณลักษณะนี้มีประโยชน์อย่างยิ่งหากคุณต้องการกรองแพ็กเก็ตหลายแพ็กเก็ตในเซสชันที่คุณมีช่องว่างระหว่างชุดข้อมูลนานและไม่สามารถเรียกคืนทีละแพ็กเก็ตได้

Chaining dissectors ทำหน้าที่คล้ายกัน (อย่างน้อยก็ในแง่ของการกรองผ่าน dissectors ที่ใช้ก่อนหน้านี้) โดยให้คุณเข้าถึงข้อมูลของ dissector เดียว ข้อได้เปรียบที่สำคัญในที่นี้คือตัวแยกส่วนที่ถูกล่ามโซ่ไม่จำเป็นต้องเรียกใช้ผ่านทุกแพ็กเก็ตอีกครั้ง ทำให้คุณได้รับผลลัพธ์โดยไม่ต้องบังคับให้คุณรอให้ตัวแยกส่วนดั้งเดิมทำงานอีกครั้ง

ผ่าในลัวะ

เนื่องจาก Wireshark เสนอความสามารถในการสร้างตัวแยกส่วนใน C (ภาษาธรรมชาติ) แล้ว คุณอาจไม่เห็นความจำเป็นในการสร้างตัวแยกส่วนใน Lua เช่นกัน ถึงกระนั้น ผู้ที่ไม่คุ้นเคยกับภาษา C รวมถึงผู้ที่เชี่ยวชาญ Lua อยู่แล้ว อาจพบว่าการเขียนสคริปต์ของ Lua เพียงเล็กน้อยช่วยให้สร้างตัวแยกส่วนได้ง่ายขึ้น จริงอยู่ คุณต้องยอมแลกกับเวลาในการโหลดที่นานขึ้นเมื่อคุณเรียกใช้กระบวนการเมื่อเทียบกับตัวแยกประเภทที่ใช้ C แต่การมีตัวเลือกโดยไม่คำนึงก็มีประโยชน์

จากที่กล่าวมาเราต้องการได้ยินจากคุณ คุณใช้ตัวแยกส่วนใน Wireshark บ่อยแค่ไหน? คุณเคยลองสร้างพวกมันใน C มาก่อนหรือไม่ และคุณคิดว่าการสร้างตัวแยกส่วนใน Lua นั้นให้ประโยชน์อะไรบ้าง แจ้งให้เราทราบในส่วนความคิดเห็นด้านล่าง

บทความที่น่าสนใจ

ตัวเลือกของบรรณาธิการ

การอัปเดตสะสมสำหรับ Windows 10 v1607 23 พฤษภาคม 2019
การอัปเดตสะสมสำหรับ Windows 10 v1607 23 พฤษภาคม 2019
Microsoft กำลังปล่อยการอัปเดตสำหรับ Windows 10 เวอร์ชัน 1607 และ Windows Server 2016 การอัปเดตมาพร้อมกับรายการแก้ไขจำนวนมาก Microsoft กำลังปล่อยการอัปเดต KB4499177 สำหรับคอมพิวเตอร์ที่ใช้ Windows 10 เวอร์ชัน 1607 และ Windows Server 2016 การอัปเดตจะเพิ่มเวอร์ชัน OS เป็นรุ่น 14393.2999 และมาพร้อมกับบันทึกการเปลี่ยนแปลงต่อไปนี้
22 เกม iPhone ที่ดีที่สุดตลอดกาล
22 เกม iPhone ที่ดีที่สุดตลอดกาล
กำลังมองหาเกมที่ดีที่สุดสำหรับ iPhone ของคุณอยู่ใช่ไหม? เราได้รวบรวมสิ่งสำคัญเกี่ยวกับเกม App Store ที่ผู้เล่นมือถือไม่ควรพลาด
วิธีบล็อกไม่มีการโทร ID ผู้โทรบน iPhone
วิธีบล็อกไม่มีการโทร ID ผู้โทรบน iPhone
บทความนี้จะอธิบายสามวิธีในการปิดเสียงสายเรียกเข้าจากหมายเลขที่ไม่มีข้อมูลหมายเลขผู้โทร
วิธีตรวจสอบระดับแบตเตอรี่ของคอนโทรลเลอร์บน PS5
วิธีตรวจสอบระดับแบตเตอรี่ของคอนโทรลเลอร์บน PS5
อายุการใช้งานแบตเตอรี่ของคอนโทรลเลอร์ PS5 อาจอยู่ที่ 12 ถึง 15 ชั่วโมง ขึ้นอยู่กับการใช้งาน เป็นเรื่องง่ายที่จะดำเนินการในระหว่างเกมที่น่าตื่นเต้น และลืมความต้องการทั้งหมดบนคอนโทรลเลอร์ของคุณ แต่สิ่งสุดท้าย
วิธีตั้งค่า Display Custom Scaling ใน Windows 10
วิธีตั้งค่า Display Custom Scaling ใน Windows 10
การตั้งค่าช่วยให้คุณสามารถตั้งค่า Custom Scaling ใน Windows 10 มีกล่องข้อความที่ให้คุณระบุค่าที่กำหนดเองสำหรับการปรับขนาด
วิธีแก้ไขยืนยันว่าคุณเป็นมนุษย์ Loop บน Cloudflare
วิธีแก้ไขยืนยันว่าคุณเป็นมนุษย์ Loop บน Cloudflare
หากคุณใช้เวลาออนไลน์เป็นจำนวนมาก มีโอกาสดีที่คุณจะเจอ Captcha Loop ของมนุษย์ของ Cloudflare มาตรการรักษาความปลอดภัยนี้มีสาเหตุหลายประการ รวมถึงปัญหาการเชื่อมต่อเครือข่าย ในขณะที่ Cloudflare ช่วยบล็อกบอทอัตโนมัติและผู้ประสงค์ร้าย
วิธีการเลือกและติดตั้งขั้วต่อสายลำโพง
วิธีการเลือกและติดตั้งขั้วต่อสายลำโพง
เรียนรู้วิธีเลือกและติดตั้งขั้วต่อสายลำโพงประเภทต่างๆ: ปลั๊กกล้วย ขั้วต่อจอบ และขั้วต่อแบบพิน