Гайд Новые сигнатуры, индексы и оффсеты под обновления

Ревёрсер среднего звена
Пользователь
Пользователь
Статус
Оффлайн
Регистрация
24 Ноя 2022
Сообщения
300
Реакции
109
Итак, патч 7.34x:

Легенда карты:
Красный
Пожалуйста, авторизуйтесь для просмотра ссылки.

Зелёный — имя функции и есть xref. Xref'ом является только выделенная часть

Signatures:
Пожалуйста, авторизуйтесь для просмотра ссылки.
call: E8 ? ? ? ? F3 44 0F 11 5B
CEconItem::DeserializeFromProtobufItem call: E8 ? ? ? ? 41 0F B6 46 ? A8 01
Пожалуйста, авторизуйтесь для просмотра ссылки.
call: E8 ? ? ? ? 39 6C 24 68

VTable Indexes:
CPanel2D::GetPositionWithinWindow: 44
Пожалуйста, авторизуйтесь для просмотра ссылки.
: 93
Пожалуйста, авторизуйтесь для просмотра ссылки.
: 39 -> 42
C_DOTA_BaseNPC::IsRoshan: vtable offset 0xA20, index 60

Offsets:
CDOTAInput.CursorPosition: 0x4104 => 0x40f4

Новый dump завтра залью
 
Последнее редактирование:
Есть ли какой-то способ найти оффсет от новой дллки и старой дллки в иде?

Просто когда дота часто обновлялась я делал вот так,
нашел какой-то хреф в иде буквально адрес (18)0078E90

Перехожу в доте( в чит енджин) на адрес xxxx.dll + 78E90

И попал на какую-то херню, ищу вокруг зацепки и нахожу какой-то хреф " Failed to create zalupa"

Захожу в свою старую версию иды и смотрю где оно юзается, на адресе 100890
и делаю вот так
АДРЕС В НОВОЙ ДЛЛ - АДРЕС В СТАРОЙ ДЛЛ = Оффсет для иды

Скорее всего пургу какую-то несу, но чтобы вы наверняка поняли, что я имел в виду, я скажу вот так : Есть ли лучший способ ( не используя x64dbg)чекать статически дллку чтобы не ждать пол-часа когда она загрузится в ИДЕ?

И еще вопрос, GetCastRangeBonus возвращает уже со всеми модификаторами увеличения ренжа или сам бонус? мне кажется(лично мое мнение) чот лучше юзать такую схему для ренжа чем GetAbilityCastRangeBonus ибо там надо делать сигу или оффсет менять:
C++:
Expand Collapse Copy
if (localent->HasItem("item_aether_lens") || localent->HasItem("item_octarine_core"))
                        {
                            g_BonusCastRange += 225;
                        }
                        if (localent->HasItem("item_eye_of_the_vizier"))
                        {
                            g_BonusCastRange += 125;
                        } 
                        if (localent->HasItem("item_psychic_headband"))
                        {
                            g_BonusCastRange += 100;
                        }
                        if (localent->HasItem("item_spy_gadget"))
                        {
                            g_BonusCastRange += 100;
                        }
                        if (localent->HasItem("item_seer_stone"))
                        {
                            g_BonusCastRange += 350;
                        }
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
лучше юзать такую схему для ренжа
И как твой кринж-метод может быть лучше, чем это?
C++:
Expand Collapse Copy
    typedef float (*GetLevelSpecialValueForFn)(CDOTABaseAbility* thisptr, const char* value, int level, void* unk1, bool noOverride, bool* result);
    static inline GetLevelSpecialValueForFn GetLevelSpecialValueForFunc{};

    typedef AbilityKVEntry* (*GetKVEntryFn)(CDOTABaseAbility* thisptr, const char* value);
    static inline GetKVEntryFn GetKVEntry{};

    template<typename T = float>
    T GetLevelSpecialValueFor(const char* value, int level = -1) {
        return (T)GetLevelSpecialValueForFunc(this, value, level, nullptr, 0, nullptr);
    }
    template<typename T>
    T GetKVValueFor(const char* valName, int level = -1) {
        auto entry = GetKVEntry(this, valName);
        if (level < 0)
            level = Level();
        if (level > entry->GetValuesSize() - 1)
            level = entry->GetValuesSize();
        auto values = entry->GetValues();
        return (T)values[level - 1];
    }
    int CastRange() {
        return GetKVValueFor<int>("AbilityCastRange");
    }
    int CastRangeBonus() {
        return CallVFunc<257, int>(nullptr, nullptr, nullptr);
    }
    int EffectiveCastRange() {
        return CastRange() + CastRangeBonus();
    }
 
