|
Опкоды, Формулы, Клиент Разбор и изучение взаимодействия клиента с сервером |
|
Опции темы | Поиск в этой теме | Опции просмотра |
20.07.2010, 18:34 | #1 |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
Централизованый формат снифов
Редакция от 31 июля 2011, 13:13, версия 3.1
Редакция от 25 июля 2010, 21:00, версия 3.0
Предложения SnifferID: Код:
0 - Wad // 2005 и ранее 1 - Nomad // 2005 и ранее 2 - WoWCore // 2006 3 - Mangos (TOM_RUS) // 2006 4 - User456 // 2007 5 - Delfin // 2007 6 - Burlex // 2007 7 - WCell // 2008 8 - Kobold // 2009 9 - abdula123 // 2010 10 - Konctantin/LordJZ // 2010 11 - Йоха // 2010 Последний раз редактировалось RomanRom2; 07.08.2011 в 21:24. |
21.04.2011, 22:11 | #121 |
MaNGOS Dev
Регистрация: 11.03.2010
Сообщений: 468
Сказал(а) спасибо: 0
Поблагодарили 514 раз(а) в 163 сообщениях
|
Я только сегодня добавил поддержку PKT 3.0 в свой WoWPacketViewer
|
21.04.2011, 22:31 | #123 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
на wowcore.ru
|
21.04.2011, 23:09 | #124 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
не, ну если так сходу нет, то сам напишу лень просто...
я все свои снифы от классика сейчас перевел (почти) в PKT 2.1, да у меня в те времена было много разных форматов. вот думаю разом их в 3.0 конвертнуть и работать уже с ними. вот в бекграунде и пописываю... кстати, собираю снифы в данный момент от классика. ни у кого не завалялось? |
22.04.2011, 07:36 | #125 |
Ученый
Регистрация: 19.12.2010
Сообщений: 221
Сказал(а) спасибо: 64
Поблагодарили 12 раз(а) в 9 сообщениях
Записей в дневнике: 2
|
Да я какбэ просто хочет к себе в парсер добавить поддержку этого формата, авось попадется
PS: Кому не жалко покажите структуру optionalData хидера и чанка, хочется в свой парсер добавить поддержку как можно большего количества форматов |
22.04.2011, 08:52 | #126 | |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
Цитата:
Код:
195.12.246.213:3724 |
|
22.04.2011, 18:21 | #127 |
Ученый
Регистрация: 19.12.2010
Сообщений: 221
Сказал(а) спасибо: 64
Поблагодарили 12 раз(а) в 9 сообщениях
Записей в дневнике: 2
|
Спасибо Просто я у себя в хидере пишу описание, и количество пакетов в снифе. Естественно парсер использует эти данные. А то вдруг чей-нить сниф подвернется, и читатся не будет
|
22.04.2011, 18:49 | #128 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
очень плохо. эти поля были сделаны не для хранения данных и последующего парсинга, а для как поля "для заметок". это не по феншую.
|
24.04.2011, 08:10 | #129 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
Не у кого не завалялось сниффа версии 2.1 и ранее. Хочу проверить как парсер будет их кушать
|
24.04.2011, 12:13 | #130 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
Код:
http://wowcore.ru/downloads/HUMAN_priest[3.3.5]_PKT_v2.1.rar Последний раз редактировалось RomanRom2; 24.04.2011 в 12:15. |
24.04.2011, 13:48 | #131 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
хедер:
ushort build byte[40] sessionKey чанк: byte direction uint unixTime uint tickCount uint size uint opcode (direction == Direction.Client) ? uint : ushort; byte[] data (size - (direction == Direction.Client) ? 4 : 2; Последний раз редактировалось Lordronn; 24.04.2011 в 15:01. |
24.04.2011, 16:22 | #132 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
|
24.04.2011, 19:30 | #133 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
а конвертните мне примерчик плиз, что я выложил, что б было с чем сравнивать?
|
24.04.2011, 20:10 | #134 | |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Цитата:
|
|
24.04.2011, 20:24 | #135 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
все правильно сделал (с)
спасибо я свой конвертор дописываю. когда есть пример - оно проще мне. я вообще люблю, знаете ли, по примерам обучаться. |
06.05.2011, 14:18 | #136 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
Вот и возник косячок, как я понял снифер или конвертер от LordJZ в поле версия пишет байты в другом порядке: 03 00
А в описании формата вроде как написано что надо писать 00 03. Мой вьювер проверяет заголовок снифа и если что-то не совпадает, то файл не обрабатывается. В частности проверяется сигнатура и версия. |
06.05.2011, 14:27 | #137 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
сначала должен быть записан младший байт, потом старший. в "3.0" 3 это старший, 0 - младший. при чтении word или (ushort или как там в си?) дожно быть число $0300 (0x0300).
|
06.05.2011, 14:28 | #138 | |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Цитата:
|
|
06.05.2011, 14:29 | #139 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
|
06.05.2011, 14:34 | #140 | ||
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
Цитата:
Цитата:
|
||
06.05.2011, 14:41 | #141 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
в теме все правильно написано. сначала младший, потом старший байты. соответственно 00, затем 03.
|
06.05.2011, 14:42 | #142 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
ну так а почему в файле lich.pkt порядок байт другой
Код:
0000000000: 50 4B 54 03 00 0D 37 35 │ 00 00 72 75 52 55 00 00 PKT♥ ♪75 ruRU Тогда претензии к автору этого снифа http://ru-mangos.ru/showpost.php?p=21601&postcount=6 Вроде это Lordronn выкладывал, исправляй свой снифер или конвертер. Последний раз редактировалось Йоха; 06.05.2011 в 14:49. |
06.05.2011, 14:57 | #143 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
не знаю почему Lordronn запутался в двух байтах в спецификации четко написано каков должен быть порядок байт.
|
06.05.2011, 15:49 | #144 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
Эм, я вообще не LordJZ-им конвертором конвертил. Я конвертировал с помощью IZI2PKT, только он у меня изменен.
С байтами не я запутался, а автор тулзы, а я проглядел) |
12.05.2011, 02:32 | #145 | |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
Цитата:
http://filebeam.com/dae73f8446073dada011b4120249b374 в приведенном выше LordJZ сниффе к каждому чанку добавлена optData длиной в два байта и содержащая два нуля. можно поинтересоваться зачем? |
|
12.05.2011, 11:43 | #146 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Это «мои» данные, забыл поставить проверку на их запись при неправильном SnifferId. А данных в исходном дампе не было, поэтому писал нули. Поправлю у себя.
|
19.05.2011, 12:41 | #147 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
прошу любить и жаловать, версия 3.1 - поддержка нескольких соединений в одном файле.
Редакция от 19 мая 2011, 14:00
Список ревьюверов тот же: - Konctantin: - LordJZ: accepted - TOM_RUS: - RomanRom2: accepted - VDm: - Deamon: - Nomad: - abdula123: - user456: - Aven: - йоха: ревью до 19 июня 2011г. Последний раз редактировалось RomanRom2; 31.07.2011 в 12:11. |
Пользователь сказал cпасибо: | HuntsMan (19.05.2011) |
19.05.2011, 13:39 | #148 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
я бы поле uint unixTime; перенес из хидера чанка в мейн хидер. Начальное время берется из хидера, а потом есть тиккаунт
И еще предлагаю opcode вынести из data в чанк хидер, а в data хранить чистые данные пакета Последний раз редактировалось Йоха; 19.05.2011 в 13:41. |
19.05.2011, 13:48 | #149 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
1.Я бы использовал 1 байт для connectionId, ибо ну не верю я, что будет более 255 соеденений, с которых можно будет получить интересное нам
2.tickCount - не понимаю зачем он вообще. 3. Я бы изменил порядок на такой: Код:
uint optionalDataLength; uint dataLength; byte[dataLength] data; uint optionalDataLength; byte[optionalDataLength] optionalData; |
19.05.2011, 15:59 | #150 | ||||
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Цитата:
Цитата:
Цитата:
Цитата:
|
||||
19.05.2011, 17:22 | #151 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
возможно вы правы, время для чанка может и не нужно, сейчас вспоминаю, когда и зачем оно было нужно... и не припоминаю. тем более в прошлый раз мы это тоже обсуждали. время чанка вычисляется одним сложением времени снифа и тиккаунта чанка. тиккаунт чанка - очень нужный параметр. можно сказать фундаментальная основа снифа. есть такие, кто этого не понимает?
порядок я думаю менять не нужно, порядок правильный сейчас. предлагаемый выше - неправильный. против вынесения опкода из данных. опкод - это часть данных, это заголовок пакета. хидер чанка - это протольные поля, никакого отношения к данным не имеющие. не нужно их мешать, как например tcp с эзернетом. делать их 2 или 4 байта - без разницы, т.к. либо тот либо тот все равно придется выравнивать до выбранной размерности. на прошлом ревью если помните выбрали 4 потому что это компиляторы выравнивают поля до 4 байт (если не принять мер специально) и вроде как легче процессору. фигня конечно все это , но выбрали уж. 1 байт для идентификатора соединения я думаю мало. смотря как делать... если для каждого нового соединения просто инкрементировать это значение, то возможно в большинстве случаев этого будет достаточно. но это такое скользкое ограничение, что потенциально возможны случаи, когда инкремент достигнет 255 и пойдет далее. например когда снифер долго запущен и плеер-задрот играет все выходные безвылазно. ну может же быть такое? поэтому что бы ну совсем исключить даже потенциальные проблемы был предложен int, что бы даже не думалось нахрен об этом в связи с вышесказанным есть предложение заменить unixDateTime на ConnectionID. вот и все изменения для 3.1 (добавлено) это, кстати, получится совсем универсально. формат почти не изменяется, "старый" софт по прежнему будет нормально работать со снифами. и если софт не использует ни время ни мультиконнекшн - ему тогда вообще без разницы. а "новый" софт, например такой как вьювер - использует ConnectionID для отображения нескольких соединений параллельно (йоха, томрус, подумайте над интерфесом. есть идеи.). ну и конечно же ConnectionID очень важен для моего PKT Player Последний раз редактировалось RomanRom2; 19.05.2011 в 17:44. |
19.05.2011, 18:07 | #152 | ||
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
Цитата:
меня бесит вот такое уродство в коде: Код:
int opcode = *(int *)(m_Index[nIndex] + sizeof(PKT_CHUNK) + chunk->optionalDataLength); Код:
int opcode = chunk->opcode Цитата:
у меня это структуры объявлены так: Код:
#pragma pack(push, 1) struct PKT_HEADER { BYTE signature[3]; // 'PKT' BYTE version[2]; // 0x00, 0x03 BYTE snifferID; DWORD build; BYTE language[4]; // Язык клиента: 'ruRU', 'enGB' и т.д. BYTE sessionKey[40]; // может быть заполнено нулями DWORD optionalHeaderLength; }; struct PKT_CHUNK { union { BYTE b[4]; // 'SMSG', 'CMSG' DWORD d; } direction; DWORD unixTime; DWORD tickCount; DWORD optionalDataLength; DWORD dataLength; }; #pragma pack(pop) Последний раз редактировалось Йоха; 19.05.2011 в 18:12. |
||
19.05.2011, 18:11 | #153 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
Ну в разных языках\способах все выглядит по разному. У меня это вот так
Код:
byte[] optionalData = reader.ReadBytes(optionalDataLength); byte[] data = reader.ReadBytes(dataLength); using (BinaryReader binReader = new BinaryReader(new MemoryStream(data))) { uint opcode = binReader.ReadUInt32(); byte[] byteData = binReader.ReadBytes((int) (binReader.BaseStream.Length - 4)); packets.Add(new Packet(direction, (Opcode) opcode, byteData, unixTime, tickCount)); } |
19.05.2011, 18:30 | #154 |
Ученый
Регистрация: 19.12.2010
Сообщений: 221
Сказал(а) спасибо: 64
Поблагодарили 12 раз(а) в 9 сообщениях
Записей в дневнике: 2
|
Думаю для pkt все же удобнее было бы вынести опкод в отдельное поле, т.к. мы рассматриваем WoW Packet, а не TCP Packet. В остальном полностью согласен.
|
19.05.2011, 18:45 | #155 | ||
Ученый
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
|
Цитата:
|
||
19.05.2011, 19:37 | #156 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
|
19.05.2011, 19:47 | #157 |
Ученый
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
|
Есть но не все поддерживают прагму)
|
19.05.2011, 20:16 | #158 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
при чем тут прагма ? речь идет о возможности как таковой, а не о том какие компиляторы как эту возможность реализуют
Я привел пример с прагмой потому что пишу на VC++, остальные могут почитать документацию к своему комплятору |
19.05.2011, 20:21 | #159 | |||
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Цитата:
Цитата:
Добавлено через 2 минуты Цитата:
Код:
int getOpcode() { return *(int *)(m_Index[nIndex] + sizeof(PKT_CHUNK) + this->optionalDataLength); } Код:
int opcode = chunk->getOpcode(); Прошу прощения, не стерпел, сделал обработчик PKT 3.1, заодно переделал у себя алгоритм чтения. PKT 3.1 превью номер 0, версия 19 мая, присутствуют Connection Id, Unix и Ticks в основном заголовке (файл был действительно создан 14 апреля), Opt Data во всех заголовках: http://dl.dropbox.com/u/9241118/PKT_3.1_Preview_0.pkt (файл «искусственный», т.е. конвертированный из PKT 3.0 в PKT 3.1) Последний раз редактировалось LordJZ; 19.05.2011 в 22:55. |
|||
13.07.2011, 10:30 | #160 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Со времен 19 июня 2011 прошло уже почти 3 недели. Отзывов что-то не сильно видно. :/
|