A világ egyik legjobb hálózati csomagrögzítő eszközeként a Wireshark lehetővé teszi bizonyos adatcsomagok elérését, így offline és valós időben is elemezheti azokat. Tekintse az alkalmazást úgy, mint egy módot a hálózaton keresztül áramló adatok alapos vizsgálatára, lehetővé téve a problémák és szabálytalanságok észlelését.
Dissektorokat használhat, ha egy csomag adatainak egy meghatározott részét szeretné elemezni. Ahogy a neve is sugallja, ez a folyamat „boncolja” a kódot, lehetővé téve, hogy kivágjon bizonyos szempontokat, amelyekre figyelmet kell fordítani. Ez az oktatóanyag elmagyarázza, hogyan hozhat létre és használjon disszektorokat a Wiresharkban a Lua szkriptnyelv használatával.
Mielőtt elkezdené – Amit a dissectorokról tudni kell
Bár a disszektorok gyors módot kínálnak az adatcsomag egyes részeinek elemzésére a Wiresharkban, a hatékony működéshez követniük kell néhány protokollt. Ezek a protokollok a következőket tartalmazzák:
- Minden létrehozott dissektort regisztrálni kell egy meghatározott típusú hasznos adat kezeléséhez egy másik protokollból. A regisztráció befejezéséhez hozzá kell rendelnie egy „Proto” objektumot a dissektorához, amelyet alább láthat.
- Amikor a Wiresharkon keresztül hív egy dissektort, az három dolgot kap az alkalmazástól:
- TVB Object – TVB puffer az adatcsomagból.
- TreeItem Object – Fagyökér, amely egyetlen csomópontot képvisel az adatfában.
- Pinfo Object – Csomaginformációs rekord.
- Dissector csak akkor hívható meg, ha az adatcsomagja megegyezik a „Proto” objektumra beállított DissectorTable-val.
- Megkerülheti ezt a követelményt, ha a „Decode As” funkción keresztül kényszeríti a dissektor használatát. De akkor is csak akkor kényszerítheti a dissectort, ha a „Proto” objektumra beállított DissectorTable megfelelő típusú.
A Dissector beállítása a LUA használatával
Mivel a Wireshark C programozási nyelven íródott és azt is használja, a legtöbb dissector hasonlóképpen C nyelven íródott. Azonban érdemes Lua-t használni. Ez a szkriptnyelv egyszerűbb, mint a C, és így könnyebben elérhető a kódoló újoncok, vagy azok számára, akik egyszerűen csak dissectort szeretnének létrehozni egy könnyebb nyelv használatával.
Bár a kódja egyszerűbb lesz, a Lua használatakor kapott feldaraboló általában lassabb, mint a C használatával létrehozott. Mindazonáltal ezeket a lépéseket kell követnie, ha Wireshark-bontót szeretne létrehozni Lua használatával.
1. lépés – A Lua beállítása a Wiresharkban
Be kell állítania a Lua-t, ha még nem használta a Wiresharkban:
- Kattintson a „Súgó”, majd az „A Wireshark névjegye” elemre.
- Kattintson a „Mappák” elemre.
- Aktív Lua-szkript létrehozásához válassza a következők egyikét:
- Globális Lua bővítmények
- Személyes Lua bővítmények
- Személyes
Az aktiválás után a szkript készen áll, amikor elindítja a Wiresharkot. Minden alkalommal, amikor módosítja a szkriptet, vagy újra kell indítania a Wiresharkot a módosítás regisztrálásához, vagy le kell nyomnia a „Ctrl + Shift + L” billentyűkombinációt az összes Lua-szkript újratöltéséhez a módosítások aktiválásához.
2. lépés – A Dissector létrehozásának alapvető lépései
Ha már ismeri a Lua-t, a következő lépésekkel létrehozhatja saját dissector szkriptjét, amely működni fog a Wiresharkban:
- Deklarálja a disszekor protokollját, amely megköveteli, hogy beállítson egy hosszú nevet a protokollfában való használatra, és egy rövid nevet, amely a dissektor megjelenítési szűrőjének neveként szolgál.
- Hozza létre a következő három mezőt a megfelelő típusokkal:
- Kérdés – A kérdés típusát mutatja.
- Válasz – A válasz típusát mutatja.
- MessageType – Megmutatja, hogy a csomag kér-e kérdést vagy választ.
- Regisztrálja mezőit, hogy a Wireshark tudja, hogyan jelenítse meg őket. Regisztrált mezők nélkül „Lua Error” üzenetet fog kapni, amely általában azt jelzi, hogy a faelem protomezője érvénytelen.
- Hozzon létre egy boncolási függvényt, amely tartalmazza a korábban említett Pinfo-t (amely a csomagra vonatkozó adatokat tartalmazza) és a Fa elemet (amely létrehozza azt a fát, amelyet egy részfához fog hozzáfűzni). Létre kell hoznia egy „puffert” is, amely a TCP tetején található.
- Adja meg mind a protokollt, mind a portot, amelyhez a Wiresharknak használnia kell a dissektort. Például beállíthatja a protokollt „TCP”-re, a portszámot pedig arra, amelyet használni szeretne.
3. lépés – Adja hozzá a Dissectort a Wiresharkhoz
Jelenleg a boncolód olyan, mint egy villanykörte áram nélkül. Létezik, de semmi hasznodra, amíg nem tudsz rajta erőt kifejteni. Más szóval, a dissektor még nincs hozzáadva a Wireshark-hoz, ezért manuálisan kell hozzáadnia a futtatáshoz az alábbi lépésekkel:
- Kattintson a „Súgó” elemre, és lépjen az „A Wireshark névjegye” menübe.
- Válassza a „Mappa” lapot a Lua fájl elérési útjainak listájának megtekintéséhez.
- Válassza a „Személyes Lua bővítmények” lehetőséget. Ha szükséges, hozzon létre egy könyvtárat.
- Másolja ki és illessze be a létrehozott Lua fájlt a „Personal Lua Plugins” könyvtárba. Töltse be újra a Wiresharkot a dissektor bekapcsolásához.
Célszerű tesztelni az új dissektort úgy, hogy megnyit néhány rögzített csomagot. A Wiresharknak üzenetet kell küldenie, amely tartalmazza a boncolónak választott hosszú nevet, valamint az üzenet típusára vonatkozó információkat (kérdés vagy válasz) és az ellenőrzés eredményét.
Néhány mintakód
Ha még nem hozott létre boncolót (vagy még új a Lua), Wireshark praktikus példaboncolót kínál, amelyet kipróbálhat:
hogyan adjunk hozzá betűtípusokat a word mac-hoz
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)
Utóboncok és láncboncolók
Érdemes lehet egy kicsit alaposabban belemenni a disszektorok használatába, miután elsajátította a létrehozásukat a Luában. A Wireshark két további bontótípust kínál – posztdisszektorokat és láncolt dissektorokat –, amelyek több funkcionalitást kínálnak.
Az utóboncoló nagyon hasonlít az összes olyan dissektor végső ellenőrzésére, amelyet egy csomagért futtatott. Regisztrálja, hogy értesítést kapjon, ha a Wireshark minden más dissektort meghívott, amelyet használni szeretne, és használhatja a „Protocol” és az „Info” oszlopok szűrésére. Ez a funkció különösen akkor hasznos, ha több csomagot szeretne kiszűrni egy munkamenetben, ahol hosszú idő telt el az adatkészletek között, és nem tudja mindegyiket külön-külön előhívni.
A boncolók láncolása hasonló funkciót tölt be (legalábbis ami a korábban használt dissektorokon keresztül való szűrést illeti), mivel egyetlen dissektor adataihoz fér hozzá. A legfontosabb előny itt az, hogy a láncolt dissectornak nem kell újra végigfutnia minden csomagon, így eredményt ad anélkül, hogy meg kellene várnia, amíg az eredeti dissector újra fut.
Boncolás Luában
Tekintettel arra, hogy a Wireshark már kínálja a dissektorok létrehozásának lehetőségét C nyelven (természetes nyelvén), előfordulhat, hogy nem látja szükségét ezek létrehozására Lua nyelven is. Ennek ellenére azok, akik nem érzik jól magukat a C-vel, valamint azok, akik már elsajátították a Luát, azt tapasztalhatják, hogy a Lua könnyű forgatókönyve megkönnyíti a disszektorok létrehozását. Igaz, a folyamat futtatásakor hosszabb betöltési időt kell lecserélnie a C-alapú dissektorokhoz képest, de hasznos, ha ettől függetlenül megvan a lehetőség.
Ezzel szeretnénk hallani önről. Milyen gyakran használ disszektorokat a Wiresharkban? Próbáltad már létrehozni őket C nyelven, és szerinted milyen előnyökkel jár a boncolók Lua nyelven történő elkészítése? Tudassa velünk az alábbi megjegyzések részben.