Sebagai salah satu alat tangkapan paket rangkaian terbaik dunia, Wireshark membolehkan anda memperoleh paket data tertentu supaya anda boleh menganalisisnya di luar talian dan dalam masa nyata. Fikirkan apl itu sebagai satu cara untuk memeriksa data yang mengalir melalui rangkaian anda dengan teliti, membolehkan anda menangkap isu dan penyelewengan.
Anda boleh menggunakan dissectors jika anda ingin menganalisis bahagian tertentu data paket. Seperti namanya, proses ini “membedah” kod, membolehkan anda memotong aspek tertentu yang memerlukan perhatian anda. Tutorial ini menerangkan cara membuat dan menggunakan dissectors dalam Wireshark menggunakan bahasa skrip Lua.
Sebelum Anda Mula – Perkara yang Anda Perlu Tahu Mengenai Dissectors
Walaupun pembedah menawarkan cara cepat untuk menganalisis bahagian paket data dalam Wireshark, mereka perlu mengikut beberapa protokol untuk berfungsi dengan berkesan. Protokol ini termasuk yang berikut:
- Setiap pembedah yang anda cipta perlu didaftarkan untuk mengendalikan jenis muatan yang ditetapkan daripada protokol yang berbeza. Untuk melengkapkan pendaftaran ini, anda mesti menetapkan objek “Proto” kepada dissector anda, yang anda akan lihat di bawah.
- Apabila anda memanggil pembedah melalui Wireshark, ia menerima tiga perkara daripada apl:
- Objek TVB – Penampan TVB daripada paket data.
- Objek TreeItem – Akar pokok yang mewakili satu nod dalam pepohon data.
- Objek Pinfo – Rekod maklumat paket.
- Anda hanya boleh memanggil dissector jika paket data anda sepadan dengan DissectorTable yang anda tetapkan kepada objek “Proto” anda.
- Anda boleh mengatasi keperluan ini dengan memaksa penggunaan dissector melalui fungsi “Decode As”. Tetapi walaupun begitu, anda hanya boleh memaksa dissector jika DissectorTable yang anda tetapkan kepada objek “Proto” anda adalah jenis yang betul.
Sediakan Disektor Anda Menggunakan LUA
Oleh kerana Wireshark kedua-duanya ditulis dalam dan menggunakan bahasa pengaturcaraan C, kebanyakan dissectors ditulis dalam C. Walau bagaimanapun, anda mungkin ingin menggunakan Lua. Bahasa skrip ini lebih mudah daripada C dan dengan itu lebih mudah diakses oleh pengekodan pendatang baru atau mereka yang hanya ingin mencipta pembedah menggunakan bahasa yang lebih ringan.
Walaupun kod anda akan menjadi lebih mudah, pembahagi yang anda dapat apabila menggunakan Lua biasanya lebih perlahan daripada yang anda buat menggunakan C. Namun begitu, ini adalah langkah yang perlu diikuti jika anda ingin mencipta pembahagi Wireshark menggunakan Lua.
Langkah 1 – Sediakan Lua dalam Wireshark
Anda perlu menyediakan Lua jika anda tidak pernah menggunakannya dalam Wireshark sebelum ini:
- Klik “Bantuan,” diikuti dengan “Perihal Wireshark.”
- Klik “Folder.”
- Pilih salah satu daripada yang berikut untuk mencipta skrip Lua yang aktif:
- Pemalam Lua Global
- Pemalam Lua Peribadi
- Peribadi
Setelah diaktifkan, skrip anda akan sedia apabila anda memulakan Wireshark. Setiap kali anda membuat perubahan pada skrip itu, anda sama ada perlu memulakan semula Wireshark untuk mendaftarkan perubahan atau tekan “Ctrl + Shift + L” untuk memuatkan semula semua skrip Lua anda untuk menjadikan perubahan anda aktif.
Langkah 2 – Langkah Asas untuk Mencipta Dissector Anda
Jika anda sudah biasa dengan Lua, anda boleh menggunakan langkah berikut untuk mencipta skrip dissector anda sendiri yang akan berfungsi dalam Wireshark:
- Isytihar protokol untuk dissector anda, yang memerlukan anda menetapkan kedua-dua nama panjang untuk digunakan dalam pepohon protokol dan nama pendek yang berfungsi sebagai nama penapis paparan dissector.
- Cipta tiga medan berikut, dengan jenis yang sesuai:
- Soalan – Menunjukkan jenis soalan.
- Jawapan – Menunjukkan jenis jawapan.
- MessageType – Menunjukkan jika paket anda meminta soalan atau jawapan.
- Daftarkan medan anda supaya Wireshark tahu cara memaparkannya. Tanpa medan berdaftar, anda akan menerima mesej “Ralat Lua”, biasanya memberitahu anda bahawa ProtoField Item Pokok anda tidak sah.
- Cipta fungsi pembedahan yang merangkumi Pinfo yang dinyatakan sebelum ini (mengandungi data tentang paket anda) dan Item Pokok (mencipta pepohon yang akan anda tambahkan pada subpokok). Anda juga mesti membuat “penampan”, yang terletak di atas TCP anda.
- Tentukan kedua-dua protokol dan port yang Wireshark mesti menggunakan dissector. Sebagai contoh, anda boleh menetapkan protokol kepada “TCP” dan nombor port kepada mana-mana yang anda mahu gunakan.
Langkah 3 – Tambahkan Dissector Anda ke Wireshark
Sekarang ini, dissector anda seperti mentol lampu tanpa elektrik. Ia wujud, tetapi ia tidak berguna kepada anda sehingga anda boleh menjalankan sedikit kuasa melaluinya. Dalam erti kata lain, dissector anda belum ditambahkan pada Wireshark lagi, jadi anda perlu menambahkannya secara manual untuk menjalankannya dengan menggunakan langkah berikut:
- Klik pada “Bantuan” dan pergi ke menu “Mengenai Wireshark”.
- Pilih tab “Folder” untuk mencari senarai laluan untuk fail Lua anda.
- Pilih “Pemalam Lua Peribadi.” Buat direktori jika perlu.
- Salin dan tampal fail Lua yang anda buat ke dalam direktori “Pemalam Lua Peribadi”. Muat semula Wireshark untuk menghidupkan dissector.
Adalah idea yang baik untuk menjalankan ujian pada dissector baharu anda dengan membuka beberapa paket yang telah anda tangkap. Wireshark harus menyampaikan mesej yang menunjukkan nama panjang yang anda pilih untuk dissector anda, bersama-sama dengan maklumat tentang jenis mesej (soalan atau jawapan) dan hasil semakan anda.
Beberapa Kod Contoh
Jika anda tidak pernah mencipta dissector sebelum ini (atau anda baru menggunakan Lua), Wireshark menawarkan pembahagi contoh yang berguna untuk anda cuba:
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 dan Chained Dissectors
Anda mungkin mahu pergi sedikit lebih mendalam dengan penggunaan dissector anda setelah anda menguasai menciptanya dalam Lua. Wireshark menawarkan dua jenis dissectors tambahan – postdissectors dan chained dissectors – yang menawarkan lebih banyak fungsi.
Postdissector adalah seperti pemeriksaan akhir semua dissectors yang anda jalankan untuk satu paket. Anda mendaftarkannya untuk dimaklumkan setelah Wireshark memanggil setiap pembedah lain yang anda mahu ia gunakan, dan anda boleh menggunakannya untuk menapis lajur “Protokol” dan “Maklumat”. Ciri ini amat berguna jika anda ingin menapis keluar berbilang paket dalam sesi di mana anda mempunyai jurang yang panjang antara set data dan tidak dapat mengingat setiap satu secara individu.
Pembelah berantai mempunyai fungsi yang sama (sekurang-kurangnya dari segi penapisan melalui pembahagi yang digunakan sebelum ini) dengan memberi anda akses kepada data pembedah tunggal. Kelebihan utama di sini ialah pemisah berantai tidak perlu melalui setiap paket sekali lagi, memberikan anda hasil tanpa memaksa anda menunggu sehingga dissector asal berjalan semula.
Bedah di Lua
Memandangkan Wireshark sudah menawarkan keupayaan untuk mencipta pembahagi dalam C (bahasa semula jadinya), anda mungkin tidak melihat keperluan untuk menciptanya dalam Lua juga. Namun, mereka yang tidak selesa dengan C, serta mereka yang telah menguasai Lua, mungkin mendapati bahawa skrip ringan Lua memudahkan untuk mencipta pembahagi mereka. Memang, anda perlu menukar masa pemuatan yang lebih lama apabila anda menjalankan proses berbanding dengan dissectors berasaskan C, tetapi ia berguna untuk mempunyai pilihan tanpa mengira.
Dengan itu, kami ingin mendengar daripada anda. Berapa kerapkah anda menggunakan dissectors dalam Wireshark? Pernahkah anda mencuba menciptanya dalam C sebelum ini, dan apakah faedah yang anda fikir menghasilkan pembedah dalam Lua? Beritahu kami di bahagian komen di bawah.