Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
1) вопрос простой где клиент хранит структры пакетов, тоесть клиент должен ведь знать сколько байт читать например:
writeC(type.getId());
writeD(itemsCount);
writeC(0);
writeH(startPage);
writeH(brokerItems.length);
for (BrokerItem item : brokerItems) {
writeItemInfo(item);
}
клиент точно понимает какие врайты за что отвечают где найти просто структуру что бы понять сколько байт требуется для пакета там будет и порядок их, и то что он ждет впринципе так хоть методом тыка можно хоть что то узнать.
спасибо!
В IDA (Interactive Disassembler) открываем Engine.dll (если чистый, если под темидой - дампаем в мире игры (через PE Tools) и открываем его).
После чего ждем пока IDA изучает DLL...
Когда закончили - переходим в View - Open Subviews - Strings.
В окшке тыкаем ПКМ и там нужно выбрать "Setup" ну и включить строки "C-Style (32 bits)".
Снимаете темиду, восстанавливаете импорты/экспорты и смотрите список экспортируемых функций у класса UNetworkHandler
Clientpackets в понимании l2j.
Для serverpackets делаем поиск по "(Receive)"
Так же можно активировать консоль в клиенте (правим л2 ини, вводим команды на дебаг и показ консоли), в ней будут логгироваться все пакеты и большинство данных, которые прочитаны/записаны.
By KilRoy:
Добавлю:
Так же, чуть ниже данных хендлеров - располагаются функции обработки серверных пакетов(Можно найти и достать прямиком из таблицы пакетов)
Таблица пакетов и ее порядок...
* Дополнительно можно попробовать пройтись вот этим по DLL в IDA, но это на свой вкус:
Мой древний наивный скрипт для IDA. Делает ренейм функций на основе добродушно предоставленных эксепшенов в клиентских dll типа NWindow.dll. Проверялся на IDA 9.3, вроде и на 8 работал(но это не точно)
Как пользоваться:
0. Открываете, например, nwindow.dll, ждете пока пройдет фул анализ от IDA
1. Если у вас корректно подружен питон с идой, то просто
И выбираете скачанный скрипт как py файл
2. Скрипт стартует и переименовывает функции где смог дотянуться
3. Если хотите...
Кстати там проблема с отображением имен может быть... Там по сути в функции чтения серверных пакетов, нужно определить данные, после чего пробежаться по ним и обновить.
Вот у меня условно такое было: sub_205E13D0(*(_DWORD *)(a1 + 72), a2, &dword_20C5F290, v22);
И IDA разобрала функцию как - int sub_205E13D0(va_list a1, int a2, int a3, ...)
Там нужно тыкнуть ПКМ на "int a3", после чего нажать на "Set Ivar Type..."
Указываем там char* format, после чего переходим по таким местам &dword_20C5F290 (2 раза мышкой) и тыкаем "А" (английскую разуемеется).
После этого наш условный sub_205E13D0(*(_DWORD *)(a1 + 72), a2, &dword_20C5F290, v22); превращается на sub_205E13D0(*(_DWORD *)(a1 + 72), a2, "h", v22);
В IDA (Interactive Disassembler) открываем Engine.dll (если чистый, если под темидой - дампаем в мире игры (через PE Tools) и открываем его).
После чего ждем пока IDA изучает DLL...
Когда закончили - переходим в View - Open Subviews - Strings.
В окшке тыкаем ПКМ и там нужно выбрать "Setup" ну и включить строки "C-Style (32 bits)".
Снимаете темиду, восстанавливаете импорты/экспорты и смотрите список экспортируемых функций у класса UNetworkHandler
Clientpackets в понимании l2j.
Для serverpackets делаем поиск по "(Receive)"
Так же можно активировать консоль в клиенте (правим л2 ини, вводим команды на дебаг и показ консоли), в ней будут логгироваться все пакеты и большинство данных, которые прочитаны/записаны.
By KilRoy:
Добавлю:
Так же, чуть ниже данных хендлеров - располагаются функции обработки серверных пакетов(Можно найти и достать прямиком из таблицы пакетов)
Таблица пакетов и ее порядок...
* Дополнительно можно попробовать пройтись вот этим по DLL в IDA, но это на свой вкус:
Мой древний наивный скрипт для IDA. Делает ренейм функций на основе добродушно предоставленных эксепшенов в клиентских dll типа NWindow.dll. Проверялся на IDA 9.3, вроде и на 8 работал(но это не точно)
Как пользоваться:
0. Открываете, например, nwindow.dll, ждете пока пройдет фул анализ от IDA
1. Если у вас корректно подружен питон с идой, то просто
И выбираете скачанный скрипт как py файл
2. Скрипт стартует и переименовывает функции где смог дотянуться
3. Если хотите...
Кстати там проблема с отображением имен может быть... Там по сути в функции чтения серверных пакетов, нужно определить данные, после чего пробежаться по ним и обновить.
Вот у меня условно такое было: sub_205E13D0(*(_DWORD *)(a1 + 72), a2, &dword_20C5F290, v22);
И IDA разобрала функцию как - int sub_205E13D0(va_list a1, int a2, int a3, ...)
Там нужно тыкнуть ПКМ на "int a3", после чего нажать на "Set Ivar Type..." Посмотреть вложение 96780
Указываем там char* format, после чего переходим по таким местам &dword_20C5F290 (2 раза мышкой) и тыкаем "А" (английскую разуемеется).
После этого наш условный sub_205E13D0(*(_DWORD *)(a1 + 72), a2, &dword_20C5F290, v22); превращается на sub_205E13D0(*(_DWORD *)(a1 + 72), a2, "h", v22);
Доброго времени стуок, были проведены следующие операции:
1)Был снят дамп клиента(game.dll) с помощью x64dbg
2)Обошли Themida с помощью плагина Scylla
3)И этот дамп был проанализирован в IDA
Собственно получил вот это:
(в данном конкретном случае рассмотрим пакет SM_BROKER_SERVICE)
Objective-C:
__int64 __fastcall sub_59CEB320(__int64 a1, __int64 a2)
{
signed __int64 v2; // r8
__int64 result; // rax
char v4; // cl
int v5; // er11
char v6; // dl
__int64 v7; // r10
__int64 v8; // r9
__int64 v9; // r8
v2 = *(_QWORD *)(a2 + 24) + *(signed int *)(a2 + 32) + 1i64;
result = *(unsigned __int8 *)(*(_QWORD *)(a2 + 24) + *(signed int *)(a2 + 32));
switch ( (_DWORD)result )
{
case 0:
result = sub_59CEB440(a1, (int *)v2);
break;
case 1:
result = sub_59CEB780(a1, v2);
break;
case 2:
result = sub_5965BA80(
a1,
(unsigned int)*(char *)(*(_QWORD *)(a2 + 24) + *(signed int *)(a2 + 32) + 1i64),
*(unsigned int *)(*(_QWORD *)(a2 + 24) + *(signed int *)(a2 + 32) + 2i64),
*(_QWORD *)(*(_QWORD *)(a2 + 24) + *(signed int *)(a2 + 32) + 6i64));
break;
case 3:
result = sub_59CEBAC0(a1, v2);
break;
case 4:
result = sub_59CEBD50(a1, v2);
break;
case 5:
result = sub_59CEBEF0(a1, v2);
break;
case 6:
if ( !*(_BYTE *)v2 )
result = sub_59B761E0(a1);
break;
case 7:
v4 = *(_BYTE *)v2;
v5 = *(_DWORD *)(*(_QWORD *)(a2 + 24) + *(signed int *)(a2 + 32) + 2i64);
v6 = *(_BYTE *)(*(_QWORD *)(a2 + 24) + *(signed int *)(a2 + 32) + 14i64);
v7 = *(_QWORD *)(v2 + 22);
v8 = *(_QWORD *)(v2 + 14);
v9 = *(_QWORD *)(v2 + 5);
result = sub_59AECD00(1145446400i64);
break;
default:
return result;
}
return result;
}
казалось бы структура похожа на то что ожидает клиент, но есть некоторые проблемы с поиском предметов(в некоторых вкладках) в брокере и не показывает иконку упаковки на предмете в окне поиска, казалось бы что проблема в структуре
ItemInfoBlob.newBlobEntry(ItemBlobType.MANA_SOCKETS, null, item).writeThisBlob(getBuf());
но последние поля как имя продавца и сплитселл читаются адекватно,а при попытках поменять струкутуру блоба натыкаешься на вылет игры либо некорректное отображение предметов в брокере
другие серверы в качестве доноров не смогли помочь (идентичной и более ранних версий), как и снифф актуальной(рабочей) версии эмулятора
сравнение сниффов было буквально проверено по байтам с нашей структурой
собственно разницы там не было
Вопросы:
Где ошибка? В стратегии починки пакета( не тот инструментарий либо иду не достаточно глубоко )?
Насколько Scylla вообще способна обходить защиту которую имеет клиент Aion?
Допустим я знаю размер и примерную структуру пакета у меня вообще есть возможно узнать какие данные ожидает клиент?
Если есть некоторые рекомендации по извлечению информации из клиента касательно структуры пакетов, то я буду очень благодарен.
но есть некоторые проблемы с поиском предметов(в некоторых вкладках) в брокере и не показывает иконку упаковки на предмете в окне поиска, казалось бы что проблема в структуре
Возможно у вас дело не в пакете даже, думаю стоит посмотреть BrokerItemMask - существует ли вообще данная маска в вашей сборке для упаковки (если нет то добавить). Так же в статиках (item_templates.xml) посмотреть как была спарсена упаковка.
Вопросы:
Где ошибка? В стратегии починки пакета( не тот инструментарий либо иду не достаточно глубоко )?
Насколько Scylla вообще способна обходить защиту которую имеет клиент Aion?
Допустим я знаю размер и примерную структуру пакета у меня вообще есть возможно узнать какие данные ожидает клиент?
Если есть некоторые рекомендации по извлечению информации из клиента касательно структуры пакетов, то я буду очень благодарен.
Самый лучший способ всё таки сниф, а сейчас при наличии оф сборки 5.8 есть хорошая возможность отснифать все желаемые пакеты.
Но не забывайте, что и снифер придется переделать протоколы под 5.8 (поменять внутри структуру).
Ставьте сборку на отдельной машине, а другим компом собирайте инфу (в локалке может не получится).
Доброго времени стуок, были проведены следующие операции:
1)Был снят дамп клиента(game.dll) с помощью x64dbg
2)Обошли Themida с помощью плагина Scylla
3)И этот дамп был проанализирован в IDA
Собственно получил вот это:
(в данном конкретном случае рассмотрим пакет SM_BROKER_SERVICE)
Objective-C:
__int64 __fastcall sub_59CEB320(__int64 a1, __int64 a2)
{
signed __int64 v2; // r8
__int64 result; // rax
char v4; // cl
int v5; // er11
char v6; // dl
__int64 v7; // r10
__int64 v8; // r9
__int64 v9; // r8
v2 = *(_QWORD *)(a2 + 24) + *(signed int *)(a2 + 32) + 1i64;
result = *(unsigned __int8 *)(*(_QWORD *)(a2 + 24) + *(signed int *)(a2 + 32));
switch ( (_DWORD)result )
{
case 0:
result = sub_59CEB440(a1, (int *)v2);
break;
case 1:
result = sub_59CEB780(a1, v2);
break;
case 2:
result = sub_5965BA80(
a1,
(unsigned int)*(char *)(*(_QWORD *)(a2 + 24) + *(signed int *)(a2 + 32) + 1i64),
*(unsigned int *)(*(_QWORD *)(a2 + 24) + *(signed int *)(a2 + 32) + 2i64),
*(_QWORD *)(*(_QWORD *)(a2 + 24) + *(signed int *)(a2 + 32) + 6i64));
break;
case 3:
result = sub_59CEBAC0(a1, v2);
break;
case 4:
result = sub_59CEBD50(a1, v2);
break;
case 5:
result = sub_59CEBEF0(a1, v2);
break;
case 6:
if ( !*(_BYTE *)v2 )
result = sub_59B761E0(a1);
break;
case 7:
v4 = *(_BYTE *)v2;
v5 = *(_DWORD *)(*(_QWORD *)(a2 + 24) + *(signed int *)(a2 + 32) + 2i64);
v6 = *(_BYTE *)(*(_QWORD *)(a2 + 24) + *(signed int *)(a2 + 32) + 14i64);
v7 = *(_QWORD *)(v2 + 22);
v8 = *(_QWORD *)(v2 + 14);
v9 = *(_QWORD *)(v2 + 5);
result = sub_59AECD00(1145446400i64);
break;
default:
return result;
}
return result;
}
казалось бы структура похожа на то что ожидает клиент, но есть некоторые проблемы с поиском предметов(в некоторых вкладках) в брокере и не показывает иконку упаковки на предмете в окне поиска, казалось бы что проблема в структуре
ItemInfoBlob.newBlobEntry(ItemBlobType.MANA_SOCKETS, null, item).writeThisBlob(getBuf());
но последние поля как имя продавца и сплитселл читаются адекватно,а при попытках поменять струкутуру блоба натыкаешься на вылет игры либо некорректное отображение предметов в брокере
другие серверы в качестве доноров не смогли помочь (идентичной и более ранних версий), как и снифф актуальной(рабочей) версии эмулятора
сравнение сниффов было буквально проверено по байтам с нашей структурой
собственно разницы там не было
Вопросы:
Где ошибка? В стратегии починки пакета( не тот инструментарий либо иду не достаточно глубоко )?
Насколько Scylla вообще способна обходить защиту которую имеет клиент Aion?
Допустим я знаю размер и примерную структуру пакета у меня вообще есть возможно узнать какие данные ожидает клиент?
Если есть некоторые рекомендации по извлечению информации из клиента касательно структуры пакетов, то я буду очень благодарен.
Доброго времени стуок, были проведены следующие операции:
1)Был снят дамп клиента(game.dll) с помощью x64dbg
2)Обошли Themida с помощью плагина Scylla
3)И этот дамп был проанализирован в IDA
Доброго времени стуок, были проведены следующие операции:
1)Был снят дамп клиента(game.dll) с помощью x64dbg
2)Обошли Themida с помощью плагина Scylla
3)И этот дамп был проанализирован в IDA
Собственно получил вот это:
(в данном конкретном случае рассмотрим пакет SM_BROKER_SERVICE)
Objective-C:
__int64 __fastcall sub_59CEB320(__int64 a1, __int64 a2)
{
signed __int64 v2; // r8
__int64 result; // rax
char v4; // cl
int v5; // er11
char v6; // dl
__int64 v7; // r10
__int64 v8; // r9
__int64 v9; // r8
v2 = *(_QWORD *)(a2 + 24) + *(signed int *)(a2 + 32) + 1i64;
result = *(unsigned __int8 *)(*(_QWORD *)(a2 + 24) + *(signed int *)(a2 + 32));
switch ( (_DWORD)result )
{
case 0:
result = sub_59CEB440(a1, (int *)v2);
break;
case 1:
result = sub_59CEB780(a1, v2);
break;
case 2:
result = sub_5965BA80(
a1,
(unsigned int)*(char *)(*(_QWORD *)(a2 + 24) + *(signed int *)(a2 + 32) + 1i64),
*(unsigned int *)(*(_QWORD *)(a2 + 24) + *(signed int *)(a2 + 32) + 2i64),
*(_QWORD *)(*(_QWORD *)(a2 + 24) + *(signed int *)(a2 + 32) + 6i64));
break;
case 3:
result = sub_59CEBAC0(a1, v2);
break;
case 4:
result = sub_59CEBD50(a1, v2);
break;
case 5:
result = sub_59CEBEF0(a1, v2);
break;
case 6:
if ( !*(_BYTE *)v2 )
result = sub_59B761E0(a1);
break;
case 7:
v4 = *(_BYTE *)v2;
v5 = *(_DWORD *)(*(_QWORD *)(a2 + 24) + *(signed int *)(a2 + 32) + 2i64);
v6 = *(_BYTE *)(*(_QWORD *)(a2 + 24) + *(signed int *)(a2 + 32) + 14i64);
v7 = *(_QWORD *)(v2 + 22);
v8 = *(_QWORD *)(v2 + 14);
v9 = *(_QWORD *)(v2 + 5);
result = sub_59AECD00(1145446400i64);
break;
default:
return result;
}
return result;
}
казалось бы структура похожа на то что ожидает клиент, но есть некоторые проблемы с поиском предметов(в некоторых вкладках) в брокере и не показывает иконку упаковки на предмете в окне поиска, казалось бы что проблема в структуре
ItemInfoBlob.newBlobEntry(ItemBlobType.MANA_SOCKETS, null, item).writeThisBlob(getBuf());
но последние поля как имя продавца и сплитселл читаются адекватно,а при попытках поменять струкутуру блоба натыкаешься на вылет игры либо некорректное отображение предметов в брокере
другие серверы в качестве доноров не смогли помочь (идентичной и более ранних версий), как и снифф актуальной(рабочей) версии эмулятора
сравнение сниффов было буквально проверено по байтам с нашей структурой
собственно разницы там не было
Вопросы:
Где ошибка? В стратегии починки пакета( не тот инструментарий либо иду не достаточно глубоко )?
Насколько Scylla вообще способна обходить защиту которую имеет клиент Aion?
Допустим я знаю размер и примерную структуру пакета у меня вообще есть возможно узнать какие данные ожидает клиент?
Если есть некоторые рекомендации по извлечению информации из клиента касательно структуры пакетов, то я буду очень благодарен.
А ты не пробовал запустить IDA Pro 9 подключить AI и поставить точку останова на эту функцию? А дальше скриптом полный дамп всех переменных которые тебе нужны. Ну и вообще чего она тебе скажет, если ты снял "Был снят дамп клиента(game.dll) с помощью x64dbg" то все должно заработать
В IDA (Interactive Disassembler) открываем Engine.dll (если чистый, если под темидой - дампаем в мире игры (через PE Tools) и открываем его).
После чего ждем пока IDA изучает DLL...
Когда закончили - переходим в View - Open Subviews - Strings.
В окшке тыкаем ПКМ и там нужно выбрать "Setup" ну и включить строки "C-Style (32 bits)".
Снимаете темиду, восстанавливаете импорты/экспорты и смотрите список экспортируемых функций у класса UNetworkHandler
Clientpackets в понимании l2j.
Для serverpackets делаем поиск по "(Receive)"
Так же можно активировать консоль в клиенте (правим л2 ини, вводим команды на дебаг и показ консоли), в ней будут логгироваться все пакеты и большинство данных, которые прочитаны/записаны.
By KilRoy:
Добавлю:
Так же, чуть ниже данных хендлеров - располагаются функции обработки серверных пакетов(Можно найти и достать прямиком из таблицы пакетов)
Таблица пакетов и ее порядок...
* Дополнительно можно попробовать пройтись вот этим по DLL в IDA, но это на свой вкус:
Мой древний наивный скрипт для IDA. Делает ренейм функций на основе добродушно предоставленных эксепшенов в клиентских dll типа NWindow.dll. Проверялся на IDA 9.3, вроде и на 8 работал(но это не точно)
Как пользоваться:
0. Открываете, например, nwindow.dll, ждете пока пройдет фул анализ от IDA
1. Если у вас корректно подружен питон с идой, то просто
И выбираете скачанный скрипт как py файл
2. Скрипт стартует и переименовывает функции где смог дотянуться
3. Если хотите...
Кстати там проблема с отображением имен может быть... Там по сути в функции чтения серверных пакетов, нужно определить данные, после чего пробежаться по ним и обновить.
Вот у меня условно такое было: sub_205E13D0(*(_DWORD *)(a1 + 72), a2, &dword_20C5F290, v22);
И IDA разобрала функцию как - int sub_205E13D0(va_list a1, int a2, int a3, ...)
Там нужно тыкнуть ПКМ на "int a3", после чего нажать на "Set Ivar Type..." Посмотреть вложение 96780
Указываем там char* format, после чего переходим по таким местам &dword_20C5F290 (2 раза мышкой) и тыкаем "А" (английскую разуемеется).
После этого наш условный sub_205E13D0(*(_DWORD *)(a1 + 72), a2, &dword_20C5F290, v22); превращается на sub_205E13D0(*(_DWORD *)(a1 + 72), a2, "h", v22);
На данном сайте используются файлы cookie, чтобы персонализировать содержимое и сохранить Ваш вход в систему, если Вы зарегистрируетесь.
Продолжая использовать этот сайт, Вы соглашаетесь на использование наших файлов cookie.