И как твой кринж-метод может быть лучше, чем это?
C++:
Expand Collapse Copy
    typedef float (*GetLevelSpecialValueForFn)(CDOTABaseAbility* thisptr, const char* value, int level, void* unk1, bool noOverride, bool* result);
    static inline GetLevelSpecialValueForFn GetLevelSpecialValueForFunc{};

    typedef AbilityKVEntry* (*GetKVEntryFn)(CDOTABaseAbility* thisptr, const char* value);
    static inline GetKVEntryFn GetKVEntry{};

    template<typename T = float>
    T GetLevelSpecialValueFor(const char* value, int level = -1) {
        return (T)GetLevelSpecialValueForFunc(this, value, level, nullptr, 0, nullptr);
    }
    template<typename T>
    T GetKVValueFor(const char* valName, int level = -1) {
        auto entry = GetKVEntry(this, valName);
        if (level < 0)
            level = Level();
        if (level > entry->GetValuesSize() - 1)
            level = entry->GetValuesSize();
        auto values = entry->GetValues();
        return (T)values[level - 1];
    }
    int CastRange() {
        return GetKVValueFor<int>("AbilityCastRange");
    }
    int CastRangeBonus() {
        return CallVFunc<257, int>(nullptr, nullptr, nullptr);
    }
    int EffectiveCastRange() {
        return CastRange() + CastRangeBonus();
    }
Убери KV-штуки, то я еблан, юзал JS wrapper вместо самой функции и сделал тупизну

чот лучше юзать такую схему
Нет, не лучше, этот метод появился исключительно из-за того, что в доте теперь больше источников этого самого бонуса. Думаю, оно просто суммирует модификаторы по функции, как я в гайде по ним описывал.
То, что описал ты — метод D2JS из 2016 года(т. е. неоптимизированный кринж), когда GetCastRangeBonus в принципе не было.
И да, оно возвращает именно бонус, а ревёрсится из GetEffectiveCastRange, посмотри, как он работает
Что до долгого анализа DLLки, могу прикрепить свою IDB
 
добавь скрины, строчные хрефы, шаги как найти и тд, чтобы некст апдейт условно люди сами могли попробовать поискать если сломается
 
добавь скрины, строчные хрефы, шаги как найти и тд, чтобы некст апдейт условно люди сами могли попробовать поискать если сломается
Вполне логично, всё-таки раньше тредов не было, некоторые может вообще не шарят за какие-то функции
Добавлю, когда за ПК вернусь
Вообще можно сделать такой формат: в самой теме список актуальной инфы с инструкциями, а в постах заметки, что изменил апдейт
 
Последнее редактирование:
Вполне логично, всё-таки раньше тредов не было, некоторые может вообще не шарят за какие-то функции
Добавлю, когда за ПК вернусь
Вообще можно сделать такой формат: в самой теме список актуальной инфы с инструкциями, а в постах заметки, что изменил апдейт
А панорама не дампится? Посмотрел твой дамп и папка panorama пустая
 
C_DOTA_TrackingProjectileInfo structure changed:
C++:
Expand Collapse Copy
class C_DOTA_TrackingProjectileInfo : public VClass {
public:
    GETTER(int32_t, GetMoveSpeed, 0x4);
    GETTER(Vector, GetPos, 0x8);
    GETTER(bool, IsDodgeable, 40);
    GETTER(bool, IsAttack, 41);
    GETTER(bool, IsEvaded, 42);
    GETTER(float, GetExpireTime, 44);

