PDA

Просмотр полной версии : Основные сведения


xkor
12.09.2009, 17:01
Итак опишу тут основные сведения о взаимодействии клиента и гейм сервера AION (логин сервер пока трогать не будем)

Формат пакетов у AION во многом похож на Lineage II что вполне логично учитывая что обе игры создала одна компания.

Обязательная часть каждого пакета составляет 5 байт:

первые 2 байта - размер (как и в Lineage II)
далее идет 1 байт определяющий тип пакета
а вот с 4го байта начинаются отличия от линейки, в AION 4й байт определяет некую схему от которой зависит какому типу пакета будет соответствовать предыдущий (3й) байт, причем этот 4й байт похоже что постоянен для версии клеинта/сервера (но разный для входящих и исходящих пакетов)
и последний 5й байт повидимому нужен только для проверки правильности дешифровки и при правильной дешифровке всегда равен не 3му байту, тоесть если 3й равен 0x01, то 5й будет 0xFE


О шифровании напишу чуть поже...

xkor
12.09.2009, 17:03
123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123

Jes
13.09.2009, 12:05
всетаки заинтересовались! :)
опенсорс сервак http://aion-emu.com/
исходники http://my-svn.assembla.com/svn/aion-emu/

учим джаву ;)

русская группа http://aionemu.ru/
тулза для отлова пакетов
старая версия http://code.assembla.com/PacketSamurai/
новая версия(больше не используется- но там есть форматы пакетов)
http://my-svn.assembla.com/svn/aion-emu/tools 498 ревижен
подбрасуйте ссылки...

xkor
13.09.2009, 14:34
Jes, я эти ссылки хотел в разделе про сервак опубликовать...
кстати не знаешь почему в этих сорцах writeF на самом деле writeD?

GoldFinch
17.09.2009, 23:42
чтоб не пропадало, скину сюда инфу по xor-шифрованию в клиенте
[rce][aion] результаты реверсирования алгоритмов xor-шифрования клиента 1.5.*

Пакет S_KEY (id=0x48), приходящий клиенту от сервера,
содержит 32-разрядное значение для формирования начального ключа
DWORD keySeed;
Из данных этого пакета формируются начальные ключи для шифрования и дешифровки пакетов.

Алгоритм формирования начального 64-разрядного ключа (синтаксис С):
/* in: DWORD keySeed - 32-разрядное значение из пакета S_KEY
out: __int64 key - 64-разрядное значение начального ключа для приема и отправки пакетов
*/
__int64 key = ((keySeed - 0x3FF2CC87) ^ 0xCD92E451) + (0x87546CA1<<32);

Для шифрования пакета также используется дополнительный фиксированный ключ длиной 0x40 байт,
строка: nKO/WctQ0AVLbpzfBkS6NevDYT8ourG5CRlmdjyJ72aswx4EPq1UgZ hFMXH?3iI9
дамп:
00: 6E 4B 4F 2F 57 63 74 51 30 41 56 4C 62 70 7A 66 nKO/WctQ0AVLbpzf
10: 42 6B 53 36 4E 65 76 44 59 54 38 6F 75 72 47 35 BkS6NevDYT8ourG5
20: 43 52 6C 6D 64 6A 79 4A 37 32 61 73 77 78 34 45 CRlmdjyJ72aswx4E
30: 50 71 31 55 67 5A 68 46 4D 58 48 3F 33 69 49 39 Pq1UgZhFMXH?3iI9

Алгоритм шифрования буфера отправляемых пакетов (синтаксис С)

/* in: BYTE buf[] - буфер для шифрования,
size_t len - длина буфера,
BYTE key[8] - текущий ключ,
BYTE auxKey[0x40] - вспомогательный ключ.
out: зашифрованный буфер,
новый текущий ключ
*/
buf[0] ^= key[0];
for ( int i = 1; i < len; ++i )
buf[i] ^= buf[i - 1] ^ key[i & 7] ^ auxKey[i & 0x3F];
*(__int64*)key += len;

