Вопрос Оффсеты, что возвращают и чем являются в client.dll

Начинающий
Статус
Оффлайн
Регистрация
22 Фев 2025
Сообщения
15
Реакции[?]
0
Поинты[?]
0
У меня такой вопрос. В как таковые оффсеты в кс дампере это что? Это классы какие-нибудь или его экзепляры, методы? Как я понял это сами классы, но почему в самой client.dll они отличаются названиями? И как правильно относительно этих классов смещаться?

Еще если кому-нибудь нечем заниматься могли бы провести краткий экскурс по оффсетам или скинуть актуальную статью и т.д?



Источник оффсетов:
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Начинающий
Статус
Оффлайн
Регистрация
16 Сен 2024
Сообщения
2
Реакции[?]
0
Поинты[?]
0
всё просто, находишь нужный оффсет(client.dll или в других) например здоровье, m_iHealth = 0x344; // int32. int32 это uint32_t в c++, он в namespace C_BaseEntity, (надо знать, обычно там всё самое важное )находишь его в offsets.hpp, это dwLocalPlayerPawn = 0x188AF10; я покажу пример для internal чтения памяти:
uintptr_t client = (uintptr_t)GetModuleHandle("client.dll");
uintptr_t localPawn = (uintptr_t)(client + 0x188AF10);
int health = (int)(localPawn + 0x344);

первое в скобках это класс для разыменовывания(чтения/записи)
второе тоже в скобках это адрес(uintptr_t)

лучше использовать reintpretent_cast<>()
 
Начинающий
Статус
Оффлайн
Регистрация
22 Фев 2025
Сообщения
15
Реакции[?]
0
Поинты[?]
0
всё просто, находишь нужный оффсет(client.dll или в других) например здоровье, m_iHealth = 0x344; // int32. int32 это uint32_t в c++, он в namespace C_BaseEntity, (надо знать, обычно там всё самое важное )находишь его в offsets.hpp, это dwLocalPlayerPawn = 0x188AF10; я покажу пример для internal чтения памяти:
uintptr_t client = (uintptr_t)GetModuleHandle("client.dll");
uintptr_t localPawn = (uintptr_t)(client + 0x188AF10);
int health = (int)(localPawn + 0x344);

первое в скобках это класс для разыменовывания(чтения/записи)
второе тоже в скобках это адрес(uintptr_t)

лучше использовать reintpretent_cast<>()
А чем обусловлено то, что dwLocalPlayerPawn в client.dll является baseEntity? Или я что-то не так понял?
 
Начинающий
Статус
Оффлайн
Регистрация
22 Фев 2025
Сообщения
15
Реакции[?]
0
Поинты[?]
0
А чем обусловлено то, что dwLocalPlayerPawn в client.dll является baseEntity? Или я что-то не так понял?
И если все правильно понял мне самому надо в чит энжене проверять, что к чему? Или есть более удобный способ?
 
Начинающий
Статус
Оффлайн
Регистрация
16 Сен 2024
Сообщения
2
Реакции[?]
0
Поинты[?]
0
тут знать надо, читай форумы и поймёш что для pawn что для controller
 
Начинающий
Статус
Оффлайн
Регистрация
2 Сен 2023
Сообщения
75
Реакции[?]
5
Поинты[?]
5K
А чем обусловлено то, что dwLocalPlayerPawn в client.dll является baseEntity? Или я что-то не так понял?
Тут есть логика,
У класса C_CSPlayerPawn( на него ведёт оффсет dwLocalPlayerPawn) есть парент C_CSPlayerPawnBase, в свою очередь у него есть парент C_BasePlayerPawn, у него есть парент C_BaseModelEntity, а уже у него есть парент C_BaseEntity.

Вот и получается что павн включает в себя оффсет на здоровье, из за того что включает в себя C_BaseEntity, но и контроллер включает в себя этот оффсет.

Вот тебе схемы:
C_CSPlayerPawn->C_CSPlayerPawnBase->C_BasePlayerPawn->C_BaseModelEntity->C_BaseEntity->CEntityInstance
CCSPlayerController->CBasePlayerController->C_BaseModelEntity->C_BaseEntity->CEntityInstance
 
