Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   ArcheAge (https://forum.zone-game.info/forumdisplay.php?f=187)
-   -   ArcheAge Опкоды (https://forum.zone-game.info/showthread.php?t=29159)

Smiler 09.02.2014 21:20

Re: ArcheAge Опкоды
 
Цитата:

Сообщение от MadHacker (Сообщение 351177)
Пока не знаю. Я ещё не смотрел трафик. Я лазию по коду клиента и на глаза попались хендлеры пакетов.
Они хендлятся по списку. ID идут по порядку от нуля до количества пакетов в каждом из трёх хендлеров.
Три типа пакета. Пакеты авторизации 14 штук, пакеты UCC (эмблемы на плащах и подобные) 16 штук, пакеты игрового сервера 502 штуки.
Соответственно ID от 0 до 0x01F5. Остальные байты что-то другое. Тут уже зависит от того, сколько соединений держит клиент. Если одно, то скорее всего один из этих байтов это тип пакета.
Я пока не могу посмотреть разбор самого пакета, надо отлаживать, а под восьмёркой обходчик темиды не работает. Обновил называется комп на свою голову :)

в пакетах Client <-> LS 2 байта опкод
в пакетах Client <-> GS 4 байта опкод

MadHacker 09.02.2014 21:33

Re: ArcheAge Опкоды
 
С темидой я разобрался, надо было просто драйвер idastealth пересобрать под восьмёрку, так что скоро разберусь.

AuthToClient:
Свернуть ↑Развернуть ↓


StreamToClient:
Свернуть ↑Развернуть ↓


ServerToClient:
Свернуть ↑Развернуть ↓


С обратными пакетами та же история, не считая того, что их надо собирать по всему коду. Тип пакетов это действительно int, но не используется значение крупнее двух байт. Более того в хендлерах стоят проверки на превышение значения.
Но я ещё не добрался до уровня который поближе к сети. Возможно там эти два байта дополнительно кодируются или добиваются чем то до 4. Посмотрю.

Hint 09.02.2014 22:07

Re: ArcheAge Опкоды
 
В списке:
0x039 CharacterListPacket

Отправляю:
0x003901DD

Т. е. 01DD - это какое-то дополнение. Вроде бы все серверные пакеты начинаются на DD. Но вместо 01 где-то встречается 02.

MadHacker 09.02.2014 22:08

Re: ArcheAge Опкоды
 
01 и 02 это типы пакетов скорее всего. Чуть позже выложу список. DD пока не представляю что такое. Не встречал.

Добавлено через 21 минуту
Собственно вот. Типы пакетов:
0x00 X2ClientToWorld
0x01 ClientToAuth
0x02 X2WorldToClient
0x09 AuthToClient
0x15 ClientToStream
0x16 StreamToClient

trixiejack 09.02.2014 23:28

Re: ArcheAge Опкоды
 
Цитата:

Сообщение от MadHacker (Сообщение 351233)
01 и 02 это типы пакетов скорее всего. Чуть позже выложу список. DD пока не представляю что такое. Не встречал.

Добавлено через 21 минуту
Собственно вот. Типы пакетов:
0x00 X2ClientToWorld
0x01 ClientToAuth
0x02 X2WorldToClient
0x09 AuthToClient
0x15 ClientToStream
0x16 StreamToClient

Я тебя хочу.

Smiler 09.02.2014 23:37

Re: ArcheAge Опкоды
 
Цитата:

Сообщение от MadHacker (Сообщение 351233)
01 и 02 это типы пакетов скорее всего. Чуть позже выложу список. DD пока не представляю что такое. Не встречал.

Добавлено через 21 минуту
Собственно вот. Типы пакетов:
0x00 X2ClientToWorld
0x01 ClientToAuth
0x02 X2WorldToClient
0x09 AuthToClient
0x15 ClientToStream
0x16 StreamToClient

Оч интересно но пока неукладывается.

Пример

DD 01 XX XX
DD 02 XX XX

Оба пакета идут от gs к client

Судя по вашей таблице
01 от client к auth серверу
02 от gs к client

MadHacker 10.02.2014 00:16

Re: ArcheAge Опкоды
 
Я посмотрел код. Предположение было неверным.
Опкод это ровно 2 байта. Дальше данные пакета. Класс пакета - 3 виртуальных метода. Из нулевого я достал подтипы, но так и не увидел чтоб они использовались. Скорее всего для какой то внутренней организации по очередям или может приоритеты. Первый метод у всех пакетов одинаковый. Запись двух байтов опкода.
Второй метод идёт сразу за первым - данные пакета.
Например 0x116 CSRestrictCheck при входе в мир.
Пишет в первом метода 2 байта опкода. Затем во втором методе пишет сразу 4 байта, помеченые как ни странно тоже как "type". После чего пишет 1 байт "restrictCode".
Код:

Stack[00001544]:0017E052 db  16h
Stack[00001544]:0017E053 db    1
Stack[00001544]:0017E054 db    1
Stack[00001544]:0017E055 db    0
Stack[00001544]:0017E056 db    0
Stack[00001544]:0017E057 db    0
Stack[00001544]:0017E058 db    1

Вызовы идут просто подряд. Неоткуда там ещё двум байтам опкода взяться.
Код:

crynetwork.dll:063EB10D lea    ecx, [ebp-10h]
crynetwork.dll:063EB110 push    ecx
crynetwork.dll:063EB111 mov    ecx, esi
crynetwork.dll:063EB113 call    dword ptr [eax+4] ;первый виртуальный метод - запись опкода
crynetwork.dll:063EB116 mov    eax, [esi]
crynetwork.dll:063EB118 lea    ecx, [ebp-10h]
crynetwork.dll:063EB11B push    ecx
crynetwork.dll:063EB11C mov    ecx, esi
crynetwork.dll:063EB11E call    dword ptr [eax+8] ;второй виртуальный метод - запись данных пакета.

Перед этим пакетом пролетают пару игровых пакетов с пустым вторым методом. Так что разница во втором и третьем байте должна встречаться достаточно часто. По крайней мере для C2S пакетов.
Но я не думаю что S2C пакеты сделаны по другому принципу. Потому что вот так хендлятся клиенские пакеты:
Код:

.text:391B071C cmp    esi, 1F6h            ;Проверка опкода на верхний диапазон
.text:391B0722 jge    short loc_391B0785
.text:391B0724 mov    ecx, [edi+esi*4+4] ;Вытаскивает пакет из таблицы
.text:391B0728 test    ecx, ecx                ;Проверяет на существование (в таблице встречаются нули)
.text:391B072A jz      short loc_391B0785

Фрагмент таблицы:
Код:

.rdata:397D7630 off_397D7630 dd offset const PacketHandler<ClientPlayer,ServerToClientPacketType,502>::`vftable'
.rdata:397D7634 off_397D7634 dd 0        ;Ссылки на функторы
.rdata:397D7638 dd offset off_39840968
.rdata:397D763C dd offset off_39841928
.rdata:397D7640 dd offset off_398428E8
.rdata:397D7644 dd offset off_398438A8
.rdata:397D7648 dd offset off_39844868
.rdata:397D764C dd offset off_39845828
.rdata:397D7650 dd offset off_39850518
.rdata:397D7654 dd 0
.rdata:397D7658 dd offset off_398467F8
.rdata:397D765C dd offset off_398477B8

Код:

.rdata:39840968 off_39840968 dd offset const PacketFunctor<ClientPlayer,ServerToClientPacketType,SCReconnectAuthPacket>::`vftable'
.rdata:3984096C off_3984096C dd offset sub_3915B450    ; вот это хз что за метод.

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

UPD... Сейчас смотрю на порядок байт на стеке. Физически в сетевом пакете неизвестные байты до опкода или после? То, что я запостил выше это уже сырой байтовый буфер. По идее при отправке его в сеть байты уже не должны меняться местами... Тогда получается, что что-то пишется до опкода и это уже интереснее.

Smiler 10.02.2014 07:27

Re: ArcheAge Опкоды
 
ок. привожу пример 3 разных Серверных пакета :

XX XX DD 01 00 00 ............................

XX XX DD 02 00 00 ............................

XX XX DD 01 EC 01 ............................

где XX XX = длинна пакета
....... полезные данные


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

MadHacker 10.02.2014 08:50

Re: ArcheAge Опкоды
 
Я до этого разбирал протокол PerfectWorld. Могу точно сказать одно - логике здесь не место.
Эти байты могут оказаться чем угодно. ID сервера. Подтип пакета. Приоритет. Мусор. Ключ сессии. Маркер сжатия...
Возможно для разработки сервера вам достаточно считать это опкодом. Но я занимаюсь клиентской частью и от этих мелочей зависит на сколько быстро мой софт прихлопнет протектор. По этому буду разбираться дальше.

Добавлено через 1 час 28 минут
Чем дальше в код... Ещё пачка пакетов
0x10 X2::ProxyPacket
Не делятся по направлениям на клиентские и серверные.
Код:

0x000        PacketFunctor<NetConnection,enum  X2::ProxyPacketType,X2::ChangeStatePacket>
0x001        NoPck
0x002        PacketFunctor<NetConnection,enum  X2::ProxyPacketType,X2::FlushMsgsPacket>
0x003        NoPck
0x004        PacketFunctor<NetConnection,enum  X2::ProxyPacketType,X2::UpdatePhysicsTimePacket>
0x005        PacketFunctor<NetConnection,enum  X2::ProxyPacketType,X2::BeginUpdateObjPacket>
0x006        PacketFunctor<NetConnection,enum  X2::ProxyPacketType,X2::EndUpdateObjPacket>
0x007        PacketFunctor<NetConnection,enum  X2::ProxyPacketType,X2::BeginBindObjPacket>
0x008        PacketFunctor<NetConnection,enum  X2::ProxyPacketType,X2::EndBindObjPacket>
0x009        PacketFunctor<NetConnection,enum  X2::ProxyPacketType,X2::UnbindPredictedObjPacket>
0x00A        PacketFunctor<NetConnection,enum  X2::ProxyPacketType,X2::RemoveStaticObjPacket>
0x00B        PacketFunctor<NetConnection,enum  X2::ProxyPacketType,X2::VoiceDataPacket>
0x00C        PacketFunctor<NetConnection,enum  X2::ProxyPacketType,X2::UpdateAspectPacket>
0x00D        PacketFunctor<NetConnection,enum  X2::ProxyPacketType,X2::SetAspectProfilePacket>
0x00E        PacketFunctor<NetConnection,enum  X2::ProxyPacketType,X2::PartialAspectPacket>
0x00F        PacketFunctor<NetConnection,enum  X2::ProxyPacketType,X2::SetGameTypePacket>
0x010        PacketFunctor<NetConnection,enum  X2::ProxyPacketType,X2::ChangeCVarPacket>
0x011        PacketFunctor<NetConnection,enum  X2::ProxyPacketType,X2::EntityClassRegistrationPacket>
0x012        PacketFunctor<NetConnection,enum  X2::ProxyPacketType,X2::PingPacket>
0x013        PacketFunctor<NetConnection,enum  X2::ProxyPacketType,X2::PongPacket>
0x014        PacketFunctor<NetConnection,enum  X2::ProxyPacketType,X2::PacketSeqChange>
0x015        NoPck
0x016        PacketFunctor<NetConnection,enum  X2::ProxyPacketType,X2::FastPongPacket>


xTz 19.02.2014 11:38

Re: ArcheAge Опкоды
 
что вы тут изобретаете велосипед ) оп код 2 байта имеет.
0x000002 где 02 означает тип пакета это x2 тип пакета
0x000201 где 01 тип пакета не пакованый серверный
если в конце 03 или выше это значит пакованый и там еще 1 байт ид сессий паходу.
это только для гс.
Для стрим или логин протокола там сразу 2 байта и нету разделение и нету сессий если я не ошибаюсь.


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

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot