Вопрос Как получить entityList [CS2]

Забаненный
Статус
Оффлайн
Регистрация
22 Мар 2023
Сообщения
13
Реакции[?]
2
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как получить оффсет m_iEntityList? я так понимаю его больше не существует?
 
Начинающий
Статус
Оффлайн
Регистрация
1 Ноя 2022
Сообщения
14
Реакции[?]
11
Поинты[?]
0
PoC:
class CBaseEntity {
public:
    char pad_0x0000[0x7E0]; // 0x0000
    int32_t m_iHealth;      // 0x07E0
    // ...
};
 
const auto entity_list = *reinterpret_cast<uint64_t**>(client_base + 0x1519FD8);
 
for (auto i = 1; i <= MAX_PLAYERS; i++) {
    const auto entity_list_entry = entity_list[(i & 0x7FFF) >> 9];
 
    if (entity_list_entry == 0)
        continue;
 
    const auto entity = *reinterpret_cast<CBaseEntity**>(entity_list_entry + 120 * (i & 0x1FF));
 
    if (entity == nullptr)
        continue;
 
    printf("health: %d\n", entity->m_iHealth);
}
 
Забаненный
Статус
Оффлайн
Регистрация
22 Мар 2023
Сообщения
13
Реакции[?]
2
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
PoC:
class CBaseEntity {
public:
    char pad_0x0000[0x7E0]; // 0x0000
    int32_t m_iHealth;      // 0x07E0
    // ...
};

const auto entity_list = *reinterpret_cast<uint64_t**>(client_base + 0x1519FD8);

for (auto i = 1; i <= MAX_PLAYERS; i++) {
    const auto entity_list_entry = entity_list[(i & 0x7FFF) >> 9];

    if (entity_list_entry == 0)
        continue;

    const auto entity = *reinterpret_cast<CBaseEntity**>(entity_list_entry + 120 * (i & 0x1FF));

    if (entity == nullptr)
        continue;

    printf("health: %d\n", entity->m_iHealth);
}
0x1519FD8 это ты где взял?
 
Пользователь
Статус
Оффлайн
Регистрация
20 Янв 2022
Сообщения
182
Реакции[?]
40
Поинты[?]
25K
Забаненный
Статус
Оффлайн
Регистрация
22 Мар 2023
Сообщения
13
Реакции[?]
2
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Начинающий
Статус
Оффлайн
Регистрация
15 Мар 2020
Сообщения
48
Реакции[?]
8
Поинты[?]
0
1. Там она другая
2. const uint64_t* entity_list = *(uint64_t**) (GetModuleHandleA("client.dll") + 0x1519FD8);
что я делаю не так? (игра вылетает)
uintptr_t* entity_list = *(uintptr_t**) ((uintptr_t)GetModuleHandleA("client.dll") + 0x1519FD8);
так попробуй
 
Забаненный
Статус
Оффлайн
Регистрация
22 Мар 2023
Сообщения
13
Реакции[?]
2
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Забаненный
Статус
Оффлайн
Регистрация
22 Мар 2023
Сообщения
13
Реакции[?]
2
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
и ещё вопросик.
C++:
class CEntityIdentity {
    public:
        int32_t m_nameStringableIndex; // 0x14   
        CUtlSymbolLarge m_name; // 0x18   
        CUtlSymbolLarge m_designerName; // 0x20
        uint32_t m_flags; // 0x30
};

class CBaseEntity {
    public:
        char pad_0x0000[0x7E0]; // 0x0000
        int32_t m_iHealth;      // 0x07E0
        int32_t m_iMaxHealth;    // 0x29C
        CEntityIdentity* m_pEntity; // 0x10
};

const auto entity = (CBaseEntity*) (entity_list_entry + 120 * (i & 0x1FF));
if (entity == nullptr)
    continue;
std::cout << "name: " << entity->m_pEntity->m_name.String() << std::endl;
что здесь не так? вылетает на строке получения m_name
 
Ревёрсер среднего звена
Пользователь
Статус
Оффлайн
Регистрация
24 Ноя 2022
Сообщения
303
Реакции[?]
108
Поинты[?]
57K
и ещё вопросик.
C++:
class CEntityIdentity {
    public:
        int32_t m_nameStringableIndex; // 0x14  
        CUtlSymbolLarge m_name; // 0x18  
        CUtlSymbolLarge m_designerName; // 0x20
        uint32_t m_flags; // 0x30
};