Girl
Пользователь
Статус
Оффлайн
Регистрация
11 Ноя 2019
Сообщения
294
Реакции[?]
46
Поинты[?]
3K
Оффсет (ака смещение) это расстояние от базы (начала чего либо) до конкретного элемента. Допустим в слове "random" оффсетом до буквы "r" будет являться 0, а до буквы "m" - 5

В программировании при создании переменной выделяется память размером типа переменной
Допустим есть у нас такая структура:
C:
struct object
{
    int a;
    int b;
    int c;
};
содержит 3 значения с типом int, а размер int 4 байта, значит размер структуры (и в дальнейшем объекта) будет 3 * 4 = 12 байт
Теперь создаем объект, получаем его адрес, допустим 0x100, это наша база, от этого адреса лежат наши 12 байт, теперь можем получать значения по оффсету:
a = 0x100 + 0x0 = 0x100;
b = 0x100 + 0x4 = 0x104;
c = 0x100 + 0x8 = 0x108;

В играх все тоже самое, допустим игрок:
C++:
class Player
{
private:
    char* nick;
    int team;
    int health;
    int mana;
}
Игра создала этот объект по адресу 0x100, осталось найти оффсет до хп допустим
Первое значение char*, это адрес, и его размер 4 или 8 байт в зависимости от разрядности (x32/x64)
Остальные int 4 байта, получается размер структуры 4/8 + 4 + 4 + 4 = 16/20 байт, а оффсеты к значениям:
nick = 0x100 + 0x0 = 0x100;
team = 0x100 + 0x4/0x8 = 0x104/0x108;
health = 0x100 + 0x4/0x8 + 0x4 = 0x108/0x10C

int32 это uint32_t в c++
каким хуем в общем то? int32 == int32 (int32_t) и никак иначе

int health = (int)(localPawn + 0x344);
health будет содержать адрес хп кастованный к инту, нужно разыменовывать:
C:
int health = *(int*) (localPawn + 0x344);

А чем обусловлено то, что dwLocalPlayerPawn в client.dll является baseEntity?
реверсом
 
Начинающий
Статус
Оффлайн
Регистрация
2 Сен 2023
Сообщения
75
Реакции[?]
5
Поинты[?]
5K
dwLocalPlayerPawn никаким образом не может вести на C_BaseEntity, он ведёт на C_CSPlayerPawn.

А почему там содержаться переменные из C_BaseEntity я писал выше
 
Начинающий
Статус
Оффлайн
Регистрация
22 Фев 2025
Сообщения
15
Реакции[?]
0
Поинты[?]
0
Тут есть логика,
У класса C_CSPlayerPawn( на него ведёт оффсет dwLocalPlayerPawn) есть парент C_CSPlayerPawnBase, в свою очередь у него есть парент C_BasePlayerPawn, у него есть парент C_BaseModelEntity, а уже у него есть парент C_BaseEntity.

Вот и получается что павн включает в себя оффсет на здоровье, из за того что включает в себя C_BaseEntity, но и контроллер включает в себя этот оффсет.

Вот тебе схемы:
C_CSPlayerPawn->C_CSPlayerPawnBase->C_BasePlayerPawn->C_BaseModelEntity->C_BaseEntity->CEntityInstance
CCSPlayerController->CBasePlayerController->C_BaseModelEntity->C_BaseEntity->CEntityInstance
Теперь понял, спасибо
Не до конца понятно, почему у dwLocalPlayerPawn не одинаковое название с классом C_CSPlayerPawn? С чем это связано? Так просто прописали в самой кске или какой-то прикол с реверсом?
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
2 Сен 2023
Сообщения
75
Реакции[?]
5
Поинты[?]
5K
Теперь понял, спасибо

Не до конца понятно, почему у dwLocalPlayerPawn не одинаковое название с классом C_CSPlayerPawn? С чем это связано? Так просто прописали в самой кске или какой-то прикол с реверсом?
dwLocalPlayerPawn:
dw - DWORD (Double Word)
Local - локальный
Player - игрок
Pawn - пешка
Это назвал создатель дампера так,
C_CSPlayerPawn это класс из игры(ClassInformer для поиска)
 
