-
Автор темы
- #1
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как получить оффсет m_iEntityList? я так понимаю его больше не существует?
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 это ты где взял?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 это ты где взял?
можешь юзать реверс шемы с доты и через c_baseentity получить m_ihealth0x1519FD8 это ты где взял?
а так же на юц(no ad) есть сигнатура ентитилиста0x1519FD8 это ты где взял?
1. Там она другаяа так же на юц(no ad) есть сигнатура ентитилиста
uintptr_t* entity_list = *(uintptr_t**) ((uintptr_t)GetModuleHandleA("client.dll") + 0x1519FD8);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);
так попробуй
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_nameC++: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_pEntity с оффсетом 10 идёт аж после полей на оффсете 0x7CE?
Почему нет пада у айдентити, если поля начинаются с 0x14?
Сделайте геттеры нормальные, путаться не будете
class CEntityInstance : public IHandleEntity
{
public:
// MNetworkEnable
// MNetworkPriority "56"
CEntityIdentity* m_pEntity; // 0x10
};
Так там до этого идёт ещё одно поле + наследуется ещё какой-то класс(с витейблом, наверное)Пожалуйста, авторизуйтесь для просмотра ссылки.(noad)
C++:class CEntityInstance : public IHandleEntity { public: // MNetworkEnable // MNetworkPriority "56" CEntityIdentity* m_pEntity; // 0x10 };
мб я не шарю, но новое поле многое меняет? спастил фулл entity оттуда, всё равно вылетаетТак там до этого идёт ещё одно поле + наследуется ещё какой-то класс(с витейблом, наверное)
Если уж оттуда пастить, то сохранять структуру спащенного, у тебя от комментариев оффсеты не пофиксятся
Структура класса описывает то, как поля расположены в памятимб я не шарю, но новое поле многое меняет? спастил фулл entity оттуда, всё равно вылетает
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?Структура класса описывает то, как поля расположены в памяти
Т. е. они должны идти в правильном порядке
Опять же, сделай себе геттеры m_pEntity и m_iHealth/MaxHealth по оффсетам, пады долбить весьма неприятно, да и не все поля из дампа вообще где-либо нужны
Типа делаешь такой
И потом такойКод:template<typename T> T Member(int offset) { return *(T*)((uintptr_t)this + offset); }
ent->Member<CEntityIdentity>(0x10).m_name
Правда опять же класс айдентити у тебя тоже скопирован без пада и в таком случае никаких оффсетов в принципе нет
Что-то в этом роде:можешь дать пример геттеров
#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)
}
Что-то в этом роде:
Ну и адаптируешь оффсеты нетваров под свою систему(можно и динамически из Схемы как вариант)Код:#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) }
В доте проще т. к. структура у айдентити особо без падов
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()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()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;
Проект предоставляет различный материал, относящийся к сфере киберспорта, программирования, ПО для игр, а также позволяет его участникам общаться на многие другие темы. Почта для жалоб: admin@yougame.biz