Kao jedan od najboljih svjetskih alata za hvatanje mrežnih paketa, Wireshark vam omogućuje da dobijete određene pakete podataka kako biste ih mogli analizirati izvan mreže i u stvarnom vremenu. Zamislite aplikaciju kao način da pažljivo ispitate podatke koji teku kroz vašu mrežu, što vam omogućuje da uhvatite probleme i nepravilnosti.
Možete koristiti disektore ako želite analizirati određeni dio podataka paketa. Kao što naziv implicira, ovaj proces 'secira' kod, omogućujući vam da izrežete određene aspekte koji zahtijevaju vašu pozornost. Ovaj vodič objašnjava kako stvoriti i koristiti dissektore u Wiresharku koristeći Lua skriptni jezik.
Prije nego počnete – što trebate znati o disektorima
Iako disektori nude brz način analize dijelova paketa podataka u Wiresharku, moraju slijediti neke protokole da bi učinkovito radili. Ovi protokoli uključuju sljedeće:
- Svaki dissektor koji stvorite mora biti registriran za rukovanje određenom vrstom korisnog opterećenja iz drugog protokola. Da biste dovršili ovu registraciju, morate svom disektoru dodijeliti objekt 'Proto', što ćete vidjeti u nastavku.
- Kada pozovete dissektor putem Wiresharka, on od aplikacije prima tri stvari:
- TVB objekt – TVB međuspremnik iz podatkovnog paketa.
- Objekt TreeItem – korijen stabla koji predstavlja jedan čvor u stablu podataka.
- Pinfo Object – Zapis podataka o paketu.
- Dissector možete pozvati samo ako se vaš podatkovni paket podudara s DissectorTableom koji ste postavili na svoj “Proto” objekt.
- Ovaj zahtjev možete zaobići prisiljavanjem na upotrebu disektora putem funkcije 'Decode As'. Ali čak i tada, dissektor možete prisiliti samo ako je DissectorTable koji ste postavili na svoj “Proto” objekt ispravnog tipa.
Postavljanje disektora pomoću LUA
Budući da je Wireshark i napisan u programskom jeziku C i koristi ga, većina dissektora je na sličan način napisana u C-u. Međutim, možda biste željeli koristiti Lua. Ovaj skriptni jezik jednostavniji je od C-a i stoga pristupačniji početnicima u kodiranju ili onima koji jednostavno žele stvoriti dissektor koristeći lakši jezik.
Iako će vaš kod biti jednostavniji, dissektor koji dobijete korištenjem Lua obično je sporiji od onog koji biste izradili pomoću C. Ipak, ovo su koraci koje trebate slijediti ako želite stvoriti Wireshark dissektor koristeći Lua.
Korak 1 – Postavite Lua u Wiresharku
Morat ćete postaviti Lua ako ga prije niste koristili u Wiresharku:
- Kliknite 'Pomoć', a zatim 'O Wiresharku'.
- Kliknite 'Mape'.
- Odaberite jedno od sljedećeg za izradu aktivne Lua skripte:
- Globalni Lua dodaci
- Osobni Lua dodaci
- Osobno
Nakon aktivacije, vaša će skripta biti spremna kad god pokrenete Wireshark. Svaki put kada napravite promjenu na toj skripti, trebate ponovno pokrenuti Wireshark da registrirate promjenu ili pritisnuti “Ctrl + Shift + L” da ponovno učitate sve svoje Lua skripte kako bi vaše promjene postale aktivne.
Korak 2 – Osnovni koraci za izradu vašeg disektora
Ako ste već upoznati s Luom, možete upotrijebiti sljedeće korake za izradu vlastite dissektorske skripte koja će raditi u Wiresharku:
- Deklarirajte protokol za svoj dissektor, što zahtijeva da postavite dugo ime za upotrebu u stablu protokola i kratko ime koje služi kao naziv filtra za prikaz disektora.
- Napravite sljedeća tri polja s odgovarajućim vrstama:
- Pitanje – Prikazuje vrstu pitanja.
- Odgovor – Prikazuje vrstu odgovora.
- MessageType – pokazuje zahtijeva li vaš paket pitanje ili odgovor.
- Registrirajte svoja polja kako bi Wireshark znao kako ih prikazati. Bez registriranih polja, primit ćete poruku 'Lua Error', koja vam obično govori da je vaše ProtoField stavke stabla nevažeće.
- Napravite funkciju disekcije koja uključuje prethodno spomenuti Pinfo (koji sadrži podatke o vašem paketu) i Tree Item (stvarajući stablo koje ćete dodati podstablu). Također morate stvoriti 'međuspremnik' koji se nalazi na vrhu vašeg TCP-a.
- Navedite i protokol i priključak za koji Wireshark mora koristiti dissektor. Na primjer, možete postaviti protokol na 'TCP' i broj porta na onaj koji želite koristiti.
Korak 3 – Dodajte svoj Dissector u Wireshark
Upravo sada, vaš dissektor je kao žarulja bez struje. Postoji, ali vam nije od koristi dok kroz njega ne provedete malo energije. Drugim riječima, vaš dissektor još nije dodan u Wireshark, pa ga morate dodati ručno da biste ga pokrenuli koristeći ove korake:
- Kliknite na 'Pomoć' i idite na izbornik 'O Wiresharku'.
- Odaberite karticu 'Mapa' kako biste pronašli popis staza za svoju Lua datoteku.
- Odaberite 'Osobni dodaci za Lua.' Izradite imenik ako je potrebno.
- Kopirajte i zalijepite Lua datoteku koju ste stvorili u direktorij 'Personal Lua Plugins'. Ponovno učitajte Wireshark da biste uključili disektor.
Bilo bi dobro pokrenuti test na vašem novom disektoru otvaranjem nekih paketa koje ste uhvatili. Wireshark bi trebao isporučiti poruku koja prikazuje dugo ime koje ste odabrali za svoj dissektor, zajedno s informacijama o vrsti poruke (pitanje ili odgovor) i rezultat vaše provjere.
Neki primjer koda
Ako prije niste stvorili dissektor (ili ste novi u Lui), Wireshark nudi praktičan primjer disektora koji možete isprobati:
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)
Postdisektori i lančani disektori
Možda ćete htjeti ići malo dublje s upotrebom disektora nakon što svladate njihovu izradu u Lui. Wireshark nudi dvije dodatne vrste disektora – postdisektore i lančane disektore – koji nude više funkcionalnosti.
Postdissektor je dosta sličan konačnoj provjeri svih dissektora koje ste pokrenuli za paket. Registrirate ga da dobijete obavijest nakon što Wireshark pozove svaki drugi dissektor koji želite da koristi, a možete ga koristiti za filtriranje stupaca 'Protokol' i 'Informacije'. Ova je značajka posebno korisna ako želite filtrirati više paketa u sesiji u kojoj ste imali veliki razmak između skupova podataka i ne možete se sjetiti svakog pojedinačno.
kako promijeniti vrijeme na snapchat filtru -
Lančano povezivanje disektora ima sličnu funkciju (barem u smislu filtriranja kroz prethodno korištene disektore) dajući vam pristup podacima jednog disektora. Ključna prednost ovdje je da ulančani dissektor ne mora ponovno prolaziti kroz svaki paket, dajući vam rezultat bez da morate čekati da se originalni dissektor ponovno pokrene.
Secirajte u Lui
S obzirom da Wireshark već nudi mogućnost stvaranja disektora u C-u (njegovom prirodnom jeziku), možda nećete vidjeti potrebu za njihovim stvaranjem i u Lua-i. Ipak, oni koji nisu zadovoljni s C-om, kao i oni koji su već svladali Lua, mogli bi otkriti da lagano skriptiranje Lua olakšava stvaranje njihovih disektora. Doduše, kada pokrenete proces morate zamijeniti dulje vrijeme učitavanja u usporedbi s disektorima baziranim na C-u, ali bez obzira na to korisno je imati tu opciju.
Uz to rečeno, želimo čuti vaše mišljenje. Koliko često koristite disektore u Wiresharku? Jeste li ih prije pokušali izraditi u C-u i što mislite koje prednosti donosi izrada disektora u Lui? Javite nam u odjeljku za komentare ispod.