Начинающий
Статус
Оффлайн
Регистрация
22 Фев 2025
Сообщения
15
Реакции[?]
0
Поинты[?]
0
dwLocalPlayerPawn:
dw - DWORD (Double Word)
Local - локальный
Player - игрок
Pawn - пешка
Это назвал создатель дампера так,
C_CSPlayerPawn это класс из игры(ClassInformer для поиска)
Типо плагин сам имена для оффсетов назначает?
 
Начинающий
Статус
Оффлайн
Регистрация
22 Фев 2025
Сообщения
15
Реакции[?]
0
Поинты[?]
0
C_CSPlayerPawn->C_CSPlayerPawnBase->C_BasePlayerPawn->C_BaseModelEntity->C_BaseEntity->CEntityInstance
CCSPlayerController->CBasePlayerController->C_BaseModelEntity->C_BaseEntity->CEntityInstance
вопросик, если я хочу сместиться относительно C_CSPlayerPawnBase то мне нужно: client.dll + C_BasePlayerPawn + C_CSPlayerPawnBase
или просто client.dll + C_CSPlayerPawnBase?
 
Начинающий
Статус
Оффлайн
Регистрация
2 Сен 2023
Сообщения
75
Реакции[?]
5
Поинты[?]
5K
вопросик, если я хочу сместиться относительно C_CSPlayerPawnBase то мне нужно: client.dll + C_BasePlayerPawn + C_CSPlayerPawnBase
или просто client.dll + C_CSPlayerPawnBase?
C_CSPlayerPawnBase содержит и так все оффсеты которые стоят правее чем он в моей схеме
Типо плагин сам имена для оффсетов назначает?
название оффсетов(m_iHelath) и классов хранятся в виде строк в client.dll
 
Начинающий
Статус
Оффлайн
Регистрация
22 Фев 2025
Сообщения
15
Реакции[?]
0
Поинты[?]
0
C_CSPlayerPawnBase содержит и так все оффсеты которые стоят правее чем он в моей схеме

название оффсетов(m_iHelath) и классов хранятся в виде строк в client.dll
а, сорян, я просто интуитивно относительно стрелочек подумал, что родитель это
C_CSPlayerPawn
client.dll + dwLocalPlayerPawn + и что-то еще
так получается так верно будет?
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
22 Фев 2025
Сообщения
15
Реакции[?]
0
Поинты[?]
0
и еще:
C_CSPlayerPawn->C_CSPlayerPawnBase->C_BasePlayerPawn->C_BaseModelEntity->C_BaseEntity->CEntityInstance == dwLocalPlayerPawn->C_CSPlayerPawnBase->C_BasePlayerPawn->C_BaseModelEntity->C_BaseEntity->CEntityInstance
Я могу так расписать в c++?
 
Начинающий
Статус
Оффлайн
Регистрация
22 Фев 2025
Сообщения
15
Реакции[?]
0
Поинты[?]
0
C_CSPlayerPawnBase содержит и так все оффсеты которые стоят правее чем он в моей схеме
Я уже не знаю, как правильно спорсить, но ты имеешь ввиду, что я могу смещаться по переменным классов родителей просто через dwLocalPlayerPawn?
 
Начинающий
Статус
Оффлайн
Регистрация
2 Сен 2023
Сообщения
75
Реакции[?]
5
Поинты[?]
5K
Я уже не знаю, как правильно спорсить, но ты имеешь ввиду, что я могу смещаться по переменным классов родителей просто через dwLocalPlayerPawn?
расскажу легче, ты находишь dwLocalPlayerPawn в client.dll и ты можешь использовать оффсеты из всех классов родителей без каких либо мануипуляций.

пример:
auto pLocalPawn = dwLocalPlayerPawn + client.dll;
auto переменная = pLocalPawn + оффсет из любого класса родителя;
 
Начинающий
Статус
Оффлайн
Регистрация
22 Фев 2025
Сообщения
15
Реакции[?]
0
Поинты[?]
0
расскажу легче, ты находишь dwLocalPlayerPawn в client.dll и ты можешь использовать оффсеты из всех классов родителей без каких либо мануипуляций.

пример:
auto pLocalPawn = dwLocalPlayerPawn + client.dll;
auto переменная = pLocalPawn + оффсет из любого класса родителя;
Дааааа, спасибо, я это и спрашивал
 
Сверху Снизу