Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
ВопросОффсеты, что возвращают и чем являются в client.dll
У меня такой вопрос. В как таковые оффсеты в кс дампере это что? Это классы какие-нибудь или его экзепляры, методы? Как я понял это сами классы, но почему в самой client.dll они отличаются названиями? И как правильно относительно этих классов смещаться?
Еще если кому-нибудь нечем заниматься могли бы провести краткий экскурс по оффсетам или скинуть актуальную статью и т.д?
всё просто, находишь нужный оффсет(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)
всё просто, находишь нужный оффсет(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)
Тут есть логика,
У класса 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
Оффсет (ака смещение) это расстояние от базы (начала чего либо) до конкретного элемента. Допустим в слове "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
Тут есть логика,
У класса 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? С чем это связано? Так просто прописали в самой кске или какой-то прикол с реверсом?
Не до конца понятно, почему у dwLocalPlayerPawn не одинаковое название с классом C_CSPlayerPawn? С чем это связано? Так просто прописали в самой кске или какой-то прикол с реверсом?
dwLocalPlayerPawn:
dw - DWORD (Double Word)
Local - локальный
Player - игрок
Pawn - пешка
Это назвал создатель дампера так,
C_CSPlayerPawn это класс из игры(ClassInformer для поиска)
dwLocalPlayerPawn:
dw - DWORD (Double Word)
Local - локальный
Player - игрок
Pawn - пешка
Это назвал создатель дампера так,
C_CSPlayerPawn это класс из игры(ClassInformer для поиска)
вопросик, если я хочу сместиться относительно C_CSPlayerPawnBase то мне нужно: client.dll + C_BasePlayerPawn + C_CSPlayerPawnBase
или просто client.dll + C_CSPlayerPawnBase?
вопросик, если я хочу сместиться относительно C_CSPlayerPawnBase то мне нужно: client.dll + C_BasePlayerPawn + C_CSPlayerPawnBase
или просто client.dll + C_CSPlayerPawnBase?
и еще:
C_CSPlayerPawn->C_CSPlayerPawnBase->C_BasePlayerPawn->C_BaseModelEntity->C_BaseEntity->CEntityInstance == dwLocalPlayerPawn->C_CSPlayerPawnBase->C_BasePlayerPawn->C_BaseModelEntity->C_BaseEntity->CEntityInstance
Я могу так расписать в c++?