separater
18.01.2018, 20:12
Некоторая инфа по новому клиенту BsfG. суть та же что и со старым, только новые смещения:
Класс
UNetworkHandler :: 0x20AC4374
ID нашего персонажа :: 0x20AC4370
Таблица с NPC\Игроками :: UNetworkHandler -> 0x25C
Размер таблицы :: UNetworkHandler -> 0x260
С перебором таблицы все как и ранее
// pTable - адрес таблицы
// pTableSize - размер таблицы
for (int i = 0; i < pTableSize; i++) {
int pUserID = mem::read<int>(pTable + (i * 0xC) + 0x4);
int pUser= mem::read<int>(pTable + (i * 0xC) + 0x8);
int UserClass= mem::read<int>(pObj + 0x4);
}
Основные смещения в классе User
0x8 - Уникальный ID
0xC - npc_grp ID, у игроков - 0
0x90 - ник
0x10 \ 0x14 - ХП персонажа (текущ\макс)
0xF0 \ 0xF4 - ЦП персонажа (текущ\макс)
0x50C - ссылка на класс AActor (инфа по модели\координаты и т.д.)
Основные смещения в классе AActor
0x188 - координаты XYZ
0x1CC - ускорение по осям XYZ (можно вычислить текущую скорость)
0x3C -> 0x43C - уникальный ID персонажа\NPC, который в таргете у текущего User'а
По функциям:
Передвижение:
0x2055cea0
typedef void (__thiscall *MTL) (int UNetworkHandler, int AActor, float x_move, float y_move, float z_move, float x_cur, float y_cur, float z_cur, int AActor_WTF, int unk0, int unk1, int unk2);
// AActor - естественно нашего перса, там как двигаем мы себя
// AActor_WTF - фиг знает что это, но ссылка на него находится по адресу "AActor + 0x40"
Выбор таргетов:
0x20549990
typedef int (__thiscall *Action)(int UNetworkHandler_this, int target_ID, float x, float y, float z, int Unk_zero);
Что угодно (функ. отправки пакета)
smackw32.dll + 0x262C0 (при обновлениях может меняться оффсет, сейчас 0x263B0) (да, мы запускаем не из Engine.dll, так как туда пакет уже зашифрованным заходит, а вот тут он в первозданном виде)
typedef void(__cdecl *SendPacket)(int pClass, char* pStrFormat, int iPacketID, ...);
// pClass находится по адресу "UNetworkHandler + 0x48"
// далее идет указатель на строку формата пакета
// далее на ID пакета
// далее зависит от того что за пакет отправляется
смотреть какому пакету какой "формат", и что там дальше передавать в аргументы при помощи отладчиков.
вот к примеру пакет "Action"
SendPacket(pClass, "cdddddc", 0x1F, _id, cX, cY, cZ, 0, 0);
// pClass - оговаривалось ранее
// "cdddddc" - формат, "c" - байт\чар (id пакета), d - dword, S - указатель на строку Unicode
// итого в аргементы-> байт (id пакета), 5 двордов и еще байт
// 0x1F - ID пакета Action
// _id - уникальный ID того, что нужно выделить\атаковать
// координаты
*Достаточно легко отлавливается и пакет на отправку сообщения в чат (но для каждого типа чата (трейд, шаут, приват, ...) свой пакет).
World to Screen
все так же как и в прошлый раз, вот новые смещения матриц:
// Registers:
//
// Name Reg Size
// --------------------- ----- ----
// WorldMatrix c237 4
// ViewMatrix c241 4
// ProjectionMatrix c245 4
единственное что - в опциях поотключать все эффекты, отражения и иличшайзеры картинки (визуально всеравно игра кал, но матрицы шатает)
Демонстрация
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
*Пример того как нужно ловить и дешифровать пакет:
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Класс
UNetworkHandler :: 0x20AC4374
ID нашего персонажа :: 0x20AC4370
Таблица с NPC\Игроками :: UNetworkHandler -> 0x25C
Размер таблицы :: UNetworkHandler -> 0x260
С перебором таблицы все как и ранее
// pTable - адрес таблицы
// pTableSize - размер таблицы
for (int i = 0; i < pTableSize; i++) {
int pUserID = mem::read<int>(pTable + (i * 0xC) + 0x4);
int pUser= mem::read<int>(pTable + (i * 0xC) + 0x8);
int UserClass= mem::read<int>(pObj + 0x4);
}
Основные смещения в классе User
0x8 - Уникальный ID
0xC - npc_grp ID, у игроков - 0
0x90 - ник
0x10 \ 0x14 - ХП персонажа (текущ\макс)
0xF0 \ 0xF4 - ЦП персонажа (текущ\макс)
0x50C - ссылка на класс AActor (инфа по модели\координаты и т.д.)
Основные смещения в классе AActor
0x188 - координаты XYZ
0x1CC - ускорение по осям XYZ (можно вычислить текущую скорость)
0x3C -> 0x43C - уникальный ID персонажа\NPC, который в таргете у текущего User'а
По функциям:
Передвижение:
0x2055cea0
typedef void (__thiscall *MTL) (int UNetworkHandler, int AActor, float x_move, float y_move, float z_move, float x_cur, float y_cur, float z_cur, int AActor_WTF, int unk0, int unk1, int unk2);
// AActor - естественно нашего перса, там как двигаем мы себя
// AActor_WTF - фиг знает что это, но ссылка на него находится по адресу "AActor + 0x40"
Выбор таргетов:
0x20549990
typedef int (__thiscall *Action)(int UNetworkHandler_this, int target_ID, float x, float y, float z, int Unk_zero);
Что угодно (функ. отправки пакета)
smackw32.dll + 0x262C0 (при обновлениях может меняться оффсет, сейчас 0x263B0) (да, мы запускаем не из Engine.dll, так как туда пакет уже зашифрованным заходит, а вот тут он в первозданном виде)
typedef void(__cdecl *SendPacket)(int pClass, char* pStrFormat, int iPacketID, ...);
// pClass находится по адресу "UNetworkHandler + 0x48"
// далее идет указатель на строку формата пакета
// далее на ID пакета
// далее зависит от того что за пакет отправляется
смотреть какому пакету какой "формат", и что там дальше передавать в аргументы при помощи отладчиков.
вот к примеру пакет "Action"
SendPacket(pClass, "cdddddc", 0x1F, _id, cX, cY, cZ, 0, 0);
// pClass - оговаривалось ранее
// "cdddddc" - формат, "c" - байт\чар (id пакета), d - dword, S - указатель на строку Unicode
// итого в аргементы-> байт (id пакета), 5 двордов и еще байт
// 0x1F - ID пакета Action
// _id - уникальный ID того, что нужно выделить\атаковать
// координаты
*Достаточно легко отлавливается и пакет на отправку сообщения в чат (но для каждого типа чата (трейд, шаут, приват, ...) свой пакет).
World to Screen
все так же как и в прошлый раз, вот новые смещения матриц:
// Registers:
//
// Name Reg Size
// --------------------- ----- ----
// WorldMatrix c237 4
// ViewMatrix c241 4
// ProjectionMatrix c245 4
единственное что - в опциях поотключать все эффекты, отражения и иличшайзеры картинки (визуально всеравно игра кал, но матрицы шатает)
Демонстрация
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
*Пример того как нужно ловить и дешифровать пакет:
[Ссылки могут видеть только зарегистрированные и активированные пользователи]