Jak korzystać z dysektora Lua w Wireshark

Przez
Jugo Mobile
Jugo Mobile to platforma poświęcona wysokiej jakości treściom z zakresu gier, sportu i technologii. Odkrywaj najwyższej klasy materiały, nawiązuj kontakt z innymi pasjonatami i ekspertami. Poznaj...
9 min czytania

Jako jedno z najlepszych na świecie narzędzi do przechwytywania pakietów sieciowych, Wireshark umożliwia uzyskanie określonych pakietów danych, dzięki czemu można je analizować zarówno w trybie offline, jak i w czasie rzeczywistym. Pomyśl o aplikacji jako o sposobie dokładnego sprawdzania danych przepływających przez Twoją sieć, co pozwala wyłapać problemy i nieprawidłowości.

Jeśli chcesz przeanalizować konkretną część danych pakietu, możesz użyć dissektorów. Jak sama nazwa wskazuje, proces ten „rozkłada” kod, umożliwiając wycięcie pewnych aspektów wymagających Twojej uwagi. W tym samouczku wyjaśniono, jak tworzyć i używać disektorów w Wireshark przy użyciu języka skryptowego Lua.

Zanim zaczniesz – co musisz wiedzieć o dysektorach

Chociaż dysektory oferują szybki sposób analizowania fragmentów pakietu danych w Wireshark, aby działać efektywnie, muszą przestrzegać pewnych protokołów. Protokoły te obejmują:

  • Każdy utworzony dysektor musi być zarejestrowany, aby obsługiwać określony typ ładunku z innego protokołu. Aby ukończyć tę rejestrację, musisz przypisać obiekt „Proto” do swojego dysektora, co zobaczysz poniżej.
  • Gdy zadzwonisz do dysektora za pośrednictwem Wireshark, otrzyma on z aplikacji trzy informacje:
    • Obiekt TVB – bufor TVB z pakietu danych.
    • Obiekt TreeItem – korzeń drzewa reprezentujący pojedynczy węzeł w drzewie danych.
    • Obiekt Pinfo – rekord informacji o pakiecie.
  • Możesz wywołać dissektora tylko wtedy, gdy twój pakiet danych pasuje do DissectorTable ustawionego dla twojego obiektu „Proto”.
    • Można obejść ten wymóg, wymuszając użycie dysektora za pomocą funkcji „Dekoduj jako”. Ale nawet wtedy możesz wymusić dysektor tylko wtedy, gdy tabela DissectorTable, którą ustawisz dla obiektu „Proto”, jest prawidłowego typu.

Konfigurowanie dysektora za pomocą LUA

Ponieważ Wireshark jest napisany i używa języka programowania C, większość dissektorów jest podobnie napisana w C. Możesz jednak chcieć używać Lua. Ten język skryptowy jest prostszy niż C, a zatem bardziej przystępny dla nowicjuszy w programowaniu lub tych, którzy po prostu chcą stworzyć dysektor przy użyciu lżejszego języka.

Chociaż Twój kod będzie prostszy, dysektor, który otrzymasz, używając Lua, jest zwykle wolniejszy niż ten, który utworzysz za pomocą C. Niemniej jednak są to kroki, które należy wykonać, jeśli chcesz utworzyć dysektor Wireshark za pomocą Lua.

Krok 1 – Skonfiguruj Lua w Wireshark

Będziesz musiał skonfigurować Lua, jeśli nie korzystałeś z niego wcześniej w Wireshark:

  1. Kliknij „Pomoc”, a następnie „Informacje o Wireshark”.
    1714071707 835 Jak korzystac z dysektora Lua w Wireshark
  2. Kliknij „Foldery”.
    1714071707 266 Jak korzystac z dysektora Lua w Wireshark
  3. Wybierz jedną z poniższych opcji, aby utworzyć aktywny skrypt Lua:
    1714071707 187 Jak korzystac z dysektora Lua w Wireshark
    • Globalne wtyczki Lua
    • Osobiste wtyczki Lua
    • Osobisty

Po aktywacji Twój skrypt będzie gotowy przy każdym uruchomieniu Wireshark. Za każdym razem, gdy dokonujesz zmiany w tym skrypcie, musisz albo ponownie uruchomić Wireshark, aby zarejestrować zmianę, albo nacisnąć „Ctrl + Shift + L”, aby ponownie załadować wszystkie skrypty Lua i aktywować zmiany.

Krok 2 – Podstawowe kroki tworzenia dysektora

