Перейти к содержимому
La2Base
Главная
ЗагрузкиВикиФорумFAQ
Поиск
ruen
Регистрация Войти
ГлавнаяФайлыВикиВойти
  • Главная
  • Загрузки
  • Вики
  • FAQ
  • Обратная связь
  • О проекте
  • Правила
  • Конфиденциальность
  • Условия использования

© 2026 la2base.com · Все права защищены

ruen
Форум/Модификация клиентской части/Мод к Клиенту
Поиск

Мод к Клиенту

16 ответов362 просмотровСейчас просматривают: 1
Макс
Макс

Пользователь

Участник

Постов: 78

На форуме с: 21.04.2008

Репутация: +8

Рейтинг: 0

· 30.03.2009, 23:22

Видел на какомто сервере отображение онлайна в правом верхнем углу игрового окна-как ето сделать? И + от себя так ...отображение времени суток каждому игроку его время, его часового пояса итд...

0
Макс
Макс

Пользователь

Участник

Постов: 78

На форуме с: 21.04.2008

Репутация: +8

Рейтинг: 0

· 31.03.2009, 08:15

Кто нить подскажет?

0
R
rast

Пользователь

Участник

Постов: 29

На форуме с: 08.04.2008

Рейтинг: 0

· 31.03.2009, 13:49

На abyss.ru такое, как это сделать - модификация клиента с запросом из баззы...
Думаю что это пару строчек скриптов в .DAT файле клиента, но мне кажеться всем будет лень это делать!

0
В народе-Лёха, в сети-Берс
В народе-Лёха, в сети-Берс

Пользователь

Ветеран

Постов: 988

На форуме с: 22.06.2007

Репутация: +462

Рейтинг: 0

· 31.03.2009, 17:43

это не пара строчек в dat файлах, это подключение в клиент (реверс клиента) левой библиотеки, отвечающей за показ того-же онлайна, которая будет обращаться к скрипту или прямо к базе (что небезопасно).

— Ушёл на пенсию...

0
hambit
hambit

Пользователь

Участник

Постов: 80

На форуме с: 17.07.2007

Репутация: +425

Рейтинг: 0

· 01.04.2009, 05:23

Сомневаюсь что там идет обращение прямиком к базе ) Скорее там просто идет прием пакета от сервера который передает инфу о онлайне ) Поэтому кроме модификации клиентской части надо ещё и ядро ковырнуть )

0
В народе-Лёха, в сети-Берс
В народе-Лёха, в сети-Берс

Пользователь

Ветеран

Постов: 988

На форуме с: 22.06.2007

Репутация: +462

Рейтинг: 0

· 01.04.2009, 06:26

Возможно, по незнанию явы в ядро незакапывался, и со снифферами неигрался, чтобы посмотреть какие сервер пакеты шлёт)

— Ушёл на пенсию...

0
Respect
Respect

Автор

Бывалый

Постов: 198

На форуме с: 11.09.2008

Рейтинг: 0

· 01.04.2009, 16:46

_http://www.postpacific.com/showthread.php?t=13043

добиваю л2, как могу...

0
Макс
Макс

Пользователь

Участник

Постов: 78

На форуме с: 21.04.2008

Репутация: +8

Рейтинг: 0

· 13.04.2009, 12:00

Если кому не влом то помогите реализовать в грации пат2 ту инфу что по ссылке выше !

0
Макс
Макс

Пользователь

Участник

Постов: 78

На форуме с: 21.04.2008

Репутация: +8

Рейтинг: 0

· 13.04.2009, 12:35

rast: На abyss.ru такое, как это сделать - модификация клиента с запросом из баззы...
Думаю что это пару строчек скриптов в .DAT файле клиента, но мне кажеться всем будет лень это делать!

Да именно как на Абе - там вверху в правом углу отображается, если кто поможет буду спс клацать оч долго)
Опыта в вижуал С++ нету совсем, только поверхостное ознакомление..

0
Макс
Макс

Пользователь

Участник

Постов: 78

На форуме с: 21.04.2008

Репутация: +8

Рейтинг: 0

· 18.04.2009, 22:23

ХЕЛП!

0
mihey888
mihey888

Пользователь

Бывалый

Постов: 358

На форуме с: 27.06.2007

Репутация: +64

Рейтинг: 0

· 18.04.2009, 22:42

Респект, если нетрудно, выложи копию странчки, а то доступ закрыт.

0
Макс
Макс

Пользователь

Участник

Постов: 78

На форуме с: 21.04.2008

Репутация: +8

Рейтинг: 0