Алгоритм расшифровки буфера принятых пакетов (синтаксис С)

/* in: BYTE buf[] - буфер для расшифровки,
size_t len - длина буфера,
BYTE key[8] - текущий ключ,
BYTE auxKey[0x40] - вспомогательный ключ.
out: расшифрованный буфер,
новый текущий ключ
*/
for( int i = len; --i; )
buf[i] ^= buf[i - 1] ^ key[i & 7] ^ auxKey[i & 0x3F];
buf[0] ^= key[0];
*(__int64*)key += len;


Клиент аиона нормально работает под олькой, достаточно легко дампится.
Незначительная часть функций зачем-то накрыта ВМ фемиды.

Клиент содержит большое количество текстовых строк, в том числе отладочной информации и вывода в лог.
В отличие от клиента ла2 не содержит кучи экспортируемых функций, так что имена функций надо придумывать самому.
Код xor-шифрования пакета при отправке встроен в код формирования каждого пакета (inline однако).
Код xor-дешифровки пакета при приеме засунут в одну функцию.

xkor
18.09.2009, 00:43
Код xor-шифрования пакета при отправке встроен в код формирования каждого пакета (inline однако). сурово
Пакет S_KEY (id=0x48), приходящий клиенту от сервера, содержит 32-разрядное значение для формирования начального ключа DWORD keySeed; Из данных этого пакета формируются начальные ключи для шифрования и дешифровки пакетов. 48 эт помойму на корейском (или китайском) ОБТ, к сожалению в разных регионах разное значение 2го байта пакета и следовательно значение первого байта указывающего на S_KEY тоже разное...

GoldFinch
18.09.2009, 01:04
xkor, я реверсил европейский клиент
48 - id пакета - забито хардкодом в клиент


char __stdcall DispatchRecv(int a1)
{
/* .................................................. ...... */
if ( dword_1833CA48 )
return 0;
v2 = a1;
id = *(_BYTE *)(a1 + 12);
if ( id <= (signed int)0xC7u )
{
if ( id != 0xC7 )
{
switch ( id )
{
case 0x48:
v3 = "S_KEY";
goto doLogPacketName;
case 0:
v3 = "S_VERSION_CHECK";
goto doLogPacketName;
case 0xD:
v3 = "S_ENTER_WORLD_CHECK";
goto doLogPacketName;
case 0x17:
v3 = "S_WAIT_LIST";
goto doLogPacketName;
default:
goto processpacket;
}
goto processpacket;
}
v3 = "S_L2AUTH_LOGIN_CHECK";
goto doLogPacketName;
}
v4 = id - 0xC8;
if ( !v4 )
{
v3 = "S_CHARACTER_LIST";
goto doLogPacketName;
}
v5 = v4 - 0x1C;
if ( !v5 )
{
v3 = "S_VIRTUAL_AUTH";
goto doLogPacketName;
}
if ( v5 == 27 )
{
v3 = "S_RECONNECT_KEY";
doLogPacketName:
sprintf(&Dest, "[game] recv packet: %s", v3);
(*(int (__cdecl **)(int, char *))(*(_DWORD *)g_LoggerObj + 8))(g_LoggerObj, &Dest);
}
processpacket:
switch ( *(_BYTE *)(v2 + 12) )
{
case 0: // VERSION_CHECK
OnVersionCheck();
dword_1833CA58 = dword_17DEA158();
return 1;
case 0xC7: // L2AUTH_LOGIN_CHECK
OnL2AuthLoginCheck();
dword_1833CA58 = dword_17DEA158();
return 1;
case 0xE4: // VIRTUAL_AUTH
OnVirtualAuth();
dword_1833CA58 = dword_17DEA158();
return 1;
case 0xFF:
sub_17A76D00(
*(_BYTE *)(*(_DWORD *)(v2 + 16) + *(_DWORD *)(v2 + 20)),
*(_DWORD *)(*(_DWORD *)(v2 + 16) + *(_DWORD *)(v2 + 20) + 1));
dword_1833CA58 = dword_17DEA158();
return 1;
case 0xC8: // CHARACTER_LIST
OnCharacterList();
dword_1833CA58 = dword_17DEA158();
return 1;
case 0xD: // ENTER_WORLD_CHECK
OnEnterWorldChaeck();
dword_1833CA58 = dword_17DEA158();
return 1;
/* .................................................. ...... */
case 0x48: // S_KEY packet
OnKeyRecv((*(_DWORD *)(*(_DWORD *)(v2 + 20) + *(_DWORD *)(v2 + 16)) - 1072876679) ^ 0xCD92E451);
dword_1833CA58 = dword_17DEA158();
return 1;
/* .................................................. ...... */

xkor
18.09.2009, 01:16
GoldFinch, жесть, получается они там между ЗБТ и ОБТ ручками id всех пакетов меняли...

Jes
19.09.2009, 14:05
GoldFinch, жесть, получается они там между ЗБТ и ОБТ ручками id всех пакетов меняли...

нет - это обычный enum
пересортировали энум и фсе

Be3geBJIa3
10.10.2009, 21:33
Смотрю, совсем не развивается раздел.
Немного не по теме, может кто уже разобрался как сделать бесконечный зум, как в ла2. Вторую неделю копаю инет, даже упоминаний нет.

TAMBIK
10.10.2009, 22:46
Be3geBJIa3,
скинь ссылку где скачать
типа как в Л2 папку систем
а то хз я даж невтеме

Tekymse
10.10.2009, 23:16
Кто скажет. Есть ли смысл надеяться в ближайшем будущем (допустим, в начале следуюшего года) на платного или бесплатного бота под AION?)

xkor
10.10.2009, 23:30
Tekymse, а он нужен?)
заняться чтоль...