Jeśli znasz już Lua, możesz wykonać następujące kroki, aby utworzyć własny skrypt dysektora, który będzie działał w Wireshark:

  • Zadeklaruj protokół dla swojego dysektora, co wymaga ustawienia zarówno długiej nazwy do użycia w drzewie protokołów, jak i krótkiej nazwy, która służy jako nazwa filtra wyświetlania dysektora.
    • Utwórz następujące trzy pola z odpowiednimi typami:
    • Pytanie – pokazuje typ pytania.
    • Odpowiedź – pokazuje typ odpowiedzi.
  • MessageType – pokazuje, czy Twój pakiet żąda pytania, czy odpowiedzi.
  • Zarejestruj swoje pola, aby Wireshark wiedział, jak je wyświetlić. Bez zarejestrowanych pól otrzymasz komunikat „Błąd Lua”, zwykle informujący, że Twoje ProtoField elementu drzewa jest nieprawidłowe.
  • Utwórz funkcję rozcinania, która zawiera wspomniane wcześniej Pinfo (zawierające dane o twoim pakiecie) i Element drzewa (tworząc drzewo, które dołączysz do poddrzewa). Musisz także utworzyć „bufor” znajdujący się na wierzchu protokołu TCP.
  • Określ protokół i port, dla których Wireshark musi używać disektora. Na przykład możesz ustawić protokół na „TCP”, a numer portu na dowolny, którego chcesz używać.

Krok 3 – Dodaj swój Dissektor do Wireshark

W tej chwili twój dysektor jest jak żarówka bez prądu. Istnieje, ale nie będzie dla ciebie użyteczny, dopóki nie przepuścisz przez niego trochę mocy. Innymi słowy, twój dysektor nie został jeszcze dodany do Wireshark, więc musisz dodać go ręcznie, aby uruchomić, wykonując następujące kroki:

  1. Kliknij „Pomoc” i przejdź do menu „Informacje o Wireshark”.
    1714071707 835 Jak korzystac z dysektora Lua w Wireshark
  2. Wybierz zakładkę „Folder”, aby znaleźć listę ścieżek do pliku Lua.
    1714071707 266 Jak korzystac z dysektora Lua w Wireshark
  3. Wybierz „Osobiste wtyczki Lua”. W razie potrzeby utwórz katalog.
    1714071707 844 Jak korzystac z dysektora Lua w Wireshark
  4. Skopiuj i wklej utworzony plik Lua do katalogu „Osobiste wtyczki Lua”. Załaduj ponownie Wireshark, aby włączyć dysektor.

Dobrym pomysłem jest przetestowanie nowego dissektora poprzez otwarcie niektórych przechwyconych pakietów. Wireshark powinien dostarczyć wiadomość zawierającą długą nazwę wybraną dla dysektora, wraz z informacjami o typie wiadomości (pytanie lub odpowiedź) i wyniku sprawdzenia.

Trochę przykładowego kodu

Jeśli nie tworzyłeś wcześniej dysektora (lub jesteś nowy w Lua), Wireshark oferuje przydatny przykładowy dysektor do wypróbowania:

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)

Dysektory postdysektorowe i dysektory łańcuchowe

Gdy już opanujesz tworzenie dysektorów w Lua, możesz nieco bardziej szczegółowo przyjrzeć się używaniu dysektorów. Wireshark oferuje dwa dodatkowe typy dysektorów – postdysektory i dysektory łańcuchowe – które oferują większą funkcjonalność.

Postdissektor przypomina końcowe sprawdzenie wszystkich dissektorów, które uruchomiłeś w celu uzyskania pakietu. Rejestrujesz go, aby otrzymywać powiadomienia, gdy Wireshark wywoła wszystkie inne dissektory, których chcesz używać, i możesz go użyć do filtrowania kolumn „Protokół” i „Informacje”. Ta funkcja jest szczególnie przydatna, jeśli chcesz odfiltrować wiele pakietów w sesji, w której występuje duża przerwa między zestawami danych i nie możesz przywołać każdego z osobna.

Łączenie dysektorów w łańcuchy spełnia podobną funkcję (przynajmniej w zakresie filtrowania poprzednio używanych dysektorów), dając dostęp do danych pojedynczego dysektora. Kluczową zaletą jest to, że połączony dysektor nie musi ponownie przeglądać każdego pakietu, co daje wynik bez konieczności czekania na ponowne uruchomienie oryginalnego dysektora.

Przeanalizuj w Lua

Biorąc pod uwagę, że Wireshark oferuje już możliwość tworzenia dysektorów w C (jego języku naturalnym), możesz nie widzieć potrzeby tworzenia ich również w Lua. Mimo to ci, którzy nie czują się dobrze w C, a także ci, którzy już opanowali Lua, mogą odkryć, że lekkie skrypty Lua ułatwiają tworzenie dysektorów. To prawda, że ​​podczas uruchamiania procesu musisz rezygnować z dłuższego czasu ładowania w porównaniu z dysektorami opartymi na C, ale mimo to warto mieć taką opcję.

Udostępnij ten artykuł
Obserwuj
Jugo Mobile to platforma poświęcona wysokiej jakości treściom z zakresu gier, sportu i technologii. Odkrywaj najwyższej klasy materiały, nawiązuj kontakt z innymi pasjonatami i ekspertami. Poznaj najnowsze trendy i innowacje w naszej dynamicznej społeczności. Dołącz do nas i doświadcz przyszłości już dziś!
Rozwijaj swoją markę i dotrzyj do szerszej publiczności. Reklamuj się u nas już dziś i zyskaj uwagę tysięcy.
© 2025 Jugo Mobile. Wszelkie prawa zastrzeżone.