Pagrindinis Kita Kaip naudoti „Lua Dissector“ „Wireshark“.

Kaip naudoti „Lua Dissector“ „Wireshark“.



Kaip vienas geriausių pasaulyje tinklo paketų fiksavimo įrankių, „Wireshark“ leidžia gauti konkrečius duomenų paketus, kad galėtumėte juos analizuoti tiek neprisijungę, tiek realiuoju laiku. Pagalvokite apie programą kaip apie būdą atidžiai išnagrinėti tinkle tekančius duomenis, kad galėtumėte pastebėti problemas ir pažeidimus.

  Kaip naudoti „Lua Dissector“ „Wireshark“.

Galite naudoti skirstytuvus, jei norite analizuoti konkrečią paketo duomenų dalį. Kaip rodo pavadinimas, šis procesas „išsklaido“ kodą, leidžiantį iškirpti tam tikrus aspektus, į kuriuos reikia atkreipti dėmesį. Šioje pamokoje paaiškinama, kaip sukurti ir naudoti „Wireshark“ skirstytuvus naudojant Lua scenarijų kalbą.

Prieš pradėdami – ką reikia žinoti apie disektorius

Nors skirstytuvai siūlo greitą būdą analizuoti duomenų paketo dalis Wireshark, jie turi laikytis kai kurių protokolų, kad veiktų efektyviai. Šie protokolai apima:

  • Kiekvienas jūsų sukurtas skirstytuvas turi būti užregistruotas, kad galėtų apdoroti tam tikro tipo naudingąją apkrovą iš kito protokolo. Norėdami užbaigti šią registraciją, savo disektoriui turite priskirti 'Proto' objektą, kurį pamatysite toliau.
  • Kai skambinate disektoriui per „Wireshark“, jis gauna tris dalykus iš programos:
    • TVB objektas – TVB buferis iš duomenų paketo.
    • „TreeItem“ objektas – medžio šaknis, vaizduojanti vieną mazgą duomenų medyje.
    • Pinfo Object – paketo informacijos įrašas.
  • Dissector galite iškviesti tik tuo atveju, jei jūsų duomenų paketas atitinka DissectorTable, kurią nustatėte savo „Proto“ objektui.
    • Galite apeiti šį reikalavimą priversdami naudoti skirstytuvą naudodami funkciją „Decode As“. Bet net ir tada galite priverstinai disektorių tik tuo atveju, jei DissectorTable, kurią nustatėte savo „Proto“ objektui, yra tinkamo tipo.

Dissektoriaus nustatymas naudojant LUA

Kadangi „Wireshark“ yra parašyta C programavimo kalba ir ja naudojasi, dauguma skirstytuvų panašiai parašyti C kalba. Tačiau galbūt norėsite naudoti Lua. Ši scenarijų kalba yra paprastesnė nei C, todėl lengviau prieinama kodavimo naujokams arba tiems, kurie tiesiog nori sukurti sklaidytuvą naudodami lengvesnę kalbą.

Nors jūsų kodas bus paprastesnis, naudojant Lua gaunamas skirstytuvas paprastai yra lėtesnis nei tas, kurį sukurtumėte naudodami C. Nepaisant to, šiuos veiksmus reikia atlikti, jei norite sukurti „Wireshark“ skirstytuvą naudodami „Lua“.

1 veiksmas – nustatykite „Lua“ „Wireshark“.

Turėsite nustatyti Lua, jei anksčiau jo nenaudojote Wireshark:

kaip palikti sukurtą nesantaikos serverį
  1. Spustelėkite „Help“, tada „About Wireshark“.
  2. Spustelėkite „Aplankai“.
  3. Norėdami sukurti aktyvų Lua scenarijų, pasirinkite vieną iš šių:
    • Visuotiniai Lua papildiniai
    • Asmeniniai Lua papildiniai
    • Asmeninis

Kai suaktyvinsite, jūsų scenarijus bus paruoštas kiekvieną kartą, kai paleisite „Wireshark“. Kiekvieną kartą, kai keičiate tą scenarijų, turite iš naujo paleisti „Wireshark“, kad užregistruotumėte pakeitimą, arba paspauskite „Ctrl + Shift + L“, kad iš naujo įkeltumėte visus „Lua“ scenarijus, kad pakeitimai būtų aktyvūs.

2 veiksmas – pagrindiniai disektoriaus kūrimo žingsniai