· 18.04.2009, 23:08

Цитата
Радар своими руками /16.12.2008/

Введение

В этой статье описывается создание "радара" - кода отображающего других игроков внутри клиента ла2. В ней рассмотрены следующие вопросы: рисование в окне клиента, получение информации об нпс и игроках хранящейся клиенте, перехват входящего пакета, перехват исходящего пакета, отправка пакета клиенту.
В свое время, когда я начинал разбираться с клиентом, я искал подобную статью, так и не нашел. Ну а раз ее нет - значит ее надо написать чтобы она была. Для понимания этой статьи необходимы базовые знания по работе клиента ла2, реверсированию и программированию. Все примеры относятся к клиенту C6, но я думаю клиенты ла2 принципиально не отличаются друг от друга.

1. Общая информация о клиенте ла2

Для начала небольшая вводная об устройстве клиента ла2. Он состоит из 1 .exe модуля и нескольких длл выполняющих строго определенные функции - GUI (nwindow.dll), движок (engine.dll), общие вспомогательные функции (core.dll). Клиент сделан на основе движка unreal engine, написан на VC++ с применением ООП. Длл экспортируют практически все методы основных классов, имена декорированы (mangling), также экспортируются таблицы методов (vftable).

2. Рисование

Основная функция радара - рисовать цели в окне клиента. Для этого нужны функции рисования, и перехват нужного участка кода клиента для вызова кода рисования радара.
Клиент для рисования как правило использует класс FCanvasUtil. Для его использования надо создать экземпляр объекта, после рисования - уничтожить его. Примерный размер объекта не более 256 байт (точное значение неизвестно). В классе FCanvasUtil есть одна нормальная функция рисования
void __thiscall FCanvasUtil::DrawLine(float x1, float y1, float x2,float y2,class FColor color,int unk) ,
где x1..y2 - четыре экранные координаты в пикселах,
color - цвет, dword 0xSSRRGGBB (SS - Saturation),
unk - неизвестный параметр, обычно равнен нулю.
Точки можно рисовать короткими штрихами, окружности аппроксимировать отрезками (или пунктиром).
Рисовать надо вместе с клиентом, в одном из методов xxx::Render(), так чтобы картинка радара рисовалась последней (верхней), порядок вызова методов клиентом неизвестен, но рисование после FPlayerSceneNode::Render() позволяет нарисовать радар правильно.

3. Получение информации о целях

Все объекты на карте поделены в клиенте на категории ("живые",лут,...) и хранятся в нектором списке. Для получения "живых" объектов (игроки,НПС) используется метод
struct User * __thiscall UNetworkHandler::GetNextCreature(float Radius,int PrevID) ,
где Radius - радиус поиска, PrevID - ИД предыдущей цели.
Метод возвращает указатель на структуру содержащую информацию о цели (см. приложение). Метод может возвращать ноль, видимо при отсутствии целей вообще. Метод можно вызывать бесконечное число раз, видимо список объектов цикличен, для того чтобы определить конец списка надо проверять повторы ИД возвращаемых целей. Перебор целей можно начинать как с PrevID=0 так и PrevID=-1 .

4. Получение информации о своем персонаже - перехват S->C пакета

