Вопрос Как получить указатель на здоровье? (дамп source2gen)

Начинающий
Статус
Оффлайн
Регистрация
19 Июл 2023
Сообщения
2
Реакции[?]
0
Поинты[?]
0

Получил это 👆

И что получается дальше?

Мне надо создать на основе этого файла указатель? Если да, то как?
Я не до конца понимаю как работать с дотой



Прочекал почти все треды на форуме в разделе с дотой, там какие-то RVAшки(Relative Virtual Address), сигсканы через IDA
Не до конца понятно что мне дает source2gen (SDK)

Я думаю что мне не хватает смещения от client.dll на C_BaseEntity, а как его получить?
Потом к значению из адреса (client.dll + C_BaseEntity) прибавлять 0x324 / 0x320 и еще раз читать уже значения m_iHealth / m_iMaxHealth

class C_BaseEntity : public CEntityInstance:
class C_BaseEntity : public CEntityInstance
{
public:
    int32_t m_iHealth; // 0x324
    int32_t m_iMaxHealth; // 0x320
}
Помогите пожалуйста 🙏
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
19 Июл 2023
Сообщения
2
Реакции[?]
0
Поинты[?]
0
Сопоставил дамп Либератора https://yougame.biz/threads/139802/post-3101173 и дамп source2gen.

Код:
class C_BaseEntity(size: 0x538 bytes, project "client", binding @ client.dll + 0x44c91c0, scope "client.dll") extends CEntityInstance (Либератор)
class C_BaseEntity : public CEntityInstance (source2gen)

Код:
int32 m_iHealth(offset 0x324, size 0x4, align 0x4) (Либератор)
        ^MNetworkEnable
        ^MNetworkSerializer "ClampHealth"
        ^MNetworkUserGroup "Player"
        ^MNetworkPriority "32"

int32_t m_iHealth; // 0x324 (source2gen)


Но как из этого составить поинтер?

я пробовал
Код:
(client.dll + 0x44c91c0) class C_BaseEntity(size: 0x538 bytes, project "client", binding @ client.dll + 0x44c91c0, scope "client.dll") extends CEntityInstance
(client.dll + 0x46d2b50) base class CEntityInstance(size: 0x38 bytes, project "entity2", binding @ client.dll + 0x46d2b50, scope "client.dll")
Код:
(0x324) int32 m_iHealth(offset 0x324, size 0x4, align 0x4)
в разных комбинациях и безуспешно



что-то мне подсказывает я упускаю тут еще какое-то смещение, возможно нельзя от клиента сместиться на C_BaseEntity, а нужно как-то через EntityList находить нужную сущность
у меня просто не хватает опыта чтобы все это оценить

Поэтому еще раз прошу
Помогите пожалуйста 🙏
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
(те RVA что ты видишь в дампе это RVA на БИНДИНГИ(описывающие структуры из которых данные для дампа берутся) которые для дебага(для разработчика дампера) а не для тебя(юзера дампера))
что значит "получить здоровье"
это не статический член(один на все объекты). это связанный член(у каждого объекта свой). C_BaseEntity'тей и их здоровий - сотни, тысячи на карте. у каждого крипа тавера героя дерева и тд есть здоровье, чьё именно ты хочешь получить?
оффсет m_iHealth, т.е. 0x324, тебе показывает смещение хп ОТНОСИТЕЛЬНО КОНКРЕТНОГО ОБЪЕКТА. если ты возьмешь крипа или героя, прибавишь 0x324 к адресу, то ты получишь адрес где лежит хп.
только вот тебе сначала нужно найти адрес этого крипа героя и так далее.
да, через EntityList надо брать сущности.
аутдейтед но суть примерно та же(+ пробегись по комментам к треду):
есть CGameEntitySystem, в ней лежит массив из 64 указателей(так называемые "листы"), каждый из которых указывает на массив из 512 CEntityIdentity.
CEntityIdentity это как "паспорт" сущности - там есть имя фамилия серийник индекс и тд, а также есть указатель на саму C_BaseEntity(а в ней обратно указатель на CEntityIdentity есть если надо, там двоякая связь туда сюда)
сущности обычно идентифицируются прежде всего индексом, индекс представляет собой номер(начиная с 0) листа(их 64 штуки, т.е. от 0 до 63) умноженный на размер листа(512 записей) плюс номер(начиная с 0) записи в листе(записей 512 шт, т.е. от 0 до 511). обратное разбиение индекса на номер листа и номер в листе делается через деление с остатком на 512(в C это / и % операторы, это не совсем евклидово деление(там с отрицательными числами все по-другому) но индекс неотрицательный так что все норм)
индекс 1234 это 1234/512 = 2 лист(т.е. третий по счёту если с первого считать), и 1234%512=210'я запись в нём(211'я если с первой считать)
индекс 0 это 0 лист(первый) и 0'я запись(первая)
индекс 1 это 0 лист(первый) и 1'я запись(вторая)
индекс 511 это 0 лист(первый) и 511'я запись(512'я)
индекс 512 это 1 лист(второй) и 0'я запись(первая)
и тд
тебе сначала нужны ИГРОКИ(C_DOTAPlayerController)(это не герои! это контроллеры - те кто контроллируют героев, прирученных крипов и так далее), у каждого игрока есть "выбранный герой"(m_hAssignedHero; если что CHandle это 32битное число где первые 17 битов это серийник, а оставшиеся 15 битов это индекс сущности. последние 15 битов можно получить двоичным умножением(оператор &) на 15 единичек, т.е. 0b111111111111111 что есть 32767 в десятичной или 0x7FFF в 16ричной. собственно размер 15 битов связан с количеством и размерами листов 64 и 512(64*512 как раз 32768(это макс колво сущностей в игре), 15 битов это минимальный размер двоичного числа которое может представить столько чисел(от 0 до 32767)(log2(32768) = 15)))
игроков можно по-разному получать
можно у движка спрашивать слот локального игрока(к нему потом +1 прибавить получишь индекс сущности игрока)(нестабильно, индекс виртуальной функи меняется), а можно брать всех(их 64 шт максимум. индексы от 1 до 64, первая сущность с индексом 0 это всегда мир, worldent), как в сурс1, и искать среди них локального(нетвар m_bIsLocalPlayerController)
вот примеры готового говнокода(мб аутдейтед(интернал(1я ссылка) обновил вроде токо что, экстернал(2я ссылка) не трогал))
 
Последнее редактирование:
Сверху Снизу