|
Копаем клиент Копаем клиент |
|
Опции темы | Поиск в этой теме | Опции просмотра |
10.05.2011, 18:39 | #1 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
Как из данных получить опкод?
Написал прокси сервер для вов. Все работает, но нужно сделать запись в файл. Напоролся на проблему при определении опкода. Я думал что опкод - первый 4 байта в данных, которые мы передаем, но это не так - получаю чистый бред(имеется снифф в 4.1.0 для проверки). Как из данных получить опкод???
|
10.05.2011, 19:00 | #2 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
Размер опкода равен 2 байтам если пакет от сервера клиенту, и 4 байта если от клиента серверу.
Более того, первым идет 2 байта длина пакета (возможно 3 байта если 8 бит установлен в 1) Последний раз редактировалось Йоха; 10.05.2011 в 19:02. |
10.05.2011, 19:13 | #3 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
в альфе вот например опкод в обе стороны int32 был.
йоха не сказал самого главного - длина пакета и опкод - это заголовок пакета. заголовки шифруются сессионым ключем. без дешифрации и будет "бред". а зачем тебе опкод во время снифинга? пиши весь трафик без разбора (формат RAW) и выдирай ключ. мы потом этот raw расшифруем в pkt. |
10.05.2011, 19:21 | #4 | |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
Цитата:
Я у себя в raw снифере вставлял дополнительно в выходной файл пустые пакеты, по которым конвертер в пкт определял что соединение закрыто. А если такого не делать, то конвертер не узнает когда нужно закрывать контекст и когда создавать новый |
|
10.05.2011, 19:45 | #5 | |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
Я верно понимаю:
в dataLength пишем длинну данных, которые проходят через прокси, а в byte[dataLength] data - сами данные. Без каких либо манипуляций с ними. Цитата:
|
|
10.05.2011, 19:48 | #6 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
тут есть практически все по этому поводу : http://мангос.рф/showthread.php?t=419
|
10.05.2011, 21:42 | #7 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
во многом поэтому я разные сессии пишу в отдельные файлы. и не поверите - никаких проблем
(добавлено) и еще, кажется, это легко отслеживается по опкодам типа SMSG_CONNECT_TO = $050D; CMSG_CONNECT_TO_FAILED = $050E; SMSG_SUSPEND_COMMS = $050F; CMSG_SUSPEND_COMMS_ACK = $0510; SMSG_RESUME_COMMS = $0511; CMSG_AUTH_CONTINUED_SESSION = $0512; CMSG_DROP_NEW_CONNECTION = $0513; не знаю как они в мангосе называются (вроде не так). верно. точно так же как и в сервере. обсолютно. Последний раз редактировалось RomanRom2; 10.05.2011 в 21:50. |
Пользователь сказал cпасибо: | Lordronn (10.05.2011) |
10.05.2011, 22:47 | #8 | |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Цитата:
|
|
10.05.2011, 23:46 | #9 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
У меня верный сессион адрес или нет? А то читаю и получаю одни нули
Код:
0x00D03F14 |
11.05.2011, 08:24 | #10 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
какая ОС ?
|
11.05.2011, 09:10 | #11 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
Винда СП3. Я передвигаюсь к этому адресу и читаю 40 байт и получаю нули. Возможно надо еще что-то?
ПС: ключ сессии есть всегда в памяти или он генерируется лишь при приходе опр. пакета??? |
11.05.2011, 09:19 | #12 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
какая ошибка при этом ?
дебаг привелегию установил ? я читаю ключ из памяти как только приходит 3 пакет. К этому времени клиент уже должен быть готов расшифровывать заголовки, соответсвенно криптосистема инициализирована и готова к использованию. Последний раз редактировалось Йоха; 11.05.2011 в 09:25. |
11.05.2011, 09:47 | #13 | |||
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
Цитата:
Цитата:
Цитата:
|
|||
11.05.2011, 09:48 | #14 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
|
11.05.2011, 10:01 | #16 | |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
Я использую портированую функцию для C#. Почерпнул отсюда
Получилось прочитать!!!! Я читаю 40 байт с адреса Код:
0x00D03F14 |
|
11.05.2011, 11:02 | #17 | |
MaNGOS Dev
Регистрация: 11.03.2010
Сообщений: 468
Сказал(а) спасибо: 0
Поблагодарили 514 раз(а) в 163 сообщениях
|
Цитата:
|
|
Пользователь сказал cпасибо: | Lordronn (11.05.2011) |
18.05.2011, 15:49 | #18 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
Ну вот побегал чуток для теста. Вот рав, расшифруйте пожалуйста.
|
18.05.2011, 17:40 | #19 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
жаль что в снифе несколько сессий подряд. без знаний значений опкодов расшифровать будет невозможно.
|
18.05.2011, 20:34 | #20 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
если я все правильно понимаю, каждая сессия заканчивается опкодом 0x404D направление: клиент-сервер (для билда 14007)
ну а открывается соответственно опкодом 0x4F57 направление сервер-клиент, хотя это не опкод, а первые два байта фразы "WORLD OF WARCRAFT CONNECTION - " ... Последний раз редактировалось Йоха; 18.05.2011 в 20:51. |
18.05.2011, 23:55 | #21 | |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Цитата:
|
|
19.05.2011, 02:37 | #22 | |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
Цитата:
это всё build depended. нужно что бы так не было. не знаю, класть какой нибудь опкод FFFF к примеру, или нули. ну какой то маркер надо, если вам так принципиально все сессии класть в один файл. |
|
19.05.2011, 08:33 | #23 | ||
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
Цитата:
Добавлено через 2 минуты Цитата:
Вполне себе универсальное решение -) Последний раз редактировалось Йоха; 19.05.2011 в 08:35. |
||
19.05.2011, 11:08 | #24 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
я тут сконвертировал снифы классика из пкт2 в пкт3, вместо 12 гигов получилось 15. представляю, сколько твои снифы будут занимать места, если в оптДата КАЖДОГО чанка класть строку iport (12.34.56.78:1234 - по меньшей мере 16 байт. а там еще и socket handle какой то...). жесть это как минимум расточительство, как максимум - это неправильно, не по феншую. вы неправильно используете преднозначение поля оптДата.
пустой чанк - вот это правильно. но теперь нужно выяснить, что такое "пустой чанк". маркированный каким то образом, я так понимаю. я все же настаиваю на использовании какого нибудь специализированного опкода, например "минус еденица" (FFFF т.е.), т.к. "ноль" по идее уже "занят" - NULL_ACTION. физический смысл оптДата - это "пометки на полях". каждый разработчик использует их на свое усмотрение. именно поэтому это поле уже не может быть использовано в прототипе. prototype - своего рода metadata, описание полей/методов/свойств объекта, использующихся в протоколе. в нашем протоколе PKT 3.0 поле optData не может использоваться для работы этого самого протокола. |
19.05.2011, 11:33 | #26 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
зачем? формат менять уже нельзя.
можно еще к опкоду FFFF использовать длину чанка FFFF, означающую буквально следующее: "прочитано -1 байт из сокета", что почти соответствует действительности, когда сессия заканчивается |
19.05.2011, 11:40 | #27 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
В таком случае я не понимаю о чем спор. Если в raw пишутся данные с нескольких соединений, то я не вижу способов расшифровать такой дамп без порядковых номеров соединений (1,2,3,4,...) для каждого пакета, даже если знать границы соединений. Ведь состояния ARC4 у всех соединений разные. Номер соединения в данный момент можно хранить только в optData, поэтому универсального конвертера из raw в не-raw формат существовать не может. Я заблуждаюсь?
|
19.05.2011, 11:50 | #28 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
блин, там же несколько соединений ОДНОВРЕМЕННО ...
надо думать... сорри, у меня просто свежи воспоминания 3.3.5, когда соединения были последовательными. |
19.05.2011, 11:54 | #29 | |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
Цитата:
Я использую строку. По поводу строки в optional data. Во первых формат не накладывает ограничений на содержимое этого поля, и хранение там строки абсолютно легально. К тому же никто не мешает после конвертации в pkt убрать вообще эти данные, тем самым уменьшить размер получаемого файла. Да и вообще по большому счету не вижу смысла делать сниф в рав формат. Если уж руки и мозг позволяют написать снифер до состояние raw, то там недолго прикрутить и расшифровку и получается уже полноценный снифер в pkt -))) Функция расшифровки есть в тиавпс, или тут можно спросить. Останется только написать алгоритм сборки расшифрованных пакетов из потока. А это уже чисто алгоритмическая задачка. Последний раз редактировалось Йоха; 19.05.2011 в 12:04. |
|
19.05.2011, 12:04 | #30 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
все верно, формат не накладывает ограничений.
легковые автомобили, например, тоже можно использовать для перевозки цемента или трупов. но это как то неправильно чтоли в общем да, судя по всему придется вводить еще одно поле для чанка - сквозной номер для идентификации соединения. это может быть что угодно, хоть секвенс, хоть автоинкремент, хоть номер сокета, кому как нравится. он же потом потребуется еще и в pkt, не забывайте. хотя с другой стороны, оптДата для raw по сути не имеет смысла... это для pkt имеет смысл что то там записывать. в данном случае для raw можно использовать и оптДата. но во мне какие то внутренние противоречия по этому варианту важно только, что бы это было стандартизировано. Последний раз редактировалось RomanRom2; 19.05.2011 в 12:06. |
26.05.2011, 18:19 | #32 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
Вот сделал под формат 3.1. Попробуйте пожалуйста.
|
26.05.2011, 21:06 | #33 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Формат 3.1 еще не принят, я думаю не стоит выкладывать дампы в 3.1 до его принятия за пределами этой темы: http://ru-mangos.ru/showthread.php?t=1852
P.S. У меня не открывается |
26.05.2011, 21:28 | #34 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
Это рав снифф, я в сниффере формат файла перепутал(изначально хотел расшифрованный трафик писать, но решил отложить это, а изменить расширение забыл)
|
26.05.2011, 22:33 | #35 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
|
26.05.2011, 22:52 | #36 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
хм, пишу верно
Код:
_writer.Write(packet.Direction == Direction.ToServer ? 'C' : 'S'); _writer.Write("MSG".ToCharArray()); _writer.Write(ConnectionId); _writer.Write(packet.TickCount); _writer.Write(1); _writer.Write(packet.Data.Length); _writer.Write((byte) 1); _writer.Write(packet.Data); |
26.05.2011, 23:36 | #37 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
Поправил одну ошибочку в структуре + поправил запись коннект Ида
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
редактируем базы данных - Dbscript | dj--alex | Tools | 14 | 03.04.2017 10:17 |
опкод при сходе с транспорта | brainreaver | Опкоды | 3 | 04.03.2011 18:40 |
Получение данных Карта->Зона | Hantet | WWW | 9 | 11.09.2010 22:21 |
Подскажите опкод | Йоха | Опкоды | 11 | 20.07.2010 23:29 |
каким образом можно получить более 60 000 хитов в форме медведя? | tempura | Флудильня | 25 | 04.07.2010 15:11 |