|
Опкоды, Формулы, Клиент Разбор и изучение взаимодействия клиента с сервером |
|
Опции темы | Поиск в этой теме | Опции просмотра |
23.03.2010, 08:53 | #1 |
Пользователь
Регистрация: 07.03.2010
Сообщений: 79
Сказал(а) спасибо: 3
Поблагодарили 10 раз(а) в 8 сообщениях
|
Сниффер
Кто знает сниффер под 3.3.2. Поискал по интернету, что-то не густо.
|
23.03.2010, 10:43 | #2 |
WowCore Dev
Регистрация: 11.03.2010
Сообщений: 112
Сказал(а) спасибо: 10
Поблагодарили 51 раз(а) в 25 сообщениях
|
А их никогда и не будет густо. Так уж сложилось традициями, что все сниферы под ВоВ всегда держатся в привате.
А после того, как близы перешли на RC4, снифить траффик можно только собрав session_key откуда либо. Прокси сейчас не работают из-за BN2 протокола, остались только инъекторы. |
23.03.2010, 10:47 | #3 |
MaNGOS Dev
Регистрация: 08.03.2010
Адрес: Ханты-Мансийск
Сообщений: 28
Сказал(а) спасибо: 27
Поблагодарили 13 раз(а) в 8 сообщениях
|
|
23.03.2010, 11:00 | #4 | |
WowCore Dev
Регистрация: 11.03.2010
Сообщений: 112
Сказал(а) спасибо: 10
Поблагодарили 51 раз(а) в 25 сообщениях
|
Цитата:
|
|
29.03.2010, 16:56 | #5 |
Пользователь
Регистрация: 22.03.2010
Сообщений: 41
Сказал(а) спасибо: 7
Поблагодарили 25 раз(а) в 15 сообщениях
|
прокси как работали, так и работают. просто приходится зарыться немного поглубже.
а вот юзать pcap - это хуже не придумаешь. слишком много проблем с пересброкой потока из пакетов. да и про то, чтобы вставлять свои пакеты в поток - можно забыть. |
29.03.2010, 17:11 | #6 | |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
Цитата:
Последний раз редактировалось tempura; 29.03.2010 в 19:14. |
|
29.03.2010, 18:09 | #7 |
Kobold Dev
|
поделитесь тайной прохода аутентификации
__________________
Вообще-то я не специалист по этим гравицаппам... Последний раз редактировалось tempura; 29.03.2010 в 19:14. |
Пользователь сказал cпасибо: | Konctantin (29.03.2010) |
31.03.2010, 01:34 | #8 |
Пользователь
Регистрация: 22.03.2010
Сообщений: 41
Сказал(а) спасибо: 7
Поблагодарили 25 раз(а) в 15 сообщениях
|
а нету никакой тайны. клиент аутентифициуется на близовском сервере обычным порядком.
нужно просто сделать, чтобы клиент не замечал, что на его пути что-то стоит. например вклиниваться в соединение с помощью LSP (можно своего, а можно и с помощью какого-нибудь проксификатора, благо все они под WinXP работают по этому принципу). кстати, насчет инжектов - Warden бдит. я насчитал 4 проверки, связанные с соединением и отправкой данных. если кто не знает их точных адресов - можно и напороться. Последний раз редактировалось tempura; 31.03.2010 в 06:05. |
31.03.2010, 10:24 | #9 | |
Kobold Dev
|
Цитата:
место было удобное покамись не сметили да и биаша больше не захотел (то есть времени нету у него) покамись юзаем tiawps
__________________
Вообще-то я не специалист по этим гравицаппам... |
|
20.04.2010, 21:56 | #10 |
Kobold Dev
|
столкнулись с проблемой при использования метода tiawps
при попытки перевести дамп в читаемый вид получаем файл с одним и темже размером и рветца наче тут CLIENT: LENGTH: 10 OPCODE: 0510 DATA: 00 08 10 05 00 00 0A 00 00 00 SERVER: LENGTH: 8 OPCODE: 050F DATA: 00 06 0F 05 0A 00 00 00 неможем покамись определить [13:00] <Kosuha> но мне кажеться чтото с [13:00] <Kosuha> case 1293: [13:00] <Kosuha> forwarding connection [13:01] <Kosuha> какойто [13:01] <Kosuha> попался вопрос собетсвенно такой кто нить юзает тивапс и работает ли нормально у вас ? а то 1 в 1 струткура вот сидим думаем ктог лючит мы или тивапс
__________________
Вообще-то я не специалист по этим гравицаппам... |
20.04.2010, 22:02 | #11 |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
Я раз пробовал, еще когда была версия 332 - получилось.
Но он мне показался сильно геморным и я забил Кстати, а никто не пробовал заюзать мелкософтовский net monitor, у них там даже API имеется? |
20.04.2010, 22:07 | #12 |
Kobold Dev
|
да на 33,2 и у нас то работало
а вот с 3,3,3 фигня какая то просто мало рук чтоб вникать
__________________
Вообще-то я не специалист по этим гравицаппам... |
20.04.2010, 22:18 | #13 |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
ну с портами там и хостами беда прыгают как зайчики, это раз
и 2 даже если поймаешь порт и хост, то иногда какого-то черта получает пакет 3 по счету после коннекта, который не декриптуется LENGTH: 65536 OPCODE: 0000 DATA: 00 00 00 00 не стал пока разбираться, чего-то нету желания |
20.04.2010, 22:21 | #14 |
Kobold Dev
|
да был такой
пакет и еще могло почему-то выйти 2 дампа сразу 1 стандартно а 2 громадный
__________________
Вообще-то я не специалист по этим гравицаппам... |
21.04.2010, 17:47 | #16 | |
Пользователь
Регистрация: 22.03.2010
Сообщений: 41
Сказал(а) спасибо: 7
Поблагодарили 25 раз(а) в 15 сообщениях
|
Цитата:
1. клиент авторизуется, подключается к реалм-серверу по умолчанию. 2. в процессе обмена данными приходит пакет "а подключись-ка та на такой-то адрес:порт" (обычно через секунду-две после логина, но не обязательно, может и в середине игры прийти). 3. клиент устанавливает соединение, согласовывает шифрование (с новыми сидами, ключами и всей прочей кухней) 4. и в первое соединение приходит пакет "переводи весь обмен данными на второе соединение". и дальше все данные с сервера начинают сыпаться в это соединение. в 3.3.3(без а) был такой баг - первое соединение не закрывалось, хотя объекты, с ним связанные удалялись. в (а) уже исправили, вроде-бы. иногда пакет из шага 2 не приходит, тогда клиент продолает работать в одно соединение (все по старому). видимо это тот случай, когда лоад-балансер считает нужным не переводить клиента на другой адрес:порт (на дефолтном меньше всего народа) если взять и исключить из потока этот пакет (моя прокся такие издевательства позволяет) - то клиент так и будет работать в одно соединение (второе-то не согласовано). минуты 3 где-то, потом сервер кикнет. |
|
Пользователь сказал cпасибо: | Konctantin (21.04.2010) |
21.04.2010, 21:42 | #17 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
прокся умеет вклиниваться в трафик с циклическим ключем? или прокся самостоятельно устанавливает соединение и с сервером со своим ключем и с клиентом со своим ключем?
|
22.04.2010, 15:17 | #19 | ||
Пользователь
Регистрация: 22.03.2010
Сообщений: 41
Сказал(а) спасибо: 7
Поблагодарили 25 раз(а) в 15 сообщениях
|
Цитата:
времена, когда для этого использовался зацикленый по кругу 20байтный session_key уже давно прошли. так что приходится поддерживать 4 rc4-состояния - на каждое направление с каждой стороны. инициализировать их из данных клиента и все до единого пакеты пропускать через них. точнее приходилось до недавнего времени. сейчас - 4 х кол-во подключений (если я правильно понимаю, близам ничего не мешает перекидывать клиента между разными адресами:портами по нескольку раз за сессию). да, кстати, у вардена свое шифрование со своими ключами, независимое от сессионного. и его состояния тоже нужно поддерживать, если есть желание читать\редактировать варденовский трафик. и они тоже меняются при загрузке нового варденоского модуля (один раз за сессию, почти в самом начале. и тоже ничего не мешает близзам грузить новые варденовские модули по сколько угодно раз) Цитата:
с шифрованым заголовком. естественно, до установки второго соединения. опкод - 1293. Код:
[S2C] SMSG_SECOND_CONNECTION (1293 = 0x050D) len: 30 ip : 62.67.45.65 port : 6112 unk1 : 6 digest : 11ae18435c2a504058d60ed647df65bc09d23248 ...после того, как второе соединение будет установлено должным образом... [S2C] SMSG_SWITCH_TO_SECOND (1295 = 0x050F) len: 4 seq : 10 [C2S] CMSG_SESSION_SWITCHED (1296 = 0x0510) len: 4 seq : 10 [S2C] SMSG_SWITCH_ENCRYPTION (1297 = 0x0511) len: 0 Последний раз редактировалось abdula123; 22.04.2010 в 15:34. |
||
3 пользователя(ей) сказали cпасибо: |
22.04.2010, 16:07 | #20 | ||
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
Цитата:
я хотел сказать что даже цикличный ключ не позволял вклинится, но сказал криво. ок Цитата:
|
||
23.04.2010, 07:50 | #21 | |
Пользователь
Регистрация: 22.03.2010
Сообщений: 41
Сказал(а) спасибо: 7
Поблагодарили 25 раз(а) в 15 сообщениях
|
Цитата:
на самом деле это не так уж и сложно, если хочется только читать данные. единственное - придется подправлять после каждого патча. а вот если хочется их редактировать на лету - таким способом это делать ну очерь извратно. |
|
Пользователь сказал cпасибо: | Konctantin (23.04.2010) |
23.04.2010, 08:54 | #22 |
Kobold Dev
|
ну поняно
против лома нету приему если нет другого лома менячто поражает больше чем мудрее близы защиту делают тем сильнее их ломают
__________________
Вообще-то я не специалист по этим гравицаппам... |
23.04.2010, 10:04 | #24 |
Kobold Dev
|
черный пиар всегда был дешевой рекламой
__________________
Вообще-то я не специалист по этим гравицаппам... |
31.05.2010, 21:26 | #26 |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
Мы тут с LordJZ начали делать сниффер, но наткнулись на неприятность:
При логине и пока стоим на окне выбора персонажей пакеты декриптуются нормально Вот лог сниффера: Код:
World server address: 62.67.45.123:3724 Connected to 62.67.45.123:3724 SERVER: Header = 44 Packet = 44 OK Opcode: SMSG_AUTH_CHALLENGE Session Key: 6250DC798DDEA48A01102CE9B7EA33060D425E42DC2145E0477FBEC637F1287C00EAC7B10B54B3BB CLIENT: Header = 278 Packet = 278 OK Opcode: CMSG_AUTH_SESSION SERVER: Header = 15 Packet = 15 OK Opcode: SMSG_AUTH_RESPONSE SERVER: Header = 192 Packet = 270 REUSE Opcode: SMSG_ADDON_INFO SERVER: Header = 8 Packet = 78 REUSE Opcode: SMSG_CLIENTCACHE_VERSION SERVER: Header = 36 Packet = 70 REUSE Opcode: SMSG_TUTORIAL_FLAGS Redirect to 62.67.45.165:1119 SERVER: Header = 34 Packet = 34 OK Opcode: SMSG_REDIRECT_CLIENT Connected to 62.67.45.165:1119 SERVER: Header = 44 Packet = 44 OK Opcode: SMSG_AUTH_CHALLENGE Session Key: 6250DC798DDEA48A01102CE9B7EA33060D425E42DC2145E0477FBEC637F1287C00EAC7B10B54B3BB CLIENT: Header = 46 Packet = 46 OK Opcode: CMSG_REDIRECTION_AUTH_PROOF SERVER: Header = 4 Packet = 4 OK Opcode: SMSG_FORCE_SEND_QUEUED_PACKETS CLIENT: Header = 6 Packet = 6 OK Opcode: CMSG_READY_FOR_ACCOUNT_DATA_TIMES CLIENT: Header = 6 Packet = 6 OK Opcode: CMSG_CHAR_ENUM CLIENT: Header = 10 Packet = 10 OK Opcode: CMSG_REALM_SPLIT SERVER: Header = 25 Packet = 25 OK Opcode: SMSG_ACCOUNT_DATA_TIMES SERVER: Header = 291 Packet = 312 REUSE Opcode: SMSG_CHAR_ENUM SERVER: Header = 21 Packet = 21 OK Opcode: SMSG_REALM_SPLIT SERVER: Header = 41 Packet = 41 OK Opcode: SMSG_WARDEN_DATA Код:
CLIENT: Header = 14 Packet = 14 OK Opcode: CMSG_PLAYER_LOGIN SERVER: Header = 25 Packet = 25 OK Opcode: SMSG_ACCOUNT_DATA_TIMES SERVER: Header = 36 Packet = 1460 REUSE Opcode: SMSG_TUTORIAL_FLAGS SERVER: Header = 16 Packet = 1424 REUSE Opcode: MSG_SET_DUNGEON_DIFFICULTY SERVER: Header = 24 Packet = 1408 REUSE Opcode: SMSG_LOGIN_VERIFY_WORLD SERVER: Header = 29 Packet = 1384 REUSE Opcode: SMSG_ACCOUNT_DATA_TIMES SERVER: Header = 6 Packet = 1355 REUSE Opcode: SMSG_FEATURE_SYSTEM_STATUS SERVER: Header = 293 Packet = 1349 REUSE Opcode: SMSG_MOTD SERVER: Header = 12 Packet = 1056 REUSE Opcode: SMSG_LEARNED_DANCE_MOVES SERVER: Header = 12 Packet = 1044 REUSE Opcode: SMSG_CONTACT_LIST SERVER: Header = 24 Packet = 1032 REUSE Opcode: SMSG_BINDPOINTUPDATE SERVER: Header = 9 Packet = 1008 REUSE Opcode: SMSG_SET_PROFICIENCY SERVER: Header = 9 Packet = 999 REUSE Opcode: SMSG_SET_PROFICIENCY SERVER: Header = 9 Packet = 990 REUSE Opcode: SMSG_SET_PROFICIENCY SERVER: Header = 9 Packet = 981 REUSE Opcode: SMSG_SET_PROFICIENCY SERVER: Header = 9 Packet = 972 REUSE Opcode: SMSG_SET_PROFICIENCY SERVER: Header = 9 Packet = 963 REUSE Opcode: SMSG_SET_PROFICIENCY SERVER: Header = 9 Packet = 954 REUSE Opcode: SMSG_SET_PROFICIENCY SERVER: Header = 9 Packet = 945 REUSE Opcode: SMSG_SET_PROFICIENCY SERVER: Header = 9 Packet = 936 REUSE Opcode: SMSG_SET_PROFICIENCY SERVER: Header = 9 Packet = 927 REUSE Opcode: SMSG_SET_PROFICIENCY SERVER: Header = 25 Packet = 918 REUSE Opcode: SMSG_TALENTS_INFO SERVER: Header = 12 Packet = 893 REUSE Opcode: SMSG_INSTANCE_DIFFICULTY SERVER: Header = 9 Packet = 881 REUSE Opcode: SMSG_SET_PROFICIENCY SERVER: Header = 9 Packet = 872 REUSE Opcode: SMSG_SET_PROFICIENCY SERVER: Header = 285 Packet = 863 REUSE Opcode: SMSG_INITIAL_SPELLS SERVER: Header = 8 Packet = 578 REUSE Opcode: SMSG_SEND_UNLEARN_SPELLS ERROR: SERVER Size = 581 > packet.Length = 570 ERROR: SERVER Size = 27961 > packet.Length = 1460 ERROR: SERVER Size = 46186 > packet.Length = 1460 ERROR: SERVER Size = 27772 > packet.Length = 1355 CLIENT: Header = 7 Packet = 7 OK Opcode: CMSG_PLAYED_TIME CLIENT: Header = 14 Packet = 14 OK Opcode: CMSG_NAME_QUERY CLIENT: Header = 14 Packet = 14 OK Opcode: CMSG_SET_ACTIVE_MOVER CLIENT: Header = 7 Packet = 7 OK Opcode: CMSG_SET_ACTIONBAR_TOGGLES CLIENT: Header = 6 Packet = 6 OK Opcode: CMSG_REQUEST_RAID_INFO CLIENT: Header = 6 Packet = 6 OK Opcode: CMSG_GMTICKET_GETTICKET ERROR: SERVER Size = 34578 > packet.Length = 118 CLIENT: Header = 6 Packet = 6 OK Opcode: CMSG_QUERY_TIME CLIENT: Header = 14 Packet = 14 OK Opcode: CMSG_QUEST_POI_QUERY CLIENT: Header = 6 Packet = 6 OK Opcode: CMSG_MEETINGSTONE_INFO CLIENT: Header = 6 Packet = 6 OK Opcode: CMSG_LFD_PLAYER_LOCK_INFO_REQUEST CLIENT: Header = 6 Packet = 6 OK Opcode: MSG_GUILD_BANK_MONEY_WITHDRAWN CLIENT: Header = 6 Packet = 6 OK Opcode: CMSG_CALENDAR_GET_NUM_PENDING CLIENT: Header = 8 Packet = 8 OK Opcode: CLIENT: Header = 14 Packet = 14 OK Opcode: CMSG_QUESTGIVER_STATUS_QUERY CLIENT: Header = 14 Packet = 14 OK Opcode: CMSG_NAME_QUERY CLIENT: Header = 14 Packet = 14 OK Opcode: CMSG_TIME_SYNC_RESP CLIENT: Header = 42 Packet = 42 OK Opcode: MSG_MOVE_FALL_LAND CLIENT: Header = 10 Packet = 10 OK Opcode: CMSG_ZONEUPDATE CLIENT: Header = 43 Packet = 43 OK Opcode: CMSG_JOIN_CHANNEL CLIENT: Header = 49 Packet = 49 OK Opcode: CMSG_JOIN_CHANNEL CLIENT: Header = 47 Packet = 47 OK Opcode: CMSG_JOIN_CHANNEL CLIENT: Header = 43 Packet = 43 OK Opcode: CMSG_JOIN_CHANNEL CLIENT: Header = 47 Packet = 47 OK Opcode: CMSG_JOIN_CHANNEL CLIENT: Header = 6 Packet = 6 OK Opcode: CMSG_WORLD_STATE_UI_TIMER_UPDATE ERROR: SERVER Size = 44279 > packet.Length = 29 ERROR: SERVER Size = 7350 > packet.Length = 1460 ERROR: SERVER Size = 61367 > packet.Length = 649 ERROR: SERVER Size = 31772 > packet.Length = 62 ERROR: SERVER Size = 21770 > packet.Length = 388 ERROR: SERVER Size = 12076 > packet.Length = 54 ERROR: SERVER Size = 10025 > packet.Length = 108 ERROR: SERVER Size = 50091 > packet.Length = 62 ERROR: SERVER Size = 41905 > packet.Length = 61 ERROR: SERVER Size = 20541 > packet.Length = 66 ERROR: SERVER Size = 26947 > packet.Length = 54 ERROR: SERVER Size = 15250 > packet.Length = 66 ERROR: SERVER Size = 13283 > packet.Length = 147 ERROR: SERVER Size = 5655 > packet.Length = 170 ERROR: SERVER Size = 16965 > packet.Length = 54 ERROR: SERVER Size = 25301 > packet.Length = 62 ERROR: SERVER Size = 39797 > packet.Length = 62 ERROR: SERVER Size = 12419 > packet.Length = 54 CLIENT: Header = 32 Packet = 32 OK Opcode: CMSG_WARDEN_DATA ERROR: SERVER Size = 18762 > packet.Length = 439 ERROR: SERVER Size = 9091 > packet.Length = 159 ERROR: SERVER Size = 32369 > packet.Length = 120 CLIENT: Header = 42 Packet = 42 OK Opcode: MSG_MOVE_SET_FACING CLIENT: Header = 42 Packet = 42 OK Opcode: MSG_MOVE_START_FORWARD ERROR: SERVER Size = 37437 > packet.Length = 5 CLIENT: Header = 42 Packet = 42 OK Opcode: MSG_MOVE_STOP ERROR: SERVER Size = 11046 > packet.Length = 54 ERROR: SERVER Size = 59547 > packet.Length = 54 ERROR: SERVER Size = 32659 > packet.Length = 120 CLIENT: Header = 14 Packet = 14 OK Opcode: CMSG_SET_SELECTION CLIENT: Header = 14 Packet = 14 OK Opcode: CMSG_QUESTGIVER_HELLO ERROR: SERVER Size = 23216 > packet.Length = 54 ERROR: SERVER Size = 12149 > packet.Length = 295 ERROR: SERVER Size = 25893 > packet.Length = 42 Код:
private static void ProcessWorldPacket(byte[] data, Direction direction) { int i = 0, size = 0, opcode = 0; int HEADER_LENGTH = 4; bool isLarge = data.Length > 0x7FFF; HEADER_LENGTH += (isLarge ? 1 : 0); if (direction == Direction.SERVER) { Crypt.DecryptServer(data, HEADER_LENGTH); } else { HEADER_LENGTH += 2; Crypt.DecryptClient(data, HEADER_LENGTH); } if (isLarge) size = data[i++] & 0x7F; size = (size << 8) | data[i++]; size = (size << 8) | data[i++]; for (int j = 0; j < HEADER_LENGTH - 2; j++) opcode |= ((0xFF & data[i++]) << (8 * j)); size += 2; if (size > data.Length) { Console.WriteLine("ERROR: {0} Size = {1} \t>\t packet.Length = {2}", direction, size, data.Length); return; } using (BinaryReader reader = new BinaryReader(new MemoryStream(data))) { reader.BaseStream.Position += HEADER_LENGTH; byte[] newData = reader.ReadBytes(size - HEADER_LENGTH); HandleWorldPacket((WorldOpcodes)opcode, newData); Console.WriteLine("{0}:\tHeader = {1}\tPacket = {2}\t{3}\tOpcode: {4}", direction, size, data.Length, data.Length == size ? "OK" : "REUSE", (WorldOpcodes)opcode); if (size < data.Length) { ProcessWorldPacket(reader.ReadBytes(data.Length - size), direction); } } } |
Пользователь сказал cпасибо: | YuruY (01.06.2010) |
31.05.2010, 22:38 | #27 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
похвально. pcap?
потерялась синхронизация на серверных опкодах. индексы уехали. Последний раз редактировалось RomanRom2; 31.05.2010 в 22:40. |
Пользователь сказал cпасибо: | Konctantin (31.05.2010) |
31.05.2010, 23:07 | #28 | |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
Да, pcap? а потом "поверху" SharpPcap.
Цитата:
|
|
31.05.2010, 23:34 | #29 |
MaNGOS Dev
Регистрация: 11.03.2010
Сообщений: 468
Сказал(а) спасибо: 0
Поблагодарили 514 раз(а) в 163 сообщениях
|
А помоему некорректно определяются large пакеты...
Код:
// check for large packet if ((m_buffer[index] & 0x80) != 0) { ... } |
Пользователь сказал cпасибо: | Konctantin (01.06.2010) |
01.06.2010, 01:53 | #30 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
а очень просто. я даже сейчас объясню где багу ловите.
итак, вы входите в мир. попёрло много пакетов. и больших пакетов. что это означает? это означает, что когда вы в снифере видите "пакет", то это совсем не означает что он пришел полностью. это даже не означает что это пакет вообще. это просто какие то данные в потоке tcp. и даже на следующий "recv_from_server" тоже не обязательно пакет придет полностью. под "пакетом" будем подразумевать "игровой пакет" от близзов, дамп опкода. тут то все и происходит в следующей пачке данных вы считаете, что пришел новый пакет и начинаете декриптовать, тут индексы и съезжают. нужно запоминать размер пакета после декриптовки и ждать все данные для этого пакета. бывают пакеты по 40кб, и в сетевом потоке они будут приходить пачками по 4-5кб. так же случается ситуация, когда в одной пачке данных сразу несколько пакетов. за всем этим нужно тщательно следить. я могу конечно ошибаться, но по опыту (поверьте в мой опыт) даю 95% что это так. т.е. вы теряете конец текущего пакета и соответственно начало следующего. а это можно сделать по вышеописанной причине. это как бы даже нормально я тоже наступал на эти грабли с другой стороны, а зачем вам раскриптованный трафик сразу? это ведь все задержки и возможные ошибки. можно в сниф писать raw-трафик, я его так называю. а декодировать уже потом утилиткой. в снифф пишется ключ и raw-данные, словленные pcap. клиентские отдельно, серверные отдельно. ну всмысле они помечаются соответствующим заголовком. таким образом получается некий формат сниффа. ну и если вам вдруг будет все равно в каком формате записывать, хотел бы предложить разработанный нами формат raw - как раз для случая сбора трафика через pcap. если соберетесь - примеры снифов, утилит для декриптовки в pkt с исходниками и pktViewer - подарю. удобство в том, что возле каждого пакета лежит время и тик клиента. по ним чудно смотреть временные интервалы, разгадывать тайну мув-таймстампа и т.п. на сриншоте вьювера видно. ну еще в неком унифицированном, едином формате снифов, которого нам пока достичь не удалось, как мы не раздавали свои сниферы, сами снифы и утилиты для их обработки. Последний раз редактировалось RomanRom2; 01.06.2010 в 01:58. |
2 пользователя(ей) сказали cпасибо: | Konctantin (01.06.2010) |
01.06.2010, 04:00 | #31 |
Пользователь
Регистрация: 22.03.2010
Сообщений: 41
Сказал(а) спасибо: 7
Поблагодарили 25 раз(а) в 15 сообщениях
|
лишнее подтвердждение того, что прокси удобнее будет
|
01.06.2010, 09:58 | #32 | ||||||
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
Спасибо всем за советы и подсказки:
Цитата:
http://github.com/arrai/tiawps/blob/...pter/decrypt.c Если я правильно понял с примера, то нужно дополнительно декриптовать еще 1 байт, или же сразу нужный размер. Код:
private static void ProcessWorldPacket(byte[] data, Direction direction) { int i = 0, size = 0, opcode = 0; bool isLarge = (data[i] & 0x80) != 0; int HEADER_LENGTH = isLarge ? 4 : 5; if (direction == Direction.SERVER) { Crypt.DecryptServer(data, 0, HEADER_LENGTH); } else { HEADER_LENGTH += 2; Crypt.DecryptClient(data, 0, HEADER_LENGTH); } if (isLarge) size = data[i++] & 0x7F; size = (size << 8) | data[i++]; size = (size << 8) | data[i++]; for (int j = 0; j < HEADER_LENGTH - 2; j++) opcode |= ((0xFF & data[i++]) << (8 * j)); size += (2 + (isLarge ? 1 : 0)); if (size > data.Length) { Console.WriteLine("ERROR: {0} Size = {1} > packet.Length = {2}", direction, size, data.Length); return; } using (BinaryReader reader = new BinaryReader(new MemoryStream(data))) { reader.BaseStream.Position += HEADER_LENGTH; byte[] newData = reader.ReadBytes(size - HEADER_LENGTH); HandleWorldPacket((WorldOpcodes)opcode, newData); Console.WriteLine("{0}:\tHeader = {1}\tPacket = {2}\t{3}\tOpcode: {4}", direction, size, data.Length, data.Length == size ? "OK" : "REUSE", (WorldOpcodes)opcode); if (size < data.Length) { ProcessWorldPacket(reader.ReadBytes(data.Length - size), direction); } } } Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Да и с моим ничтожным опытом в программировании (чуть больше года на любительском уровне и когда есть время) наверное не постичь тайну аутеффикации, так как надо делать хук (подменить ИП сервера в памяти), надо еще чего-то и еще... Ладно хватит писать, пойду работать... |
||||||
01.06.2010, 10:05 | #33 |
MaNGOS Dev
Регистрация: 11.03.2010
Сообщений: 468
Сказал(а) спасибо: 0
Поблагодарили 514 раз(а) в 163 сообщениях
|
Сначала надо расшифровать, потом проверить на флаг 0x80, если он выставлен, расшифровать еще 1 байт... А вы сначала проверяете, а потом расшифровываете.
|
Пользователь сказал cпасибо: | Konctantin (01.06.2010) |
01.06.2010, 15:30 | #34 | ||
Пользователь
Регистрация: 22.03.2010
Сообщений: 41
Сказал(а) спасибо: 7
Поблагодарили 25 раз(а) в 15 сообщениях
|
Цитата:
в самом простейшем случае - использовать готовый LSP-редиректор (proxycap, например) для переброса всех соединений wow на свой сервер. всё. никаких подмен в памяти, никаких собственных аутентификаций. единственная заморочка, которая там есть - это обработка второго соединения и ключей для него. я так и не осилил ее - все эти новые сиды\хэши, осн.\доп. ключи и т.п. и откатился простому и тупому чтению готового arc4-состояния из памяти. Цитата:
единственное место где мне встречались large пакеты - это SMSG_COMPRESSED_UPDATE_OBJECT при телепорте (или логине, что по сути одно и то-же) в даларан, в час пик, когда там бегают толпы народа. все данные по этим разодетым и сверкающим "объектам" близы почему-то отсылают одним большим пакетом. пока кроме этого места я больше ни одного large пакета не видел. Последний раз редактировалось abdula123; 01.06.2010 в 15:50. |
||
Пользователь сказал cпасибо: | Konctantin (01.06.2010) |
01.06.2010, 16:06 | #35 | |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
Цитата:
получается прокси сама должна перелючить режим шифрования, а клиенту послать видоизмененный пакет редиректа. Или я чего-то недопонимаю!? Я пробовал сначала написать прокси, сделал наброски, но потом все заглохло за неимением данных и неумением. |
|
01.06.2010, 16:37 | #36 |
MaNGOS Dev
Регистрация: 11.03.2010
Сообщений: 468
Сказал(а) спасибо: 0
Поблагодарили 514 раз(а) в 163 сообщениях
|
|
01.06.2010, 17:18 | #37 | |||
Пользователь
Регистрация: 22.03.2010
Сообщений: 41
Сказал(а) спасибо: 7
Поблагодарили 25 раз(а) в 15 сообщениях
|
Цитата:
наверное ачивок мало Цитата:
Цитата:
и потом использовать эти ключи для расшифроки пакетов (и обратной зашифровки - если требуется модифицировать пакеты на лету или добавлять\удалять их) Последний раз редактировалось abdula123; 01.06.2010 в 17:26. |
|||
01.06.2010, 17:53 | #39 | |
Kobold Dev
|
Цитата:
нопомто с батлой мы прокси не могли перенаправить верно перешли на тиавапс уже теость с ключем декомпилировали но теперь опять в ОПе -) надежда опять на прокси вот что нам не удалось просто после батлы [11:18] <Kosuha> мне нужно всеголишь реалм лист [11:18] <Kosuha> перекинуть [11:18] <Kosuha> т.е. это стадия логин сервера [12:55] <Kosuha> будет работать в области логгера и прокси [12:55] <Kosuha> там с прокси я бы щас бился [12:55] <Kosuha> а выяснил [12:55] <Kosuha> что изза ИП клиент полюбому рвёт коннект [12:56] <Kosuha> и реалм лист подменяют как что прослушивая Winsock [12:56] <Kosuha> я в эти дебри ещё никогда не лазил даже рук не хватате уна спросто -)) остлись просто " у самовара я и моя бабка"
__________________
Вообще-то я не специалист по этим гравицаппам... Последний раз редактировалось Neverdie; 01.06.2010 в 17:55. |
|