Для получения структуры User по ID объекта надо вызвать метод
struct User * __thiscall UNetworkHandler::GetUser(int ID) .
ИД своего персонажа можно получить перехватив S->C пакет UserInfoPacket (#4). Теоретически этот ID можно получить в клиенте по статическому адресу, но перехват пакета очевиднее.
S->C пакеты обрабатываются в клиенте следующим образом:
В отдельном потоке, в цикле, клиент принимает пакеты вызывая ws2_32.recv(), расшифровывает их, добавляет в очередь пакетов методом
UNetworkHandler::AddNetworkQueue(NetworkPacket *) .
Структура NetworkPacket содержит отдельно ID пакета, размер данных пакета (без ID), данные пакета (без ID).
В методе UNetworkHandler::Tick(float) клиент достает пакеты из очереди методом
UNetworkHandler::DispatchNetworkQueue(NetworkPacke t * *) .
Затем по ID пакета вызывается обработчик пакета, по указателю таблицы обработчиков пакетов. Размер элемента таблицы равен 0x104 байтам - указатель на обработчик и UNICODE-имя пакета. Прототип обработчика пакета:
typedef void (__cdecl TPacketHandler)(UNetworkHandler *,char *data);
где data - указатель на данные пакета, без его ID.
Обработчик пакета дизассемблирует пакет согласно его формату, вызывает соответствующий метод UGameEngine::OnXXX() и записывает информацию о пакете во внутренний лог клиента.
Метод UGameEngine::OnXXX вызывает события в GUI или в движке клиента.
Очевидно, что перехватывать одиночный пакет удобно подменяя указатель на обработчик пакета или указатель на метод UGameEngine в его таблице методов.

5. Управление настройками радара - перехват C->S пакета и отправка пакета клиенту

Внутри клиента можно организовать достаточно удобный интерфейс используя HTML встроенный в клиент.
Для показа диалогового окна пользователю, надо отправить клиенту пакет с HTML-кодом, методом
int __thiscall UGameEngine::OnNpcHtmlMessage(struct User *npc,unsigned short *html,int unk) ,
где npc - указатель на структуру User НПС отправившего сообщение, может быть равен нулю,
html - указатель на UNICIDE-строку с HTML-кодом,
unk - неизвестный параметр, обычно равен нулю.
Если ввод данных производится кнопками, то для перехвата ввода необходимо перехватить пакет RequestBypassToServer. Клиент отправляет пакеты следующим образом:
GUI или движок клиента вызывают соответствующий метод UNetworkHandler, например
int __thiscall UNetworkHandler::RequestBypassToServer(class L2ParamStack &) .
Этот метод передает формат пакета и его данные в неэкспортируемую функцию отправки пакета
void __cdecl SendPacket(UNetworkHandler*,char*,...) .
Функция отправки пакета ассемблирует пакет в буфер согласно его формату, шифрует и отправляет на сервер через ws2_32.send() .
Для перехвата одиночного отправляемого пакета удобно перехватить указатель на метод в таблице методов UNetworkHandler.

Заключение

Я не выкладываю сам исходник радара, в его коде нет ничего сложного, и имея информацию изложенную в этой статье его можно достаточно быстро собрать.
Эта статья больше посвящена частям клиента относящимся к пакетной части клиента. Графическая часть рассмотрена вскользь без какого-либо разбора, движок клиента только упоминается, совсем не рассмотрены GUI и остальные части клиента. Буду рад если кто-нибудь дополнит эту статью или выложит что-то новое. Возможно есть смысл перевести ее на английский.

Приложение. Структуры клиента (С6)
Code:
struct User
{
int _zunk1_12[2];
int user_type; //ZERO for player
int _zunk1_34[2];
int unk_npc_spec;
int id;
unsigned short name[0x30/2];
int race;
int _zunk2;
int _xunk3;
int lvl;
int _xunk4;
int _zunk5;
int states[6];
int hp_max;
int hp;
int mp_max;
int mp;
int _xunk68[3];
int wear[14];
char _zunk9[0xC0];
int Color;
char _unk10[0x70];
APawn *Pawn;
int _zunk11[3];
int _xunk12;
int sp;
int accuracy_;
int critical;
int _xunk13;
int _xunk14;
int patk;
int evasion_;
int matk;
int mdef;
int castspd;
char _unk15[0x6C];
int atkspd;
char _unk16[0x14];
int cp_max;
int cp;
//current size=0x2CC, real size = 0x380
};

class APawn
{
char _unk[0x1BC]; //...
public:
FVector Location;
//...
};

class FVector
{
public:
float X,Y,Z;
};
----------------------------------------------------
[C] GoldFinch

Спасибо
Arrowdoger за помощь в написании и тестировании радара
Разработчикам BSFG (Abyss) за их радар и его кривую защиту. Кстати код у binkw32.dll тоже хреновый :)



Вот такая ЖЭоПЭа

0
Макс
Макс

Пользователь

Участник

Постов: 78

На форуме с: 21.04.2008

Репутация: +8

Рейтинг: 0

· 19.04.2009, 02:04

Ну так какие соображения на этот счёт?

0
sandex
sandex

Пользователь

Бывалый

Постов: 137

На форуме с: 24.01.2009

Репутация: +20

Рейтинг: 0

· 20.04.2009, 09:25

спасибо, оригинальная вещ

0
Макс
Макс

Пользователь

Участник

Постов: 78

На форуме с: 21.04.2008

Репутация: +8

Рейтинг: 0

· 20.04.2009, 09:56

А всётаки никто и не возьмётся приделать такую

Цитата
оригинальная вещ
?

0
Макс
Макс

Пользователь

Участник

Постов: 78

На форуме с: 21.04.2008

Репутация: +8

Рейтинг: 0

· 21.04.2009, 11:54

САМ ВАН ХЕЛП МИ??

0
Тема закрыта для ответов