Jako jeden z nejlepších světových nástrojů pro zachycení síťových paketů vám Wireshark umožňuje získat konkrétní datové pakety, takže je můžete analyzovat offline i v reálném čase. Představte si aplikaci jako způsob, jak podrobně prozkoumat data proudící vaší sítí, což vám umožní zachytit problémy a nesrovnalosti.
Pokud chcete analyzovat konkrétní část dat paketu, můžete použít disektory. Jak název napovídá, tento proces „rozebírá“ kód a umožňuje vám vyjmout určité aspekty, které vyžadují vaši pozornost. Tento tutoriál vysvětluje, jak vytvořit a používat disektory ve Wiresharku pomocí skriptovacího jazyka Lua.
Než začnete – Co potřebujete vědět o disektorech
Přestože disektory nabízejí rychlý způsob, jak analyzovat části datového paketu ve Wiresharku, musí se řídit některými protokoly, aby fungovaly efektivně. Tyto protokoly zahrnují následující:
- Každý disektor, který vytvoříte, musí být registrován, aby mohl zpracovávat nastavený typ užitečného zatížení z jiného protokolu. K dokončení této registrace musíte svému disektoru přiřadit objekt „Proto“, který uvidíte níže.
- Když zavoláte disektor přes Wireshark, obdrží z aplikace tři věci:
- Objekt TVB – Vyrovnávací paměť TVB z datového paketu.
- Objekt TreeItem – Kořen stromu, který představuje jeden uzel v datovém stromu.
- Pinfo Object – Informační záznam paketu.
- Dissector můžete volat pouze tehdy, pokud váš datový paket odpovídá DissectorTable, kterou jste nastavili pro váš objekt „Proto“.
- Tento požadavek můžete obejít vynucením použití disektoru pomocí funkce „Decode As“. Ale i tak můžete disektor vynutit pouze tehdy, pokud je DissectorTable, kterou nastavíte pro váš objekt „Proto“, správného typu.
Nastavení disektoru pomocí LUA
Vzhledem k tomu, že Wireshark je napsán v programovacím jazyce C a zároveň jej používá, většina disektorů je podobně napsána v jazyce C. Možná však budete chtít použít Lua. Tento skriptovací jazyk je jednodušší než C, a proto je přístupnější pro nováčky v kódování nebo pro ty, kteří chtějí jednoduše vytvořit disektor pomocí lehčího jazyka.
I když bude váš kód jednodušší, disektor, který získáte při použití Lua, je obvykle pomalejší než ten, který byste vytvořili pomocí C. Nicméně toto jsou kroky, které je třeba dodržet, pokud chcete vytvořit disektor Wireshark pomocí Lua.
Krok 1 – Nastavte Lua ve Wiresharku
Pokud jste ji ve Wiresharku dosud nepoužívali, budete ji muset nastavit:
- Klikněte na „Nápověda“ a poté na „O aplikaci Wireshark“.
- Klikněte na „Složky“.
- Chcete-li vytvořit aktivní skript Lua, vyberte jednu z následujících možností:
- Globální Lua pluginy
- Osobní Lua pluginy
- Osobní
Po aktivaci bude váš skript připraven, kdykoli spustíte Wireshark. Pokaždé, když v tomto skriptu provedete změnu, musíte buď restartovat Wireshark, aby se změna zaregistrovala, nebo stisknutím „Ctrl + Shift + L“ znovu načíst všechny vaše skripty Lua, aby byly změny aktivní.
jak zrušit ukotvení obrázku ve Wordu
Krok 2 – Základní kroky pro vytvoření vašeho disektoru
Pokud již Lua znáte, můžete pomocí následujících kroků vytvořit svůj vlastní disektorový skript, který bude fungovat ve Wiresharku:
- Deklarujte protokol pro svůj disektor, což vyžaduje, abyste nastavili jak dlouhý název pro použití ve stromu protokolu, tak krátký název, který slouží jako název zobrazovacího filtru disektoru.
- Vytvořte následující tři pole s příslušnými typy:
- Otázka – Zobrazuje typ otázky.
- Odpověď – Zobrazuje typ odpovědi.
- MessageType – Ukazuje, zda váš paket vyžaduje otázku nebo odpověď.
- Zaregistrujte svá pole, aby Wireshark věděl, jak je zobrazit. Bez registrovaných polí obdržíte zprávu „Lua Error“, která vám obvykle sděluje, že vaše ProtoField položky stromu je neplatné.
- Vytvořte disekční funkci, která obsahuje dříve zmíněné Pinfo (obsahující data o vašem paketu) a Tree Item (vytvoření stromu, který přidáte k podstromu). Musíte také vytvořit „vyrovnávací paměť“, která je umístěna nad vaším TCP.
- Zadejte protokol i port, pro který musí Wireshark použít disektor. Můžete například nastavit protokol na „TCP“ a číslo portu na to, co chcete použít.
Krok 3 – Přidejte svůj disektor do Wireshark
Právě teď je váš disektor jako žárovka bez elektřiny. Existuje, ale není vám k ničemu, dokud jím neprovedete nějakou sílu. Jinými slovy, váš disektor ještě není přidán do Wireshark, takže jej musíte přidat ručně, abyste jej mohli spustit pomocí těchto kroků:
- Klikněte na „Nápověda“ a přejděte do nabídky „O aplikaci Wireshark“.
- Vyberte kartu „Složka“ a najděte seznam cest pro váš soubor Lua.
- Vyberte „Personal Lua Plugins“. V případě potřeby vytvořte adresář.
- Zkopírujte a vložte soubor Lua, který jste vytvořili, do adresáře „Personal Lua Plugins“. Znovu načtěte Wireshark a zapněte disektor.
Je dobré provést test na vašem novém disektoru otevřením některých paketů, které jste zachytili. Wireshark by měl doručit zprávu, která zobrazuje dlouhý název, který jste vybrali pro svůj disektor, spolu s informacemi o typu zprávy (otázka nebo odpověď) a výsledku vaší kontroly.
Nějaký vzorový kód
Pokud jste ještě nevytvořili disektor (nebo jste v Lua noví), Wireshark nabízí praktický příklad disektoru, který si můžete vyzkoušet:
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)
Postdisektory a zřetězené disektory
Možná budete chtít jít trochu více do hloubky s používáním disektorů, jakmile si osvojíte jejich vytváření v Lua. Wireshark nabízí dva další typy disektorů – postdissectors a chained disectors – které nabízejí více funkcí.
Postdisektor je hodně jako závěrečná kontrola všech disektorů, které jste spustili pro paket. Zaregistrujete jej, abyste dostali upozornění, jakmile Wireshark zavolá každý další disektor, který chcete, aby použil, a můžete jej použít k filtrování sloupců „Protokol“ a „Informace“. Tato funkce je užitečná zejména v případě, že chcete odfiltrovat více paketů v relaci, kde máte dlouhou mezeru mezi datovými sadami a nemůžete si vyvolat každý jednotlivě.
Zřetězení disektorů plní podobnou funkci (alespoň pokud jde o filtrování přes dříve používané disektory), protože vám poskytuje přístup k datům jednoho disektoru. Klíčovou výhodou je, že zřetězený disektor nemusí znovu procházet každý paket, což vám dává výsledek, aniž byste museli čekat, až se znovu spustí původní disektor.
Pitvat v Lua
Vzhledem k tomu, že Wireshark již nabízí možnost vytvářet disektory v C (jeho přirozeném jazyce), možná nevidíte potřebu je vytvářet také v Lua. Přesto ti, kteří nejsou spokojeni s C, stejně jako ti, kteří již Lua zvládli, mohou zjistit, že lehké skriptování Lua usnadňuje vytváření jejich disektorů. Je pravda, že při spuštění procesu musíte vyrovnat delší dobu načítání ve srovnání s disektory na bázi C, ale je užitečné mít tuto možnost bez ohledu na to.
Chceme to slyšet od vás. Jak často ve Wiresharku používáte disektory? Zkoušeli jste je již vytvořit v C a jaké výhody podle vás přináší vytváření disektorů v Lua? Dejte nám vědět v sekci komentářů níže.