class CBaseEntity {
    public:
        char pad_0x0000[0x7E0]; // 0x0000
        int32_t m_iHealth;      // 0x07E0
        int32_t m_iMaxHealth;    // 0x29C
        CEntityIdentity* m_pEntity; // 0x10
};

const auto entity = (CBaseEntity*) (entity_list_entry + 120 * (i & 0x1FF));
if (entity == nullptr)
    continue;
std::cout << "name: " << entity->m_pEntity->m_name.String() << std::endl;
что здесь не так? вылетает на строке получения m_name
Что с паддингом?
Почему m_pEntity с оффсетом 10 идёт аж после полей на оффсете 0x7CE?
Почему нет пада у айдентити, если поля начинаются с 0x14?
Сделайте геттеры нормальные, путаться не будете
 
Забаненный
Статус
Оффлайн
Регистрация
22 Мар 2023
Сообщения
13
Реакции[?]
2
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Что с паддингом?
Почему m_pEntity с оффсетом 10 идёт аж после полей на оффсете 0x7CE?
Почему нет пада у айдентити, если поля начинаются с 0x14?
Сделайте геттеры нормальные, путаться не будете
Пожалуйста, авторизуйтесь для просмотра ссылки.
(noad)
C++:
class CEntityInstance : public IHandleEntity
{
public:
    // MNetworkEnable
    // MNetworkPriority "56"
    CEntityIdentity* m_pEntity; // 0x10       
};
 
Ревёрсер среднего звена
Пользователь
Статус
Оффлайн
Регистрация
24 Ноя 2022
Сообщения
303
Реакции[?]
108
Поинты[?]
57K
Пожалуйста, авторизуйтесь для просмотра ссылки.
(noad)
C++:
class CEntityInstance : public IHandleEntity
{
public:
    // MNetworkEnable
    // MNetworkPriority "56"
    CEntityIdentity* m_pEntity; // 0x10      
};
Так там до этого идёт ещё одно поле + наследуется ещё какой-то класс(с витейблом, наверное)
Если уж оттуда пастить, то сохранять структуру спащенного, у тебя от комментариев оффсеты не пофиксятся
 
Забаненный
Статус
Оффлайн
Регистрация
22 Мар 2023
Сообщения
13
Реакции[?]
2
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Так там до этого идёт ещё одно поле + наследуется ещё какой-то класс(с витейблом, наверное)
Если уж оттуда пастить, то сохранять структуру спащенного, у тебя от комментариев оффсеты не пофиксятся
мб я не шарю, но новое поле многое меняет? спастил фулл entity оттуда, всё равно вылетает
 
Ревёрсер среднего звена
Пользователь
Статус
Оффлайн
Регистрация
24 Ноя 2022
Сообщения
303
Реакции[?]
108
Поинты[?]
57K
мб я не шарю, но новое поле многое меняет? спастил фулл entity оттуда, всё равно вылетает
Структура класса описывает то, как поля расположены в памяти
Т. е. они должны идти в правильном порядке
Опять же, сделай себе геттеры m_pEntity и m_iHealth/MaxHealth по оффсетам, пады долбить весьма неприятно, да и не все поля из дампа вообще где-либо нужны
Типа делаешь такой
Код:
template<typename T>
T Member(int offset) {
return *(T*)((uintptr_t)this + offset);
}
И потом такой ent->Member<CEntityIdentity>(0x10).m_name
Правда опять же класс айдентити у тебя тоже скопирован без пада и в таком случае никаких оффсетов в принципе нет
 
Забаненный
Статус
Оффлайн
Регистрация
22 Мар 2023
Сообщения
13
Реакции[?]
2
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Структура класса описывает то, как поля расположены в памяти
Т. е. они должны идти в правильном порядке
Опять же, сделай себе геттеры m_pEntity и m_iHealth/MaxHealth по оффсетам, пады долбить весьма неприятно, да и не все поля из дампа вообще где-либо нужны
Типа делаешь такой
Код:
template<typename T>
T Member(int offset) {
return *(T*)((uintptr_t)this + offset);
}
И потом такой ent->Member<CEntityIdentity>(0x10).m_name
Правда опять же класс айдентити у тебя тоже скопирован без пада и в таком случае никаких оффсетов в принципе нет
можешь дать пример геттеров. Я так понимаю мне нужно дать им значение (m_name = 0x10) и уже по адресу m_name кастовать результат в CEntityIdentity?
 
