Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Tools (http://mangos.ytdb.ru/forumdisplay.php?f=22)
-   -   PKT v3.0 Viewer (http://mangos.ytdb.ru/showthread.php?t=4298)

Йоха 06.05.2011 12:30

PKT v3.0 View
 
Вложений: 3
Проект на гитхабе:
https://github.com/Johnson7/pkt30view

Скриншот:
http://мангос.рф/attachment.php?atta...1&d=1305882997

Возможности программы:

- Открывает .pkt файл формата 3.0, описание формата тут
- По умолчанию отображает пакеты в шестнадцатеричном представлении.
- Можно задавать имена для пакетов и имя функции на языке lua для парсинга пакета
- позволяет задавать имена опкодов и парсеры специфичные для конкретного билда wow.
Для этого необходимо создать в папке где находится екзешник - папку с номером билда wow от которого сделан сниф
Внутри папки создать 2 файла: opcodes.txt и parsers.lua

формат файла opcodes.txt :
Код:

опкод1, название_опкода1, имя_луа_функции1
опкод2, название_опкода2, имя_луа_функции2

в файле parsers.lua содержатся функции парсинга
Код:

function имя_луа_функции1()
end

function имя_луа_функции2()
end

при выделении строки в списке программы вызывается функция из загруженного lua файла соответсвующая опкоду, которая задается в файле opcodes.txt, если функция не задана, то соответственно ничего не вызывается.

В скрипте lua помимо стандартных доступны 2 библиотеки: packet и output

для packet доступны следующие функции:
Код:

length()                - возвращает длину данных пакета
decompress()                - распаковать compressed пакет

read8()                        - читает BYTE
read16()                - читает WORD
read32()                - читает DWORD
readfloat()                - читает float
readguid()                - читает GUID (8 байт)
readpackedguid()        - читает упакованый GUID
readstring([len])        - читает строку длиной len, если вызывать без параметра,
                        читает строку до завершающего 0 или конца пакета

для output :
Код:

print(string)
println(string)


Приглашаются все желающие для совместной разработки


В аттаче последня сборка

06.05.2011 13:43

нууууууу....через vine запустилось, тестовый файлик открыл.
но на lich.pkt, sindragosa.pkt - висяк, при повторном открытии крэш
брал сниф тут http://ru-mangos.ru/showpost.php?p=21601&postcount=6
http://ru-mangos.ru/showpost.php?p=21605&postcount=9

Йоха 06.05.2011 13:57

lich.pkt имеет неизвестный формат, я его не смог открыть и другим вьювером

У него в хидере версия пкт не так записана, не 00 30, а 30 00.

Мой вьювер не открывает файлы с неправильным заголовком, но при это ничего не зависает.
Поменял в хекс-редакторе версию - все отлично открывается

Насчет повторного открытия, да возможен краш, ресурсы не освобождаются перед открытием.

Вообще нет смысла сейчас писать баг-репорты, потому что как я написал, это даже не бета версия. Это инженерная альфа версия для тестового ознакомления. -)

06.05.2011 14:06

багрепорты в любой версии нужны =)

Lordronn 06.05.2011 15:52

Кстати, если есть баги которые поправить не имеется возможности, то лучше их написать в первой топике, дабы все видели.

Йоха 06.05.2011 16:17

да погодите вы с багами, сперва надо привести проект в порядок, а потом уже заниматься исправлением

06.05.2011 18:44

еще вопрос....
2011_4_20-17_20.pkt
пакет №90
optionalDataLength = 536870912, то есть 29 бит = 1, вно это же блин 512 Mb O.o явно ошибка сниффера или я что то путаю?

Йоха 06.05.2011 20:31

Цитата:

Сообщение от Minimajack (Сообщение 21889)
еще вопрос....
2011_4_20-17_20.pkt
пакет №90
optionalDataLength = 536870912, то есть 29 бит = 1, вно это же блин 512 Mb O.o явно ошибка сниффера или я что то путаю?

эм, это как получено optionalDataLength = 536870912 ?

в pkt файлах длина пакета и длина доп. данных хранится в типе данных int (32 бита) при чем там биты ? это же не разбор пакетов от сервера.

Этого не может быть в принципе, дело в том что я для доступа к данным файла использую файлмапинг, и смещение до следующего пакета считается как
Код:

ptr += (sizeof(PKT_CHUNK) + pChunk->dataLength + pChunk->optionalDataLength);
Если бы в поле optionalDataLength было такое число, то смещение уехало бы фиг знает куда и вызвало бы ошибку доступа к памяти

06.05.2011 20:54

2^29 = 536,870,912
доп. данных хранится в типе данных uint или разницы, число со знаком или без, нет? О.о

Йоха 06.05.2011 22:08

Вложений: 1
Ищи глюки у себя в вайне или еще хз в чем
Все там в норме, добавил еще одну колонку:
Код:

m_lv.InsertColumn(6, _T("OtionalDataLength"), LVCFMT_LEFT, 100);
и в обработчике уведомления LVN_GETDISPINFO:
Код:

case 6:
sprintf_s(column, "%d", chunk->optionalDataLength);


Lordronn 06.05.2011 22:11

Может лучше заменить 2 последние колонки на одну? Просто в поле Length писать размер data (без опкода).

Йоха 06.05.2011 22:33

Цитата:

Сообщение от Lordronn (Сообщение 21898)
Может лучше заменить 2 последние колонки на одну? Просто в поле Length писать размер data (без опкода).

OptionalData никакого отношения к данным пакета не имеет, в снифе Length равен длине данных + 4, независимо от направления, потому что по формату, длина опкода выравнена до 4 байт. Какой смысл к реальной длине данных из пакета прибавлять бог весть что ?

Добавлено через 13 минут
Цитата:

Сообщение от Minimajack (Сообщение 21894)
2^29 = 536,870,912
доп. данных хранится в типе данных uint или разницы, число со знаком или без, нет? О.о

пакет 89, судя по размеру, был "large", а следующий за ним 90. Возможно ты как-то криво обрабатываешь сниф, я не знаю что даже предположить. Расскажи как у тебя получилось такое число ?

Lordronn 06.05.2011 23:01

Цитата:

OptionalData никакого отношения к данным пакета не имеет, в снифе Length равен длине данных + 4, независимо от направления, потому что по формату, длина опкода выравняна до 4 байт. Какой смысл к реальной длине данных из пакета прибавлять бог весть что ?
Я думал что в поле "длина" идет длина даты + 4 байта на опкод.

Тогда какой смысл в последней колонке?

Йоха 06.05.2011 23:04

Цитата:

Сообщение от Lordronn (Сообщение 21901)
Я думал что в поле "длина" идет длина даты + 4 байта на опкод.

так и есть

Цитата:

Сообщение от Lordronn (Сообщение 21901)
Тогда какой смысл в последней колонке?

просто для проверки, почитай что пишет Minimajack

в OptionalData у меня пишется ип адрес:порт, в этом снифе типа:
195.12.246.210:3724
что равняется ровно 19 байтам (завершающий 0 для строки не пишется)
В чем не трудно убедиться посчитав количество символов вручную.

07.05.2011 01:06

