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

Форум администраторов игровых серверов (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)

niktout 30.05.2013 20:44

ArcheAge Опкоды
 
Привет всем, хотел узнать такую вещь, в гейм пакетах ArcheAge
Идут странные хеадеры, (short - длина пакета, байт - неизвестное число которое меняется при перезагрузке клиента, байт - неизвестное число причем постоянное, и шорт - опкод или что это вообще)

Сначала я думал что после длины идет шорт - ключ, но это оказалось не так, потом думал то что второй байт - уровень пакета, но это также не так)

Так как быть? Можете мне кто-нибудь обьяснить что это такое, и как мне отличать пакеты.

niktout 20.10.2013 08:24

Re: Крипт Паролей
 
еще насчет пакетов, как я понял то в гейме - int32 опкоды, но там есть байт который постоянно меняется (в серверных опкодах помойму) и вот мне интересно, что с этим делать? сохранять серверные опкоды как int16 и добавлять к ним рандомный байт?

VISTALL 20.10.2013 12:28

Re: Крипт Паролей
 
Цитата:

Сообщение от niktout (Сообщение 328822)
еще насчет пакетов, как я понял то в гейме - int32 опкоды, но там есть байт который постоянно меняется (в серверных опкодах помойму) и вот мне интересно, что с этим делать? сохранять серверные опкоды как int16 и добавлять к ним рандомный байт?

В обмене клиент-сервак понятия, рандом нету. Есть логика записи - которую тебе нужно узнать

Hint 03.02.2014 17:41

Re: ArcheAge Опкоды
 
В итоге, у игровых пакетов опкод 4 байта?

Necroz-Team 03.02.2014 17:51

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

Сообщение от Hint (Сообщение 350182)
В итоге, у игровых пакетов опкод 4 байта?

Именно, сначала думал флаг,но потом MHard подсказал :)

Hint 04.02.2014 21:06

Re: ArcheAge Опкоды
 
И все-таки первый байт id в клиентских пакетах меняется. Сначала 0x00, в окне выбора персонажа нажимаю "выбрать другой сервер", выбираю новый сервер, теперь во всех клиентских пакетах первый байт уже другой.

MadHacker 09.02.2014 19:14

Re: ArcheAge Опкоды
 
Не может опкод быть 4 байта.
Они в клиенте по двум байтам хендлятся.
Кстати c2s пакеты никто не вытаскивал?
А то s2c очень удобно в трёх хендлерах лежат, а клиентские по всему коду размазаны, плюс инициализаторы разные. Свихнёшься скрипт писать, чтоб их вытащить.

Hint 09.02.2014 19:36

Re: ArcheAge Опкоды
 
Тогда за что отвечают 2 других байта? Серверные опкоды: 0x01B801DD, 0x000F02DD и др.

MadHacker 09.02.2014 20:02

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

KilRoy 09.02.2014 21:04

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

Сообщение от MadHacker (Сообщение 351177)
а под восьмёркой обходчик темиды не работает. Обновил называется комп на свою голову

ВМБокс + ВинХП-32 = виктори ;)
Уже 502пакета О_О я когда-то ковырялся, находил 300 с копейками :) прогрессируют
Даже помойму списки остались...щас гляну :)
Да, чето осталось...но что и зачем не помню(и верно ли это, тоже не помню):
список:
Свернуть ↑Развернуть ↓

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 байта и нету разделение и нету сессий если я не ошибаюсь.

MadHacker 19.02.2014 14:58

Re: ArcheAge Опкоды
 
Ну вот. О чём я собственно и говорил.

MadHacker 21.02.2014 09:19

Re: ArcheAge Опкоды
 
В продолжении темы опкодов, немного о клиентских пакетах.
(примеры не с актуальной вресии, адреса отличаются)
Вопрос обхода фемиды, приведения исходника в божеский вид и обработку RTTI оставим в стороне.
Имеется - список vtable для всех пакетов. Требуется вытащить ID.
Выбираем понравившийся клиентский пакет.
Код:

396D3A54 0003 struct X2::CAEnterWorldPacket: struct X2::ClientToAuthPacket, struct INetPacket;  [SI]
Переходим к его vtable.
Код:

.rdata:396D3A50 ; struct X2::CAEnterWorldPacket: struct X2::ClientToAuthPacket, struct INetPacket;  [SI] O: 0, A: 0  (Class Informer)
.rdata:396D3A50                dd offset const X2::CAEnterWorldPacket::`RTTI Complete Object Locator'
.rdata:396D3A54 const X2::CAEnterWorldPacket::`vftable' dd offset sub_39381D60
.rdata:396D3A54                                        ; DATA XREF: sub_39365B30+A8o
.rdata:396D3A54                                        ; sub_39366010+312o
.rdata:396D3A58                dd offset sub_390196E0
.rdata:396D3A5C                dd offset sub_39366B80

К слову о методах. Первый возвращает класс пакета (я табличку выше постил).
Второй пишет в поток тип пакета, метод один и тот же для всех пакетов (запомните это, упомяну ещё раз).
Третий пишет все остальные данные пакета.
На данный момент это не интересно.
Интересны 2 ссылки на vtable. Очевидно, что одна из них (а в нашем случае, так вообще обе) указывают сюда из конструктора.
Код:

.text:39365BB4                mov    ds:dword_15CC4[esi], ecx
.text:39365BBA                mov    ds:word_15D08[esi], 0
.text:39365BC3                mov    ds:dword_15D18[esi], ecx
.text:39365BC9                mov    ds:dword_15D1C[esi], ecx
.text:39365BCF                mov    [esi+7Bh], bl
.text:39365BD2                mov    edx, ds:dword_39EB6770
;Следующие 2 строчки как раз конструктор
.text:39365BD8                mov    [ebp+var_20], offset const X2::CAEnterWorldPacket::`vftable'
.text:39365BDF                mov    [ebp+var_1C], 0Bh
;Ка видим, он очень капитально заинлайнился
.text:39365BE6                mov    ecx, [edx+1Ch]
.text:39365BE9                mov    eax, [ecx]
.text:39365BEB                mov    edx, [eax+60h]
.text:39365BEE                xorpd  xmm0, xmm0
.text:39365BF2                push    offset aTest_world_que ; "test_world_queue"
.text:39365BF7                movlpd  [ebp+var_8], xmm0
.text:39365BFC                call    edx
.text:39365BFE                mov    edx, [eax]
.text:39365C00                mov    ecx, eax
.text:39365C02                mov    eax, [edx+8]
.text:39365C05                call    eax

Пакет создаётся на стеке и сразу уходит в обработку. Я тут кучу лишнего кода привёл, а интересна нам всего лишь цифра 0x0B в конструкторе, которая и является опкодом этого пакета.

И вот что у нас выходит - конструктор инлайнится и он не в 100% случаев такой тривиальный. Запись опкода может идти сразу, а может через пару инструкций. К слову серверные пакеты конструируются так же, но потом складываются в очень удобную табличку, откуда достаются в один проход скрипта (А то как складываются, заслуживает отдельной статьи на тему "почему разработчикам надо вовремя отрывать руки?").

Желающие могут руками протыкать все пакеты и составить список, ну или придумать что повеселее. У меня скрипт для сборки клиентских пакетов не получился.

Есть ещё вариантик, может кому покажется более простым.
Помните второй метод? Который тип пакета пишет.
Код:

.text:390196E0 sub_390196E0    proc near              ; DATA XREF: .rdata:3968F718o
.text:390196E0                                        ; .rdata:3968F968o
.text:390196E0                                        ; .rdata:3968F978o ...
.text:390196E0
.text:390196E0 var_4          = dword ptr -4
.text:390196E0 arg_0          = dword ptr  8
.text:390196E0
.text:390196E0                push    ebp
.text:390196E1                mov    ebp, esp
.text:390196E3                push    ecx
.text:390196E4                push    esi
.text:390196E5                mov    esi, ecx
.text:390196E7                mov    ecx, [ebp+arg_0]
.text:390196EA                mov    eax, [ecx]
.text:390196EC                mov    edx, [eax+1Ch]
.text:390196EF                call    edx
.text:390196F1                mov    ecx, [ebp+arg_0]
.text:390196F4                push    0
.text:390196F6                test    al, al
.text:390196F8                jnz    short loc_39019718
.text:390196FA                movzx  eax, word ptr [esi+4]
.text:390196FE                mov    [ebp+var_4], eax
.text:39019701                mov    edx, [ecx]
.text:39019703                mov    edx, [edx+40h]
.text:39019706                lea    eax, [ebp+var_4]
.text:39019709                push    eax                  ; Наш опкод.
.text:3901970A                push    offset aType_3  ; "type"
.text:3901970F                call    edx
.text:39019711                pop    esi
.text:39019712                mov    esp, ebp
.text:39019714                pop    ebp
.text:39019715                retn    4
.text:39019718 ; ---------------------------------------------------------------------------
.text:39019718
.text:39019718 loc_39019718:                          ; CODE XREF: sub_390196E0+18j
.text:39019718                mov    eax, [ecx]
.text:3901971A                mov    eax, [eax+40h]
.text:3901971D                lea    edx, [ebp+var_4]
.text:39019720                push    edx
.text:39019721                push    offset aType_3  ; "type"
.text:39019726                call    eax
.text:39019728                movzx  ecx, word ptr [ebp+var_4]
.text:3901972C                mov    [esi+4], ecx
.text:3901972F                pop    esi
.text:39019730                mov    esp, ebp
.text:39019732                pop    ebp
.text:39019733                retn    4
.text:39019733 sub_390196E0    endp

Через этот метод проходят все пакеты. Кто владеет отладчиком лучше чем дизассемблером, могут попытать своё счастье здесь. Это виртуальный метод пакета. На входе в метод в ecx лежит пакет(если я ничего не перепутал, но даже если перепутал - посмотрите, он где-то рядом), первое его поле это указатель на vtable. Опкод отмечен комментарием.

luxtau 21.02.2014 10:34

Re: ArcheAge Опкоды
 
Забавно читать :) Эти "откровения" можно почерпнуть из книги Inside the C++ Object Model или просто из практики реверса.

Цитата:

К слову о методах. Первый возвращает класс пакета (я табличку выше постил).
Если ты о "dd offset const X2::CAEnterWorldPacket", то это не метод, а ссылка на RTTI класса.

Цитата:

Интересны 2 ссылки на vtable. Очевидно, что одна из них (а в нашем случае, так вообще обе) указывают сюда из конструктора.
Да, потому что в конструкторе в указатель объекта записывается ссылка на его тип.

Цитата:

Пакет создаётся на стеке и сразу уходит в обработку.
boost::bind


Цитата:

Есть ещё вариантик, может кому покажется более простым.
А вот тут вопрос — этот метод вызывается для всех пакетов при регистрации, или при обработке пакета? Если первое, то можно сдампить, если второе, то надо ждать, пока все пакеты пройдут :(

ЗЫ: Сам я пока не ковырял АА, всё в раздумьях — стоит ли она того или просто запастись попкорном :)

MadHacker 21.02.2014 10:50

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

Сообщение от luxtau (Сообщение 353509)
Забавно читать :) Эти "откровения" можно почерпнуть из книги Inside the C++ Object Model или просто из практики реверса.

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


Цитата:

Сообщение от luxtau (Сообщение 353509)
Если ты о "dd offset const X2::CAEnterWorldPacket", то это не метод, а ссылка на RTTI класса.

Я кажется вполне русским языком написал, что первый метод в vtable.

Цитата:

Сообщение от luxtau (Сообщение 353509)
boost::bind

Маловероятно. Просто создаётся на стеке и уходит в сериализатор. Они все унаследованы от базы клиент серверных пакетов своего типа.

Цитата:

Сообщение от luxtau (Сообщение 353509)
А вот тут вопрос — этот метод вызывается для всех пакетов при регистрации, или при обработке пакета? Если первое, то можно сдампить, если второе, то надо ждать, пока все пакеты пройдут :(

При отправке пакета на сервер. Естественно пока все пройдут а ещё и дубликаты убирать.

luxtau 21.02.2014 11:00

Re: ArcheAge Опкоды
 
Оффтоп, но:

Цитата:

Данная заметка для тех, кто не успел набрать практику реверса, но жаждит получить клиентские опкоды.
А зачем? Чисто философский вопрос — зачем толпы скрипт-киддисов? Не логичнее ли заняться либо эмулятором, либо приватными/платными вещами типа JF, AA bot или что-то в этом роде?

MadHacker 21.02.2014 11:35

Re: ArcheAge Опкоды
 
Мне нужно чтоб некоторые вещи были массовыми.

xTz 21.02.2014 17:08

Re: ArcheAge Опкоды
 
Я без практики реверса вытащил все пакеты и оп коды + реверснул структуры с помощи иды

MadHacker 12.03.2014 15:27

Re: ArcheAge Опкоды
 
Тема заглохла?
А я вот вытащил опкоды клиентские. И собрал все вытащенные опкоды в кучу.
Выложил тут: https://github.com/MadHacker666/aainfo
А вот C2W выкладывать пока не стал. почти 300 пакетов. Озвереть можно руками собирать коды, а автоматизировать... Вообще как оказалось можно. Потом примерно десяток пакетов надо будет руками допилить. В основной массе конструкторов опкод пишется сразу после vtable.
Список C2W пакетов выложу если в паблике появится больше информации о протоколе. Ну или ещё чего нибудь интересное.

nikes 12.03.2014 15:35

Re: ArcheAge Опкоды
 
MadHacker, не мог бы ты дать клиент без Themida так как увы но очень мешает работать.

MadHacker 12.03.2014 16:00

Re: ArcheAge Опкоды
 
А я её не снимал. Мне она не мешает.

vigorian 12.03.2014 18:57

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

Сообщение от MadHacker (Сообщение 356251)
А я её не снимал. Мне она не мешает.

Здравствуйте,не могли бы вы выложить весь список опкодов? или распакованные dll x2game,x2common ,ну или ehsvc.dll тогда я бы прыгал от радости,пытался распаковать скриптом lcf at, скрипт глючит на iat,хотя от теры нормально распаковывал.Пишу бота,да и сегодня узнал что заблочили германию,буду писать так сказать на шару.

MadHacker 12.03.2014 21:05

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

Сообщение от vigorian (Сообщение 356260)
Здравствуйте,не могли бы вы выложить весь список опкодов?
...

Цитата:

Сообщение от MadHacker (Сообщение 356249)
Список C2W пакетов выложу если в паблике появится больше информации о протоколе. Ну или ещё чего нибудь интересное.

А распаковкой я не занимаюсь. Оно само благополучно распаковывается при загрузке.

xTz 12.03.2014 22:31

Re: ArcheAge Опкоды
 
просто дамп делайте и колупайте

MadHacker 13.03.2014 15:35

Re: ArcheAge Опкоды
 
Кажется я приблизился к разгадке байта отвечающего за сжатие в пакете.
В честь этого события залиты C2W пакеты.

Hint 13.03.2014 18:00

Re: ArcheAge Опкоды
 
Спасибо, но интереснее было бы узнать про этот байт :) До него еще руки не дошли.

MadHacker 13.03.2014 18:51

Re: ArcheAge Опкоды
 
сначала убедюсь, что я прав :)

Добавлено через 1 час 15 минут
Мде. Под отладчиком оптимизм спал. Там что-то более сложное.

MadHacker 14.03.2014 23:40

Re: ArcheAge Опкоды
 
Ну чтож. Почти победа.
Остались незначительные детали, но тайна второго байта разгадана.
И так. World и proxy пакеты у нас имеют вид
DD 01 XX XX
0xDD - пока я не нашёл где оно используется. Точнее пока я возился со следующим байтом на стартовых пакетах коннекта это значение никем не использовалось. Надо смотреть в исходящих пакетах кто его пишет.
01 - Частично MHard был прав. Это фрагмент опкода. Он определяет глобальный тип пакета.
0x01 - W2C пакеты
0x02 - Proxy пакеты
Дальше веселее. Значения больше означают что в пакете есть сжатие. К сожалению все вызовы виртуальные и не имея в отладке такого пакета разобраться проблематично. там вообще много мутного происходит.
Ну и дальше опкод.

Вобщем диспатчится всё тут (осторожно, код не причёсан), все совпадения считать случайными. Код из crynetwork.dll по базе 0x39501000.
 
.text:3952E829 CompressByteDispath proc near           ; CODE XREF: ClientNub__dispath+62p
.text:3952E829                 mov     eax, offset sub_39548249
.text:3952E82E                 call    set_SEH
.text:3952E833                 mov     eax, 50014h
.text:3952E838                 call    sub_39545C30
.text:3952E83D                 push    ebx
.text:3952E83E                 mov     ebx, [ebp+8]
.text:3952E841                 push    esi
.text:3952E842                 push    edi
.text:3952E843                 mov     esi, edx
.text:3952E845                 mov     edi, ecx
.text:3952E847                 mov     ecx, [esi+14h]
.text:3952E84A                 test    ecx, ecx
.text:3952E84C                 jz      loc_3952E96D
.text:3952E852                 movzx   eax, byte ptr [ebx]
.text:3952E855                 mov     al, ds:byte_3956A7F0[eax] ;забыл посмотреть что там за таблица...
.text:3952E85B                 mov     [ebp+0Bh], al                   ;0x01 и 0x02 не меняются
.text:3952E85E                 lea     eax, [ebp-1Ch]
.text:3952E861                 call    sub_3951F44A
.text:3952E866                 and     dword ptr [ebp-4], 0
.text:3952E86A                 movzx   eax, byte ptr [ebp+0Bh]  ;отсюда идёт набор ifов на тип пакета.
.text:3952E86E                 dec     eax
.text:3952E86F                 jz      worldpck
.text:3952E875                 dec     eax
.text:3952E876                 jz      proxypck
.text:3952E87C                 dec     eax
.text:3952E87D                 jz      short __3
.text:3952E87F                 dec     eax
.text:3952E880                 jnz     __4             ; >4
.text:3952E886                 mov     dword ptr [ebp+8], 40000h ; ==4
.text:3952E88D                 cmp     edi, 3
.text:3952E890                 jnb     short loc_3952E89A
.text:3952E892                 push    eax
.text:3952E893                 push    offset aDecompressMpSi ; "decompress-mp-size"
.text:3952E898                 jmp     short decompress
.text:3952E89A ; ---------------------------------------------------------------------------
.text:3952E89A
.text:3952E89A loc_3952E89A:                           ; CODE XREF: CompressByteDispath+67j
.text:3952E89A                 movzx   eax, word ptr [ebx+1]
.text:3952E89E                 mov     [ebp-10h], eax
.text:3952E8A1                 lea     eax, [ebp+8]
.text:3952E8A4                 push    eax
.text:3952E8A5                 lea     eax, [ebp-50020h]
.text:3952E8AB                 push    eax
.text:3952E8AC                 add     ebx, 3
.text:3952E8AF                 add     edi, 0FFFFFFFDh
.text:3952E8B2                 push    ebx
.text:3952E8B3                 call    sub_3952DB09
.text:3952E8B8                 add     esp, 0Ch
.text:3952E8BB                 test    al, al
.text:3952E8BD                 jnz     short loc_3952E8C8
.text:3952E8BF                 push    0
.text:3952E8C1                 push    offset aDecompressMpBo ; "decompress-mp-body"
.text:3952E8C6                 jmp     short decompress
.text:3952E8C8 ; ---------------------------------------------------------------------------
.text:3952E8C8
.text:3952E8C8 loc_3952E8C8:                           ; CODE XREF: CompressByteDispath+94j
.text:3952E8C8                 push    dword ptr [ebp+8]
.text:3952E8CB                 mov     edi, [esi+14h]
.text:3952E8CE                 push    dword ptr [ebp-10h]
.text:3952E8D1                 lea     eax, [ebp-50020h]
.text:3952E8D7                 call    sub_3952AF74
.text:3952E8DC                 jmp     short __4
.text:3952E8DE ; ---------------------------------------------------------------------------
.text:3952E8DE
.text:3952E8DE __3:                                    ; CODE XREF: CompressByteDispath+54j
.text:3952E8DE                 mov     ecx, [esi+10h]
.text:3952E8E1                 lea     eax, [ebp+8]
.text:3952E8E4                 push    eax
.text:3952E8E5                 lea     eax, [ebp-10020h]
.text:3952E8EB                 push    eax
.text:3952E8EC                 inc     ebx
.text:3952E8ED                 lea     eax, [edi-1]
.text:3952E8F0                 push    ebx
.text:3952E8F1                 mov     dword ptr [ebp+8], 0FFFEh
.text:3952E8F8                 call    sub_3952DB5B
.text:3952E8FD                 add     esp, 0Ch
.text:3952E900                 test    al, al
.text:3952E902                 jnz     short loc_3952E916
.text:3952E904                 push    0
.text:3952E906                 push    offset aDecompressMv ; "decompress-mv"
.text:3952E90B
.text:3952E90B decompress:                             ; CODE XREF: CompressByteDispath+6Fj
.text:3952E90B                                         ; CompressByteDispath+9Dj
.text:3952E90B                 mov     eax, [esi]
.text:3952E90D                 push    0Dh
.text:3952E90F                 mov     ecx, esi
.text:3952E911                 call    dword ptr [eax+34h]
.text:3952E914                 jmp     short __4
.text:3952E916 ; ---------------------------------------------------------------------------
.text:3952E916
.text:3952E916 loc_3952E916:                           ; CODE XREF: CompressByteDispath+D9j
.text:3952E916                 mov     eax, [esi+14h]
.text:3952E919                 mov     ecx, [eax+2Ch]
.text:3952E91C                 mov     eax, [ecx]
.text:3952E91E                 call    dword ptr [eax+20h]
.text:3952E921                 mov     edx, [ebp+8]
.text:3952E924                 lea     eax, [ebp-10020h]
.text:3952E92A                 jmp     short loc_3952E953
.text:3952E92C ; ---------------------------------------------------------------------------
.text:3952E92C
.text:3952E92C proxypck:                               ; CODE XREF: CompressByteDispath+4Dj
.text:3952E92C                 push    dword ptr [esi+14h]
.text:3952E92F                 lea     ecx, [edi-1]
.text:3952E932                 lea     eax, [ebx+1]
.text:3952E935                 call    Proxy_pck_dispath  ;функция диспетчеризует прокси пакеты
.text:3952E93A                 jmp     short __4
.text:3952E93C ; ---------------------------------------------------------------------------
.text:3952E93C
.text:3952E93C worldpck:                               ; CODE XREF: CompressByteDispath+46j
.text:3952E93C                 lea     eax, [ebx+1]
.text:3952E93F                 movzx   ecx, word ptr [eax]
.text:3952E942                 test    ecx, ecx                      ;не ноль после подключения
.text:3952E944                 jnz     short loc_3952E950
.text:3952E946                 lea     ecx, [edi-1]
.text:3952E949                 call    EnterWorldResponeDispath ;Обработка пакета W2C 0x00;
.text:3952E94E                 jmp     short __4
.text:3952E950 ; ---------------------------------------------------------------------------
.text:3952E950
.text:3952E950 loc_3952E950:                           ; CODE XREF: CompressByteDispath+11Bj
.text:3952E950                 lea     edx, [edi-1]
.text:3952E953
.text:3952E953 loc_3952E953:                           ; CODE XREF: CompressByteDispath+101j
.text:3952E953                 mov     esi, [esi+14h]
.text:3952E956                 call    DispathW2C   ; диспетчеризация W2C пакетов
.text:3952E95B
.text:3952E95B __4:                                    ; CODE XREF: CompressByteDispath+57j
.text:3952E95B                                         ; CompressByteDispath+B3j ...
.text:3952E95B                 or      dword ptr [ebp-4], 0FFFFFFFFh
.text:3952E95F                 mov     eax, [ebp-1Ch]
.text:3952E962                 lea     ecx, [ebp-18h]
.text:3952E965                 and     eax, 0FFFFFFFCh
.text:3952E968                 push    ecx
.text:3952E969                 call    dword ptr [eax+4]
.text:3952E96C                 pop     ecx
.text:3952E96D
.text:3952E96D loc_3952E96D:                           ; CODE XREF: CompressByteDispath+23j
.text:3952E96D                 mov     ecx, [ebp-0Ch]
.text:3952E970                 pop     edi
.text:3952E971                 pop     esi
.text:3952E972                 mov     large fs:0, ecx
.text:3952E979                 pop     ebx
.text:3952E97A                 leave
.text:3952E97B                 retn    4
.text:3952E97B CompressByteDispath endp
 
Code: ASM

xTz 15.03.2014 09:07

Re: ArcheAge Опкоды
 
Java вариант

Код:

private static Inflater inflater3 = new Inflater(true);
    @Override
    public CryptResult decrypt(byte[] raw, packetDirection dir) {
        if (dir == packetDirection.serverPacket && raw[1] == (byte) 0x04) {
            Inflater inflater = new Inflater(true);
            int size = raw[2];
            byte[] potentialInit = Arrays.copyOfRange(raw, 4, raw.length);
            byte[] buffer = new byte[32768];
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream(raw.length);
            outputStream.write(raw[0]);
            try {
                outputStream.write(new byte[]{1});
            } catch (IOException ex) {
                Logger.getLogger(ArcheageGameCBTCrypter.class.getName()).log(Level.SEVERE, null, ex);
            }
            int len = potentialInit.length;
            int off = 0;
            while (!inflater.finished()) {
                try {

                    if (inflater.needsInput()) {
                        int part;

                        if (len < 1) {
                            break;
                        }
                        //part = (len < 84 ? len : 84);
                        part = len;
                        inflater.setInput(potentialInit, off, part);
                        off += part;
                        len -= part;
                  }
                    int count = inflater.inflate(buffer);
                    outputStream.write(buffer, 0, count);
                } catch (DataFormatException ex) {
                    System.out.println("Packet decompression error: "+ex.getMessage());
                    return new CryptResult(raw, size);
                }
            }
            try {
                outputStream.close();
            } catch (IOException ex) {
            }
            System.out.println(size);
            return new CryptResult(outputStream.toByteArray(), size);
        }
        else if (dir == packetDirection.serverPacket && raw[1] == (byte) 0x03) {
            byte[] potentialInit = Arrays.copyOfRange(raw, 2, raw.length);
            byte[] buffer = new byte[32768];
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream(raw.length);
            outputStream.write(raw[0]);
            try {
                outputStream.write(new byte[]{1});
            } catch (IOException ex) {
                Logger.getLogger(ArcheageGameCBTCrypter.class.getName()).log(Level.SEVERE, null, ex);
            }
            int len = potentialInit.length;
            int off = 0;
            while (!inflater3.finished()) {
                try {

                    if (inflater3.needsInput()) {
                        int part;

                        if (len < 1) {
                            break;
                        }
                        //part = (len < 84 ? len : 84);
                        part = len;
                        inflater3.setInput(potentialInit, off, part);
                        off += part;
                        len -= part;
                  }
                    int count = inflater3.inflate(buffer);
                    outputStream.write(buffer, 0, count);
                } catch (DataFormatException ex) {
                    System.out.println("Packet decompression error: "+ex.getMessage());
                    return new CryptResult(raw, 1);
                }
            }
            try {
                outputStream.close();
            } catch (IOException ex) {
            }
            return new CryptResult(outputStream.toByteArray(), 1);
        }
        return new CryptResult(raw, 1);
    }


Onax 15.03.2014 18:27

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

Сообщение от xTz (Сообщение 356645)
Java вариант

в случае 0x4...кто такой size?
в одном пакете сжато несколько других чтоль?
ну взял пакет 1783 байт, распаковал до 5кб
взял 28 байт - а остальное куда?
после этого size не вижу ничего пригодного в распакованных данных
типа 00 00 52 BF 00 00, т.е ни намека на длину/опкод
но данные там реально есть т.е распаковано всё верно (видны utf8 строки типа "Пугало" и т.п)
//
дык тут похоже еще один формат
три разных пакета(S>C DD 04) разной длины в распакованном виде
http://s43.radikal.ru/i101/1403/e9/621d742e475c.png
и дальше до конца тоже самое, отличия только в определенных местах
может это конечно списки одинаковых пакетов с разными данными

xTz 15.03.2014 20:38

Re: ArcheAge Опкоды
 
сжимаются несколько пакетов в один


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

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