Jei jau esate susipažinę su Lua, galite atlikti šiuos veiksmus, kad sukurtumėte savo išskaidymo scenarijų, kuris veiks Wireshark:

  • Deklaruokite savo disektoriaus protokolą, kuriam reikia nustatyti ilgą pavadinimą, kurį naudosite protokolo medyje, ir trumpąjį pavadinimą, kuris būtų naudojamas kaip disektoriaus rodymo filtro pavadinimas.
    • Sukurkite šiuos tris laukus su atitinkamais tipais:
    • Klausimas – rodo klausimo tipą.
    • Atsakymas – rodo atsakymo tipą.
  • MessageType – parodo, ar jūsų pakete prašoma klausimo ar atsakymo.
  • Užregistruokite laukus, kad „Wireshark“ žinotų, kaip juos rodyti. Be registruotų laukų gausite pranešimą „Lua Error“, paprastai nurodantį, kad medžio elemento protolaukas yra neteisingas.
  • Sukurkite išskaidymo funkciją, apimančią anksčiau minėtą Pinfo (kurioje yra duomenų apie jūsų paketą) ir medžio elementą (sukuria medį, kurį pridėsite prie pomedžio). Taip pat turite sukurti „buferį“, kuris yra jūsų TCP viršuje.
  • Nurodykite protokolą ir prievadą, kuriam Wireshark turi naudoti skirstytuvą. Pavyzdžiui, galite nustatyti protokolą į „TCP“, o prievado numerį – į tą, kurį norite naudoti.

3 veiksmas – pridėkite savo Dissector prie „Wireshark“.

Šiuo metu jūsų skrodiklis yra kaip lemputė be elektros. Jis egzistuoja, bet jums tai nenaudinga, kol negalite panaudoti jo galios. Kitaip tariant, jūsų disekatorius dar nepridėtas prie „Wireshark“, todėl turite jį pridėti rankiniu būdu, kad paleistumėte atlikdami šiuos veiksmus:

Žmogus-voras / PS4 patarimai ir gudrybės
  1. Spustelėkite „Pagalba“ ir eikite į meniu „Apie Wireshark“.
  2. Pasirinkite skirtuką „Aplankas“, kad rastumėte „Lua“ failo kelių sąrašą.
  3. Pasirinkite „Asmeniniai Lua papildiniai“. Jei reikia, sukurkite katalogą.
  4. Nukopijuokite ir įklijuokite sukurtą Lua failą į katalogą „Personal Lua Plugins“. Iš naujo įkelkite Wireshark, kad įjungtumėte disektorių.

Pravartu išbandyti naująjį skirstytuvą atidarius kai kuriuos užfiksuotus paketus. „Wireshark“ turėtų pateikti pranešimą, kuriame būtų rodomas ilgas jūsų pasirinktas disektoriaus pavadinimas, taip pat informacija apie pranešimo tipą (klausimas arba atsakymas) ir patikrinimo rezultatas.

Kai kurie pavyzdiniai kodai

Jei anksčiau nesukūrėte disektoriaus (arba esate naujas Lua), Wireshark siūlo jums patogų disektoriaus pavyzdį, kurį galite išbandyti:

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)

Postdisektoriai ir grandininiai skrodytojai

Galbūt norėsite šiek tiek nuodugniau pasidomėti savo disektoriaus naudojimu, kai tik įvaldysite juos kurti Lua programoje. „Wireshark“ siūlo du papildomus skirstytuvų tipus – postdisektorius ir grandininius skirstytuvus, kurie siūlo daugiau funkcionalumo.

Postdissector yra labai panašus į galutinį visų išskaidytojų, kuriuos atlikote paketui, patikrinimą. Užregistruojate jį, kad gautumėte pranešimą, kai „Wireshark“ iškvies visus kitus norimus naudoti skirstytuvus, ir galite jį naudoti norėdami filtruoti stulpelius „Protokolas“ ir „Informacija“. Ši funkcija ypač naudinga, jei norite išfiltruoti kelis paketus per seansą, kai tarp duomenų rinkinių buvo ilgas tarpas ir negalite prisiminti kiekvieno atskirai.

Sujungimo skirstytuvai atlieka panašią funkciją (bent jau filtravimo per anksčiau naudotus skirstytuvus), nes suteikia prieigą prie vieno išskaidymo elementų duomenų. Pagrindinis privalumas yra tas, kad grandininiam skirstytuvui nereikia iš naujo pereiti kiekvieno paketo, o tai suteikia jums rezultatą, nepriverčiant laukti, kol pradinis skirstytuvas vėl paleis.

Skrodykite Lua

Atsižvelgiant į tai, kad „Wireshark“ jau siūlo galimybę kurti daliklius C (jo natūralia kalba), galite nematyti poreikio juos kurti ir Lua kalba. Vis dėlto tie, kuriems netinka C, taip pat tie, kurie jau yra įvaldę Lua, gali pastebėti, kad lengvas Lua scenarijus palengvina jų kūrimą. Tiesa, vykdydami procesą turite pakeisti ilgesnį įkėlimo laiką, palyginti su C pagrindu veikiančiais išskaidytojais, tačiau naudinga turėti galimybę nepaisant to.

Tai pasakę, norime išgirsti jūsų nuomonę. Kaip dažnai Wireshark naudojate skirstytuvus? Ar anksčiau bandėte juos kurti C kalba ir kokią naudą, jūsų manymu, duoda išskaidytojų kūrimas Lua kalba? Praneškite mums toliau pateiktame komentarų skyriuje.

Įdomios Straipsniai