Йоха звыняй...таки я накосячил :(

зы вот такие имба пакетики

Йоха 10.05.2011 12:58

Сделал нормальный проект для VS10, пересобрал библиотеку lua в виде статической библиотеки так же в VS10.
Обновил шапку, выложил исходник проекта, луа инклуды и либы, а так же wtl, если вдруг кто не знаю где ее взять.
Это все что нужно для сборки. В итоге получается самостоятельный экзешник без всяких добавочных длл.

Konctantin 10.05.2011 13:01

давай на гитхаб...

Йоха 10.05.2011 13:03

Есть где-нибудь в двух словах описалово как создать новый проект на гитхабе ?

Меня сегодня лень одолела...

Konctantin 10.05.2011 13:08

Зайди в аську...

посмотри инструкцию тут: http://ru-mangos.ru/showthread.php?t=891

Йоха 10.05.2011 13:30

аккаунт вроде создался, ключи тоже. Теперь надо создать репозитарий, но в этом мануале описана работа под линуксом... в котором я понимаю чуть меньше чем ничего.

Konctantin 10.05.2011 13:34

да без разницы, просто пути по другому указываются... тебе их можно не писать, а просто ПКМ -> Git Bash Here и все, а в остальном так же

Йоха 10.05.2011 15:12

ключи кое-как победил. создался пустой репозитарий, как туда добавить файлы то ?

у меня есть локальная папка pkt30view, как ее содержимое добавить на github ?

Добавлено через 1 час 22 минуты
блин, я наверно совсем тупой, но уже скоро конец дня, а я так и не догнал как добавить проект на сервер. :confused:
Туда добавился только readme, как остальное засунуть я хз

Konctantin 10.05.2011 15:31

Код:

git init
git remote add origin ssh://username@example.com/var/git/example.git
touch changelog
git add changelog
git commit -a -m "Initital commit"
git push origin master


Йоха 10.05.2011 15:37

в результате на сервере оказывается только 1 файл - changelog

я уже двадцать раз и так и сяк пробовал

о епрст, каким-то образом все почему-то добавилось ...
моя в недоумении ... единственное что изменилось, так это я пошел пообедал и все сразу заработало

TOM_RUS 10.05.2011 15:40

Цитата:

Сообщение от Йоха (Сообщение 22092)
в результате на сервере оказывается только 1 файл - changelog

я уже двадцать раз и так и сяк пробовал

Код:

git add .

Йоха 10.05.2011 15:49

Всем спасибо за помощь, подскажите на последок еще одну вещь, вот я что-то дописываю, как мне все изменения закинуть на сервер ?

TOM_RUS 10.05.2011 15:52

Цитата:

Сообщение от Йоха (Сообщение 22094)
Всем спасибо за помощь, подскажите на последок еще одну вещь, вот я что-то дописываю, как мне все изменения закинуть на сервер ?

Код:

git add .
git commit -m "bla bla bla"
git push origin master


Konctantin 10.05.2011 16:51

Или использовать Git GUI, там все визуально понятно...

Йоха 10.05.2011 16:57

Обновил шапку.
Добавил меню "Закрыть файл", исправлен краш при открытии файла если уже до этого был открыт другой файл.

10.05.2011 17:34

предлагаю каждую функцию вынести в отдельный файл. Удобнее же...

Йоха 10.05.2011 18:14

На мой взгляд более целесообразно хранить все функции в одном файле:
Какие мне видятся плюсы такого подхода:
- загружается модуль целиком при открытии снифа, можно инициализировать каки-нибудь переменные, выполнить некоторые стартовые процедуры общие для всего модуля. Собственно модуль луа живет пока открыт файл.
- загружается файл один раз, компилируется в памяти - меньше накладных расходов на дисковое ио, и на компиляцию скриптов.

А если кому-то нужна отдельная функция в отдельном файле - копипаст и за три секунды проблема решена.

alien 10.05.2011 19:36

Кстати есть еще неплохая библиотека для объединения lua с C++
luabind

Йоха 10.05.2011 19:45

я видел эту библиотеку в том числе, просто дело в том что штатные средства lua для встраивания настолько тривиальны что я думаю переписать вызовы без всяких сторонних библиотек/классов. Просто класс luawrapper я увидел одним из первых ну и что первое попалось под руку то и использовал

alien 10.05.2011 20:24

Только еще одно замечание. Дело в том что у тебя в луа вызывается не метод объекта а функция таблици.

Йоха 10.05.2011 21:10

ну да, я просто не знал как это правильно называется в луа

alien 10.05.2011 21:16

Нет я не про это. У луа есть и методы в полноценном понимании и функции таблицы.
То есть вызов packet.read8() это вызов функции из таблицы, а packet:read8() вызов метода.

У меня например было так.
Код:

PacketParser::PacketParser(const Packet* aPkt)
{
    pkt=aPkt;
    L = lua_open();
    luaL_openlibs(L);
    luabind::open(L);
    module(L)
    [
        class_<PacketParser>("CPacket")
        .def("Opcode", &PacketParser::GetOpcode)
        .def("OpcodeName", &PacketParser::GetOpcodeName)
        .def("ReadInt32", &PacketParser::ReadInt32)
        .def("ReadUInt32", &PacketParser::ReadInt32)
        .def("ReadInt64", &PacketParser::ReadInt64)
        .def("ReadUInt64", &PacketParser::ReadInt64)
        .def("ReadString", &PacketParser::ReadString)
        .def("ReadByte", &PacketParser::ReadByte)
        .def("ReadBytes", &PacketParser::ReadBytes)
        .def("DeCompress", &PacketParser::DeCompress)
        .def("HexPrint", &PacketParser::HexPrint)

    ];
    globals(L)["Packet"] = this;

А в луа использовал вот так соответственно.
Код:

local addon_count=Packet:ReadInt32();

Йоха 11.05.2011 08:27

Цитата:

Сообщение от alien (Сообщение 22131)
Код:

PacketParser::PacketParser(const Packet* aPkt)
{
    pkt=aPkt;
    L = lua_open();
    luaL_openlibs(L);
    luabind::open(L);
    module(L)
    [
        class_<PacketParser>("CPacket")
        .def("Opcode", &PacketParser::GetOpcode)
        .def("OpcodeName", &PacketParser::GetOpcodeName)
        .def("ReadInt32", &PacketParser::ReadInt32)
        .def("ReadUInt32", &PacketParser::ReadInt32)
        .def("ReadInt64", &PacketParser::ReadInt64)
        .def("ReadUInt64", &PacketParser::ReadInt64)
        .def("ReadString", &PacketParser::ReadString)
        .def("ReadByte", &PacketParser::ReadByte)
        .def("ReadBytes", &PacketParser::ReadBytes)
        .def("DeCompress", &PacketParser::DeCompress)
        .def("HexPrint", &PacketParser::HexPrint)

    ];
    globals(L)["Packet"] = this;


странный синтаксис, это С# ?

Fedia22 11.05.2011 08:43


Йоха 11.05.2011 08:47

нет, это не делфи 100%

alien 11.05.2011 10:43

Нет как нестранно это C++ с использованием luabind.
Ну или если уж совсем точно то c++, Qt, boost, luabind )
Правда от Qt в данном коде нечего нету )


Текущее время: 08:05. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS