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

Ревёрсер среднего звена
Пользователь
Статус
Оффлайн
Регистрация
24 Ноя 2022
Сообщения
303
Реакции[?]
107
Поинты[?]
56K
Итак, патч 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 завтра залью
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
307
Реакции[?]
24
Поинты[?]
12K
Есть ли какой-то способ найти оффсет от новой дллки и старой дллки в иде?

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

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

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

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

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

И еще вопрос, GetCastRangeBonus возвращает уже со всеми модификаторами увеличения ренжа или сам бонус? мне кажется(лично мое мнение) чот лучше юзать такую схему для ренжа чем GetAbilityCastRangeBonus ибо там надо делать сигу или оффсет менять:
C++:
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;
                        }
 
Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
лучше юзать такую схему для ренжа
И как твой кринж-метод может быть лучше, чем это?
C++:
    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();
    }
 
Ревёрсер среднего звена
Пользователь
Статус
Оффлайн
Регистрация
24 Ноя 2022
Сообщения
303
Реакции[?]
107
Поинты[?]
56K
И как твой кринж-метод может быть лучше, чем это?
C++:
    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
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
759
Реакции[?]
328
Поинты[?]
60K
добавь скрины, строчные хрефы, шаги как найти и тд, чтобы некст апдейт условно люди сами могли попробовать поискать если сломается
 
Ревёрсер среднего звена
Пользователь
Статус
Оффлайн
Регистрация
24 Ноя 2022
Сообщения
303
Реакции[?]
107
Поинты[?]
56K
добавь скрины, строчные хрефы, шаги как найти и тд, чтобы некст апдейт условно люди сами могли попробовать поискать если сломается
Вполне логично, всё-таки раньше тредов не было, некоторые может вообще не шарят за какие-то функции
Добавлю, когда за ПК вернусь
Вообще можно сделать такой формат: в самой теме список актуальной инфы с инструкциями, а в постах заметки, что изменил апдейт
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
307
Реакции[?]
24
Поинты[?]
12K
Вполне логично, всё-таки раньше тредов не было, некоторые может вообще не шарят за какие-то функции
Добавлю, когда за ПК вернусь
Вообще можно сделать такой формат: в самой теме список актуальной инфы с инструкциями, а в постах заметки, что изменил апдейт
А панорама не дампится? Посмотрел твой дамп и папка panorama пустая
 
Ревёрсер среднего звена
Пользователь
Статус
Оффлайн
Регистрация
24 Ноя 2022
Сообщения
303
Реакции[?]
107
Поинты[?]
56K
Ревёрсер среднего звена
Пользователь
Статус
Оффлайн
Регистрация
24 Ноя 2022
Сообщения
303
Реакции[?]
107
Поинты[?]
56K
C_DOTA_TrackingProjectileInfo structure changed:
C++:
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)));
    }
};
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
759
Реакции[?]
328
Поинты[?]
60K
C_DOTA_TrackingProjectileInfo structure changed:
C++:
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 не юзал везде и чтобы у тебя оффсеты были все в одной пачке
 
Ревёрсер среднего звена
Пользователь
Статус
Оффлайн
Регистрация
24 Ноя 2022
Сообщения
303
Реакции[?]
107
Поинты[?]
56K
ля сделай CHandle<T> класс и сделай GetEntity оверлоады по хендлу и по индексу и сделай GETTER(CHandle<CDOTABaseNPC>, SourceHandle, 20) и Interfaces::EntitySystem->GetEntity(SourceHandle()) условно. чтобы ты H2IDX не юзал везде и чтобы у тебя оффсеты были все в одной пачке
А вообще это мысль, попробую
 
🤡
Пользователь
Статус
Оффлайн
Регистрация
28 Апр 2014
Сообщения
127
Реакции[?]
163
Поинты[?]
21K
C_DOTA_TrackingProjectileInfo structure changed:
C++:
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++:
// 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
};
 
Ревёрсер среднего звена
Пользователь
Статус
Оффлайн
Регистрация
24 Ноя 2022
Сообщения
303
Реакции[?]
107
Поинты[?]
56K
C++:
// 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
};
Согласен, структура в моём коде неполная, но это именно то, что я использую у себя
А линейные проджектайлы... наверное, можно какой-то автододж с отслеживанием их позиции сделать, но для подсветки траектории мне и нетчана хватает
 
🤡
Пользователь
Статус
Оффлайн
Регистрация
28 Апр 2014
Сообщения
127
Реакции[?]
163
Поинты[?]
21K
Согласен, структура в моём коде неполная, но это именно то, что я использую у себя
А линейные проджектайлы... наверное, можно какой-то автододж с отслеживанием их позиции сделать, но для подсветки траектории мне и нетчана хватает
Я имел в виду, что они эти классы добавили в схему. Ты можешь не хардкодить, а из схемы доставать как нетвары.

Плюс ты в своем предикте считаешь поз сам, а тебе в классе уже лежит и таргет поз и соурс поз.
 
Последнее редактирование:
Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
SetRenderingEnabled: 97 -> 92
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
644
Реакции[?]
102
Поинты[?]
65K
SetRenderingEnabled: 97 -> 92
у тебя ж постресив хукнут нахуй тебе это рендеринг

C++:
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 );
}
 
Ревёрсер среднего звена
Пользователь
Статус
Оффлайн
Регистрация
24 Ноя 2022
Сообщения
303
Реакции[?]
107
Поинты[?]
56K
у тебя ж постресив хукнут нахуй тебе это рендеринг

C++:
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 );
}
Да ты заебал
Третий раз уже говоришь
Мы может просто хотим хукнуть функцию и кайфовать
 
Сверху Снизу