    auto GetSource() {
        return Interfaces::EntitySystem->GetEntity<CDOTABaseNPC>(H2IDX(Member<uint32_t>(20)));
    }

    auto GetTarget() {
        return Interfaces::EntitySystem->GetEntity<CDOTABaseNPC>(H2IDX(Member<uint32_t>(24)));
    }
};
 
C_DOTA_TrackingProjectileInfo structure changed:
C++:
Expand Collapse Copy
class C_DOTA_TrackingProjectileInfo : public VClass {
public:
    GETTER(int32_t, GetMoveSpeed, 0x4);
    GETTER(Vector, GetPos, 0x8);
    GETTER(bool, IsDodgeable, 40);
    GETTER(bool, IsAttack, 41);
    GETTER(bool, IsEvaded, 42);
    GETTER(float, GetExpireTime, 44);

    auto GetSource() {
        return Interfaces::EntitySystem->GetEntity<CDOTABaseNPC>(H2IDX(Member<uint32_t>(20)));
    }

    auto GetTarget() {
        return Interfaces::EntitySystem->GetEntity<CDOTABaseNPC>(H2IDX(Member<uint32_t>(24)));
    }
};
ля сделай CHandle<T> класс и сделай GetEntity оверлоады по хендлу и по индексу и сделай GETTER(CHandle<CDOTABaseNPC>, SourceHandle, 20) и Interfaces::EntitySystem->GetEntity(SourceHandle()) условно. чтобы ты H2IDX не юзал везде и чтобы у тебя оффсеты были все в одной пачке
 
ля сделай CHandle<T> класс и сделай GetEntity оверлоады по хендлу и по индексу и сделай GETTER(CHandle<CDOTABaseNPC>, SourceHandle, 20) и Interfaces::EntitySystem->GetEntity(SourceHandle()) условно. чтобы ты H2IDX не юзал везде и чтобы у тебя оффсеты были все в одной пачке
А вообще это мысль, попробую
 
C_DOTA_TrackingProjectileInfo structure changed:
C++:
Expand Collapse Copy
class C_DOTA_TrackingProjectileInfo : public VClass {
public:
    GETTER(int32_t, GetMoveSpeed, 0x4);
    GETTER(Vector, GetPos, 0x8);
    GETTER(bool, IsDodgeable, 40);
    GETTER(bool, IsAttack, 41);
    GETTER(bool, IsEvaded, 42);
    GETTER(float, GetExpireTime, 44);

    auto GetSource() {
        return Interfaces::EntitySystem->GetEntity<CDOTABaseNPC>(H2IDX(Member<uint32_t>(20)));
    }

    auto GetTarget() {
        return Interfaces::EntitySystem->GetEntity<CDOTABaseNPC>(H2IDX(Member<uint32_t>(24)));
    }
};
C++:
Expand Collapse Copy
// Aligment: 11
// Size: 88
struct C_DOTA_TrackingProjectileInfo
{
    int32_t m_iHandle; // 0x0
    int32_t m_iMoveSpeed; // 0x4
    Vector m_vLocation; // 0x8
    uint32_t m_hSource; // 0x14
    uint32_t m_hTarget; // 0x18
    Vector m_vTargetLocation; // 0x1c
    bool m_bDodgeable; // 0x28
    bool m_bIsAttack; // 0x29
    bool m_bIsEvaded; // 0x2a
    uint8_t pad_0x2b[ 1 ]; // 0x2b
    GameTime_t m_flExpireTime; // 0x2c
    GameTime_t m_flMaxImpactTime; // 0x30
    uint8_t pad_0x34[ 36 ]; // 0x34
};

