Как использовать Lua Dissector в Wireshark
Являясь одним из лучших в мире инструментов захвата сетевых пакетов, Wireshark позволяет вам получать определенные пакеты данных, чтобы вы могли анализировать их как в автономном режиме, так и в режиме реального времени. Думайте о приложении как о способе тщательного изучения данных, проходящих через вашу сеть, что позволяет вам выявлять проблемы и нарушения.
Вы можете использовать диссекторы, если хотите проанализировать определенную часть данных пакета. Как следует из названия, этот процесс «анализирует» код, позволяя вам вырезать определенные аспекты, требующие вашего внимания. В этом руководстве объясняется, как создавать и использовать диссекторы в Wireshark с использованием языка сценариев Lua.
Программы для Windows, мобильные приложения, игры - ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале - Подписывайтесь:)
Прежде чем начать – что нужно знать о диссекторах
Хотя диссекторы предлагают быстрый способ анализа частей пакета данных в Wireshark, для эффективной работы им необходимо следовать некоторым протоколам. Эти протоколы включают следующее:
- Каждый создаваемый вами диссектор должен быть зарегистрирован для обработки заданного типа полезной нагрузки из другого протокола. Чтобы завершить регистрацию, вы должны назначить объект «Прото» вашему диссектору, который вы увидите ниже.
- Когда вы вызываете диссектор через Wireshark, он получает от приложения три вещи:
- Объект TVB – буфер TVB из пакета данных.
- Объект TreeItem — корень дерева, представляющий один узел в дереве данных.
- Объект Pinfo – запись информации о пакете.
- Вы можете вызвать диссектор только в том случае, если ваш пакет данных соответствует DissectorTable, который вы установили для своего объекта «Прото».
- Вы можете обойти это требование, заставив использовать диссектор с помощью функции «Декодировать как». Но даже в этом случае вы можете принудительно использовать диссектор только в том случае, если DissectorTable, который вы установили для своего объекта «Прото», имеет правильный тип.
Настройка диссектора с использованием LUA
Поскольку Wireshark написан на языке программирования C и использует его, большинство диссекторов также написаны на C. Однако вы можете использовать Lua. Этот язык сценариев проще, чем C, и, следовательно, более доступен для новичков в программировании или тех, кто просто хочет создать диссектор, используя более легкий язык.
Хотя ваш код будет проще, диссектор, который вы получите при использовании Lua, обычно медленнее, чем тот, который вы создадите с помощью C. Тем не менее, это шаги, которые необходимо выполнить, если вы хотите создать диссектор Wireshark с использованием Lua.
Шаг 1. Настройте Lua в Wireshark
Вам нужно будет настроить Lua, если вы раньше не использовали его в Wireshark:
- Нажмите «Справка», а затем «О Wireshark».
- Нажмите «Папки».
- Выберите один из следующих вариантов, чтобы создать активный сценарий Lua:
- Глобальные плагины Lua
- Персональные плагины Lua
- Персональный
После активации ваш скрипт будет готов при каждом запуске Wireshark. Каждый раз, когда вы вносите изменения в этот скрипт, вам нужно либо перезапустить Wireshark, чтобы зарегистрировать изменение, либо нажать «Ctrl + Shift + L», чтобы перезагрузить все ваши сценарии Lua и сделать ваши изменения активными.
Шаг 2 – Основные шаги по созданию диссектора
Если вы уже знакомы с Lua, вы можете использовать следующие шаги, чтобы создать собственный скрипт диссектора, который будет работать в Wireshark:
- Объявите протокол для вашего диссектора, который требует, чтобы вы установили как длинное имя для использования в дереве протоколов, так и короткое имя, которое будет служить именем фильтра отображения диссектора.
- Создайте следующие три поля с соответствующими типами:
- Вопрос – показывает тип вопроса.
- Ответ – показывает тип ответа.
- MessageType — показывает, запрашивает ли ваш пакет вопрос или ответ.
- Зарегистрируйте свои поля, чтобы Wireshark знал, как их отображать. Без зарегистрированных полей вы получите сообщение «Lua Error», обычно сообщающее, что ваше ProtoField элемента дерева недействительно.
- Создайте функцию анализа, включающую ранее упомянутую Pinfo (содержащую данные о вашем пакете) и элемент дерева (создание дерева, которое вы добавите к поддереву). Вы также должны создать «буфер», который находится поверх вашего TCP.
- Укажите протокол и порт, для которых Wireshark должен использовать диссектор. Например, вы можете установить протокол «TCP», а номер порта — тот, который вы хотите использовать.
Шаг 3. Добавьте свой диссектор в Wireshark
Прямо сейчас ваш диссектор подобен лампочке без электричества. Он существует, но он бесполезен для вас, пока вы не пропустите через него немного энергии. Другими словами, ваш диссектор еще не добавлен в Wireshark, поэтому вам придется добавить его вручную, чтобы запустить его, выполнив следующие действия:
- Нажмите «Справка» и перейдите в меню «О Wireshark».
- Выберите вкладку «Папка», чтобы найти список путей к вашему файлу Lua.
- Выберите «Личные плагины Lua». При необходимости создайте каталог.
- Скопируйте и вставьте созданный вами файл Lua в каталог «Личные плагины Lua». Перезагрузите Wireshark, чтобы включить диссектор.
Хорошая идея — протестировать ваш новый диссектор, открыв некоторые из захваченных вами пакетов. Wireshark должен доставить сообщение, в котором указано длинное имя, которое вы выбрали для своего диссектора, а также информация о типе сообщения (вопрос или ответ) и результате вашей проверки.
Некоторый пример кода
Если вы еще не создавали диссектор (или вы новичок в Lua), Вайршарк предлагает вам удобный пример диссектора:
Программы для Windows, мобильные приложения, игры - ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале - Подписывайтесь:)
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) = “входящий”, (0) = “исходящий”}) 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 } функция p_multi.dissector(buf, pkt,tree) локальное поддерево = дерево:add(p_multi, buf(0,2)) поддерево:add(f_proto, buf) (0,1)) поддерево:add(f_dir, buf(1,1)) local proto_id = buf(0,1):uint() local dissector = protos(proto_id) if dissector ~= nil then — Диссектор найден , вызвать субдиссектор с новым Tvb, — созданным из текущего буфера (пропуская первые два байта). диссектор: вызов (buf (2): tvb (), pkt, дерево) elseif proto_id
Постдиссекторы и цепные диссекторы
Возможно, вам захочется более подробно изучить использование диссектора, как только вы освоите его создание в Lua. Wireshark предлагает два дополнительных типа диссектора — постдиссекторы и цепные диссекторы — которые предлагают больше функциональности.
Постдиссектор во многом похож на окончательную проверку всех диссекторов, которые вы запустили на наличие пакета. Вы регистрируете его, чтобы получать уведомления, как только Wireshark вызовет каждый другой диссектор, который вы хотите использовать, и вы можете использовать его для фильтрации столбцов «Протокол» и «Информация». Эта функция особенно полезна, если вы хотите отфильтровать несколько пакетов в сеансе, когда между наборами данных был большой разрыв и вы не можете вызвать каждый из них по отдельности.
Объединение диссекторов в цепочку выполняет аналогичную функцию (по крайней мере, с точки зрения фильтрации через ранее использованные диссекторы), предоставляя вам доступ к данным одного диссектора. Ключевым преимуществом здесь является то, что связанному диссектору не нужно заново проходить каждый пакет, что дает вам результат, не заставляя вас ждать повторного запуска исходного диссектора.
Препарирование в Lua
Учитывая, что Wireshark уже предлагает возможность создавать диссекторы на C (его естественном языке), вы можете не видеть необходимости создавать их и на Lua. Тем не менее, те, кому не нравится C, а также те, кто уже освоил Lua, могут обнаружить, что облегченные сценарии Lua облегчают создание диссекторов. Конечно, вам придется жертвовать более длительным временем загрузки при запуске процесса по сравнению с диссекторами на основе C, но в любом случае полезно иметь такую возможность.
С учетом сказанного, мы хотим услышать ваше мнение. Как часто вы используете диссекторы в Wireshark? Пробовали ли вы создавать их на C раньше, и какие преимущества, по вашему мнению, дает создание диссектора на Lua? Дайте нам знать в разделе комментариев ниже.