[разработка]Wow Packet Parser
Вложений: 1
Вот решил заняться разработкой утилитки для парсинга снифов.
Видел что существуют такие и даже какое то время пользовался WoWPacketViewer(я его тут выкладывал недавно) Но все что я видел оно довольно неудобно. И вот взялся за написание. Пока проект в стадии активного написания. Во вложение набросок интерфейса(там где список пакетов планируется таблица в которой будет номер пакета, а также разный цвет фона в зависимости от направления) Основная фишка парсера в том чтобы добавить поддержку разбора нового пакета не нужно перекомпилировать полностью приложение. Разбор осуществляет Скрипт на Lua Вот пример скрипта разбора CMSG_AUTH_SESSION Код:
ClientBuild=Packet:ReadInt32() В общем проект лично для меня носит обучающий характер. В написании используется Qt+luabind Если есть желающие присоединится милости прошу(скорее всего как только будет что не стыдно показать в качестве сорцов проект будет опенсорс) |
насколько я понял речь идет именно о pktViewer? парсер обычно парсит инфу и куда то ее складывает.
да, давно пора. я тоже хотел сделать код, который бы не нужно было перекомпилять, что бы добавить новый опкод. какой нибудь описатель делать и подкладывать его в каталог. не придумал как сделать такое: Код:
pkt.AddLong(itAttributesCount); Код:
SpellCastTimes.ini |
Да наверно парсер неправильное слово в данном контексте )
Но WoWPacketViewer уже есть ) можно конечно назвать что-то типа wpView )) Ладно название программы не самое важное. А насчет скриптов. Да было бы хорошо обойтись без скриптов. Но тут скорее всего не получится(вовсяком случае простым способом, придется жестко извращаться) |
название не самое главное, да. но... как корабль назовешь, так он и поплывет :)
мой так называется - zPktViewer. буковка z - ну так уж вышло, сортировка что бы в конец списка выводила :) |
Не знаю как в делфи, но в С# есть такая штука как CodeDomProvider
то есть получается на лету можно вставлять программный код и сразу его выполнять. ЗЫ. Можно хранить отдельные парсеры для разных опкодов, а когда нужно, просто загружать. как при старте программы, так и при работе. или же есть CSharpCodeProvider, то же самое, только более специфическое. |
это фишка исключительно C#, в дельфи такого нет, к сожалению.
в дельфи либо внешние скриптовые движки либо думать, как сделать инишник. засада там только одна - счетчики данных. ну или плагины можно сделать. каждый опкод будет отдельным плагином. и грузите их. не знаю только, можно ли сделать так, что бы плагины можно было писать на разных языках, что бы они потом работали на дельфевом приложении. |
Цитата:
Только зачем тогда проще подключить внешний скриптовый двиг который все и будет делать. Цитата:
Скрипт выполняется когда выбираешь пакет в списке. |
а что данные содержашиеся в пакетах настолько нетривиальны что требуют обработки скриптом ? Недостаточно задать описание структуры данных, и обрабатывать их в движке, а не писать скрипт для каждого опкода
|
они тривиальны до тех пор, пока нет счетчиков
field_count; { field_count_val1, field_count_val2, ... field_count_val(count) } как описать это? |
Цитата:
|
получается так или иначе городить какой то "умный" парсер. формат на самом деле значения не имеет, что xml, что какой то свой формат...
|
Да и вот еще не только счетчики могут быть.
От значения определенного поля размер и формат пакета тоже может меняться. |
С помощью структуры можно разбирать только примитивные пакеты с прямолинейной структурой, без сложных зависимостей, а так надо прибегать к скриптам.
Или же разделить как-то, простые пакеты обрабатывать по структуре, а сложные скриптом. |
Тема еще актуальна?
|
Вот держите, Наш вариант lua парсера :)
Код:
--[[ описание комманды CMSG_CHAR_ENUM и обслуживающая функция ]]-- |
а у нас есть 2 вида парсеров ХМЛ структуры и хард код, править структуры (ХМЛ парсер) можно не закрывая сам парсер, есть возможность перегрузки структур.
|
да тема актуально. Просто я щас в таком месте где компа под рукой нету. как приеду буду дописывать.
Зы у меня тоже скрипты луашные тоже без перезапуска программы обновляются |
Цитата:
|
а это кому как удобней...
|
в общем повтыкал я в этот JSON...
все отлично, все замечательно просто, ровно до того места, когда нужно сделать зависимость от байта (или того интересней - от флага). или счетчики структур. короче не подходит. надо скриптовые движки использовать. ну или что то свое городить... |
Я обработчики пишу на шарпе без привлечения сторонних движков, и не жалуюсь :)
|
Цитата:
А со скриптами гораздо проще, поправил текстовый файлик и вперед |
Цитата:
|
эм... не совсем понятно
объясни что имеется в виду |
Структура пакетов хранится в XML файле. При запуске программы файлы десериализуются. При выборе пакета создается ридер пакета, который читается по структуре из XML файла, которую мы уже занесли в List\Dictionary. реализовать можно довольно много:
switch case format (X4, X16...) compare Можно также указывать название enum - а При необходимости легко можно сменить структуру без перезагрузки всего вайвера.
|
да епрст, ну об этом же и говорится, что формат пакетов задается внешними файлами.
там просто HuntsMan написал что у него обработчики захардкодены, вот это и неудобно |
Я сейчас с этим мучаюсь. Написал около 100 обработчиков в коде. Теперь мучаюсь с их переносом в XML-ки
|
А у меня для обработки пакетов используется вот такой интерфейс:
|
Цитата:
|
Это да, это можно только через код. Но речь идет о мелких пакетах типа CMSG_QUEST_QUERY и о пакетах из который не получить информации для базы. У меня для пакетов(респонзы, вендор лист, и т.п) сделан специальный оутпут в скул. Достаточно нажать на одну кнопочку в меню и выбрать директорию. Для UPDATE_OBJECT у меня плагин написан
|
Поигрался седня ночью с сериализацией/десериализацией, очень удобная штука :)
http://paste2.org/p/1375139 Допустим есть пакет: Код:
0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00 Код:
uint32 Код:
<Definition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Opcode="CMSG_TEST_ACTION"> Код:
uint32 Код:
<Definition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Opcode="CMSG_TEST_ACTION"> Код:
for(uint32) Код:
<Definition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Opcode="CMSG_TEST_ACTION"> Код:
for(1) Код:
<Definition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Opcode="CMSG_TEST_ACTION"> Код:
if(uint32 == 1) Код:
<Definition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Opcode="CMSG_TEST_ACTION"> |
Цитата:
Опять же большую часть пакетов я стараюсь парсить и в sql. Например: Код:
INSERT INTO `playercreateinfo_spell` (`race`,`class`,`Spell`,`Note`) VALUES ('@RACE', '@CLASS', '674', 'Бой двумя оружиями (674)'); |
Цитата:
|
Цитата:
|
Ну если уж на то пошло, то проще тогда выполнять динамическую компиляцию, и писать все на С#, но не lua.
|
Я думаю что если пишешь на шарпе то лучше не паримся и юзаем XML
Если на C/C++ то тогде уже лучше lua прикрутить. |
Я в своем WoWPacketViewer прикрутил динамическую компиляцию парсеров для эксперимента (файл parsers\SMSG_TUTORIAL_FLAGS.cs компилится при выполнении программы).
|
Вложений: 1
Я не совсем понял есть ли в природе опенсоурс проект "просмотрщик пакетов" который поддерживается и развивается ? Или ситуация такая же как со сниферами - каждый делает себе свой ?
[добавлено] Цитата:
|
Ну PacketViewer от TOM_RUS открытый.
|
но он не актуальный на данный момент ? я там глянул на опкоды, они все старые
|
Текущее время: 18:43. Часовой пояс GMT +3. |
ru-mangos.ru - Русское сообщество MaNGOS