// Aligment: 10
// Size: 144
struct C_DOTA_LinearProjectileInfo
{
    uint8_t pad_0x0[ 32 ]; // 0x0
    uint8_t m_transform[ 32 ]; // 0x20
    int32_t m_iHandle; // 0x40
    Vector m_vInitPosition; // 0x44
    Vector m_vPosition; // 0x50
    Vector m_vVelocity; // 0x5c
    Vector m_vAcceleration; // 0x68
    float m_flMaxSpeed; // 0x74
    float m_flFowRadius; // 0x78
    bool m_bStickyFoWReveal; // 0x7c
    uint8_t pad_0x7d[ 3 ]; // 0x7d
    float m_flDistance; // 0x80
    uint8_t pad_0x84[ 12 ]; // 0x84
};
 
C++:
Expand Collapse Copy
// Aligment: 11
// Size: 88
struct C_DOTA_TrackingProjectileInfo
{
    int32_t m_iHandle; // 0x0
    int32_t m_iMoveSpeed; // 0x4
    Vector m_vLocation; // 0x8
    uint32_t m_hSource; // 0x14
    uint32_t m_hTarget; // 0x18
    Vector m_vTargetLocation; // 0x1c
    bool m_bDodgeable; // 0x28
    bool m_bIsAttack; // 0x29
    bool m_bIsEvaded; // 0x2a
    uint8_t pad_0x2b[ 1 ]; // 0x2b
    GameTime_t m_flExpireTime; // 0x2c
    GameTime_t m_flMaxImpactTime; // 0x30
    uint8_t pad_0x34[ 36 ]; // 0x34
};

// Aligment: 10
// Size: 144
struct C_DOTA_LinearProjectileInfo
{
    uint8_t pad_0x0[ 32 ]; // 0x0
    uint8_t m_transform[ 32 ]; // 0x20
    int32_t m_iHandle; // 0x40
    Vector m_vInitPosition; // 0x44
    Vector m_vPosition; // 0x50
    Vector m_vVelocity; // 0x5c
    Vector m_vAcceleration; // 0x68
    float m_flMaxSpeed; // 0x74
    float m_flFowRadius; // 0x78
    bool m_bStickyFoWReveal; // 0x7c
    uint8_t pad_0x7d[ 3 ]; // 0x7d
    float m_flDistance; // 0x80
    uint8_t pad_0x84[ 12 ]; // 0x84
};
Согласен, структура в моём коде неполная, но это именно то, что я использую у себя
А линейные проджектайлы... наверное, можно какой-то автододж с отслеживанием их позиции сделать, но для подсветки траектории мне и нетчана хватает
 
Согласен, структура в моём коде неполная, но это именно то, что я использую у себя
А линейные проджектайлы... наверное, можно какой-то автододж с отслеживанием их позиции сделать, но для подсветки траектории мне и нетчана хватает
Я имел в виду, что они эти классы добавили в схему. Ты можешь не хардкодить, а из схемы доставать как нетвары.

Плюс ты в своем предикте считаешь поз сам, а тебе в классе уже лежит и таргет поз и соурс поз.
 
Последнее редактирование:
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
SetRenderingEnabled: 97 -> 92
 
SetRenderingEnabled: 97 -> 92
у тебя ж постресив хукнут нахуй тебе это рендеринг

C++:
Expand Collapse Copy
if ( panorama_gui.draw_particles && particle_manager->type( ) == GAME_PARTICLE_MANAGER_EVENT_SET_FOW_PROPERTIES ) {
    particle_manager->mutable_set_particle_fow_properties( )->set_fow_radius( 999999.f );
}
 
у тебя ж постресив хукнут нахуй тебе это рендеринг

C++:
Expand Collapse Copy
if ( panorama_gui.draw_particles && particle_manager->type( ) == GAME_PARTICLE_MANAGER_EVENT_SET_FOW_PROPERTIES ) {
    particle_manager->mutable_set_particle_fow_properties( )->set_fow_radius( 999999.f );
}
Да ты заебал
Третий раз уже говоришь
Мы может просто хотим хукнуть функцию и кайфовать
 
Назад
Сверху Снизу