Tekymse
10.10.2009, 23:40
Tekymse, а он нужен?)

понятно) значит решили они избавить себя от этого гемороя с ботами :)

Be3geBJIa3
11.10.2009, 14:04
TAMBIK, если не в теме, тебе сюда "Реальная тема для TAMBIK" (http://video.bigmir.net/show/10384/)

xkor, ботов для аион, уже много, и платных и бесплатных.

Nicker
16.10.2009, 23:01
Пол руофф не чо не нашол(((

abyrvalg
13.11.2009, 08:26
да нужен :)

Bugsoft
20.11.2009, 06:19
aionbugs.ru - кто хочет занятся ботом свяжитесь со мной 455921 я помогу с сурсами и т.п. для айона.. много чего есть для разработчиков бота кто действтительно шарит а не личер - сброшу :)

Psycho
27.11.2009, 15:24
уу скоро ОБТ руофа айон )

Nemiroff
17.06.2010, 02:26
Был бы благодарен если бы ктото провел реверсирования алгоритмов xor-шифрования клиента 1.9

xkor
17.06.2010, 10:31
Nemiroff, а они чем то отличаются? у меня снифер (для aionon.ru) как на 1.5 работал так и с 1.9 пашет? только ID пакетов сменились, но они и в 1.5 часто менялись)

Nemiroff
17.06.2010, 17:03
ВОт этот момент то и больше интересует.. как определить способ расшифровки ид пакетов.

xkor
18.06.2010, 01:34
Nemiroff, ID зашифрованы так же как и остальная часть пакета, а как ID изменились по сравнению со старыми никаким алгоритмом не вычислишь ибо поменялись они тупо из за их переупорядочивания которое программеры сделали вручную совершенно случайно)

Nemiroff
18.06.2010, 02:51
Эх.. придется тогда всё ручками опять искать..

А что то подобное PacketSamurai но не на Java есть ?

xkor
18.06.2010, 14:16
Nemiroff, а пакетхак чем не подобное?