ในฐานะหนึ่งในเครื่องมือจับแพ็กเก็ตเครือข่ายที่ดีที่สุดในโลก 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 มาก่อน:
- คลิก “Help” ตามด้วย “About Wireshark”
- คลิก “โฟลเดอร์”
- เลือกข้อใดข้อหนึ่งต่อไปนี้เพื่อสร้างสคริปต์ 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 ดังนั้นคุณต้องเพิ่มด้วยตนเองเพื่อให้มันทำงานโดยใช้ขั้นตอนเหล่านี้:
- คลิกที่ “Help” และไปที่เมนู “About Wireshark”
- เลือกแท็บ 'โฟลเดอร์' เพื่อค้นหารายการเส้นทางสำหรับไฟล์ Lua ของคุณ
- เลือก “ปลั๊กอิน Lua ส่วนตัว” สร้างไดเร็กทอรีหากจำเป็น
- คัดลอกและวางไฟล์ 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 นั้นให้ประโยชน์อะไรบ้าง แจ้งให้เราทราบในส่วนความคิดเห็นด้านล่าง