Ревёрсер среднего звена
Пользователь
Статус
Оффлайн
Регистрация
24 Ноя 2022
Сообщения
303
Реакции[?]
108
Поинты[?]
57K
можешь дать пример геттеров
Что-то в этом роде:
Код:
#define GETTER(type, name, offset) type name() { return Member<type>(offset); }

class VClass {
public:
    virtual void dummy_fn() = 0; // so that the classes have a vtable

    template<typename T>
    T Member(int offset) {
        return *(T*)((uintptr_t)this + offset);
    }
};
class NormalClass {
public:
    template<typename T>
    T Member(int offset) {
        return *(T*)((uintptr_t)this + offset);
    }
};
class CEntityIdentity : public NormalClass {
    GETTER(const char*, GetName, 0x18)
    GETTER(const char*, GetDesignerName, 0x20)
}
class CBaseEntity : public VClass {
public:
    GETTER(CEntityIdentity*, GetIdentity, Netvars::CEntityInstance::m_pEntity)
    GETTER(int, GetHealth, Netvars::C_BaseEntity::m_iHealth)
}
Ну и адаптируешь оффсеты нетваров под свою систему(можно и динамически из Схемы как вариант)
В доте проще т. к. структура у айдентити особо без падов
 
Забаненный
Статус
Оффлайн
Регистрация
22 Мар 2023
Сообщения
13
Реакции[?]
2
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Что-то в этом роде:
Код:
#define GETTER(type, name, offset) type name() { return Member<type>(offset); }

class VClass {
public:
    virtual void dummy_fn() = 0; // so that the classes have a vtable

    template<typename T>
    T Member(int offset) {
        return *(T*)((uintptr_t)this + offset);
    }
};
class NormalClass {
public:
    template<typename T>
    T Member(int offset) {
        return *(T*)((uintptr_t)this + offset);
    }
};
class CEntityIdentity : public NormalClass {
    GETTER(const char*, GetName, 0x18)
    GETTER(const char*, GetDesignerName, 0x20)
}
class CBaseEntity : public VClass {
public:
    GETTER(CEntityIdentity*, GetIdentity, Netvars::CEntityInstance::m_pEntity)
    GETTER(int, GetHealth, Netvars::C_BaseEntity::m_iHealth)
}
Ну и адаптируешь оффсеты нетваров под свою систему(можно и динамически из Схемы как вариант)
В доте проще т. к. структура у айдентити особо без падов
C++:
class CEntityIdentity : public NormalClass {
    public:
        DO_GETTER(CUtlSymbolLarge, GetName, 0x18);
        DO_GETTER(CUtlSymbolLarge, GetDesignerName, 0x20);
};

std::cout << "health: " << entity->GetHealth() << std::endl;
std::cout << "name: " << entity->GetPlayerIdentity()->GetDesignerName() << std::endl;
опять крашит на получении GetDesignerName()
 
Ревёрсер среднего звена
Пользователь
Статус
Оффлайн
Регистрация
24 Ноя 2022
Сообщения
303
Реакции[?]
108
Поинты[?]
57K
C++:
class CEntityIdentity : public NormalClass {
    public:
        DO_GETTER(CUtlSymbolLarge, GetName, 0x18);
        DO_GETTER(CUtlSymbolLarge, GetDesignerName, 0x20);
};

std::cout << "health: " << entity->GetHealth() << std::endl;
std::cout << "name: " << entity->GetPlayerIdentity()->GetDesignerName() << std::endl;
опять крашит на получении GetDesignerName()
Ну тут я уже бессилен, дебажь и смотри, что там к крашу приводит
Может дизайнернейм вообще nullptr и оно пытается его вывести
 
Начинающий
Статус
Оффлайн
Регистрация
15 Мар 2020
Сообщения
48
Реакции[?]
8
Поинты[?]
0
C++:
class CEntityIdentity : public NormalClass {
    public:
        DO_GETTER(CUtlSymbolLarge, GetName, 0x18);
        DO_GETTER(CUtlSymbolLarge, GetDesignerName, 0x20);
};

std::cout << "health: " << entity->GetHealth() << std::endl;
std::cout << "name: " << entity->GetPlayerIdentity()->GetDesignerName() << std::endl;
опять крашит на получении GetDesignerName()
посмотри как у меня в сурсе там получение ника есть
 
Сверху Снизу