Разблокируем Dota Plus

Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
326
Реакции[?]
24
Поинты[?]
12K
Там в ИДЕ адрес сделали зелёным. Есть ещё способы посмотреть на функу?
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
Там в ИДЕ адрес сделали зелёным. Есть ещё способы посмотреть на функу?
ты наркоман? я тебе в другом треде писал. https://yougame.biz/threads/245552/#post-2543567
тупо адрес просто руками введи в иде :fpalm: на крайняк в дебагере просто тот же адрес найди по RVA(relative virtual addess)(очень важно чтобы client.dll открытая в иде была свежая, то есть точно такая же как и та что у тебя с дебагера будет подключена. RVA меняется чуть ли не каждый апдейт спокойно. RVA это типо как в чит енджине знаешь client.dll+0x123456). берешь адрес в иде вычитаешь от module base или от сегмента где лежит то что тебе надо(.text/.data и тд), потом в дебагере переходишь на module base или сегмент(в зависимости от того, оффсет от чего ты в иде посчитал) и прибавляешь оффсет.
пусть есть некий sub_123456, а .text начинается на 10000 условно, тогда оффсет от .text это 123456-10000 = 113456. летишь в дебагер заходишь в Memory map выбираешь модуль и нужный сегмент(.text в нашем случае) берешь адрес прибавляешь 113456 кайфуешь. альтернативно берешь module base(условно 1000) считаешь оффсет(123456-1000=122456) в дебагере берешь тоже базу модуля и к ней прибавляешь 122456.
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
671
Реакции[?]
106
Поинты[?]
69K
можно на рантайме в любой момент лочить/анлочить
(сурсы ксго и тф2 в помощь для реверса:
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
)
C++:
export
void UnlockDotaPlus()//invoke from main thread
{
    const auto* SOCachePtr = GCClient::GetInstance()->GetInventorySOCache();
    if (SOCachePtr) {
        auto PlusCache = SOCachePtr->GetPlusAccountCache();
        Logger::LogInfo("SOTypeCache GameAccountPlus Cache 0x%p\n", PlusCache);
        if (PlusCache) {
            for (const auto& objs = PlusCache->GetObjects(); const auto & obj : objs)
            {
                if (obj->IsGameAccountPlus())
                {
                    Logger::LogInfo("SOTypeCache GameAccountPlus 0x%p\n", obj);
                    auto& accountProto = static_cast<CDOTAGameAccountPlus*>(obj)->GetProto();

                    accountProto.set_plus_flags(0);
                    accountProto.set_plus_status(1);//0 = lock, 1 = unlock
                    GCClient::GetInstance()->
                        DispatchSOUpdate(
                            SOCachePtr->GetOwner(),
                            obj,
                            ESOCacheEvent::eSOCacheEvent_Incremental
                        );
                    return;
                }
            }
            Logger::LogError("UnlockDotaPlus: Could not get GameAccountPlus from cache");
        }
        else Logger::LogError("UnlockDotaPlus: PlusCache is nullptr");
    }
    else Logger::LogError("UnlockDotaPlus: SOCache is nullptr");
    throw std::runtime_error{"UnlockDotaPlus -> failed to unlock dota plus."};
}
а почему у меня account_id лежит не там где надо?(на скрине на 0x40)

1664893262569.png
а тут он вообще next_payment_date, вместо account_id поля (протобаф файлы новые)
1664893384149.png
на скрине - plusc переменная из кода ниже
C++:
class CDOTAGameAccountPlus : public CGCClientSharedObject
{
public:
    auto GetPlusAccountCache( ) {
        return (CSODOTAGameAccountPlus*)(this + 0x8);
    }
};

///

auto plusc = g_pLocalInventory->m_pSharedObjectCache->m_pAccountPlus->GetPlusAccountCache();
std::cout << plusc->account_id( ) << std::endl;

plusc->set_plus_flags( 0 );
plusc->set_plus_status( 1 );
g_pLocalInventory->SOUpdated( g_pLocalInventory->m_pSOID, g_pLocalInventory->m_pSharedObjectCache->m_pAccountPlus, eSOCacheEvent_Incremental );
(account_id( ) - 0 выводит)

и вообще правильно ли я делаю вот так? не крашит но и ничего не происходит
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
а почему у меня account_id лежит не там где надо?(на скрине на 0x40)

Посмотреть вложение 223345
а тут он вообще next_payment_date, вместо account_id поля (протобаф файлы новые)
Посмотреть вложение 223346
на скрине - plusc переменная из кода ниже
C++:
class CDOTAGameAccountPlus : public CGCClientSharedObject
{
public:
    auto GetPlusAccountCache( ) {
        return (CSODOTAGameAccountPlus*)(this + 0x8);
    }
};

///

auto plusc = g_pLocalInventory->m_pSharedObjectCache->m_pAccountPlus->GetPlusAccountCache();
std::cout << plusc->account_id( ) << std::endl;

plusc->set_plus_flags( 0 );
plusc->set_plus_status( 1 );
g_pLocalInventory->SOUpdated( g_pLocalInventory->m_pSOID, g_pLocalInventory->m_pSharedObjectCache->m_pAccountPlus, eSOCacheEvent_Incremental );
(account_id( ) - 0 выводит)

и вообще правильно ли я делаю вот так? не крашит но и ничего не происходит
ну во-первых к this нельзя прибавлять(точнее оно работает не так как тебе бы хотелось), можно прибавлять только к (std::uintptr_t)this. хуйней не занимайся и юзай Member
C++:
class NormalClass
{
public:
    template<class T>
    auto& Member(std::ptrdiff_t offset) noexcept
    {
        return *reinterpret_cast<T*>(reinterpret_cast<std::uintptr_t>(this) + offset);
    }
    
    template<class T>
    const auto& Member(std::ptrdiff_t offset) const noexcept
    {
        return *reinterpret_cast<const T*>(reinterpret_cast<std::uintptr_t>(this) + offset);
    }
};
...
    (uslovno) auto& shit: return Member<CSODOTAGameAccountPlus>(0x8);
/*c++23 P0847R7 imba ficha
partial support(modules support missing) poka chto v MSVC, a drugie kompilatori voobshe xuy sosut kak obichno
class NormalClass
{
public:
    template<class T, class Self>
    auto& Member(this Self&& self, std::ptrdiff_t offset) noexcept
    {
        return *reinterpret_cast<std::conditional_t<std::is_const_v<std::remove_reference_t<Self>>, const T, T>*>
            (reinterpret_cast<std::uintptr_t>(&self) + offset);
    }
};

class CDOTAGameAccountPlus : NormalClass
{
public:
    auto& GetPlusAccountCache(this auto&& self)
    {
        return self.Member<int>(0x8);
    }
};
*/
во-вторых попробуй не онли инвентарь оповещать а все листенеры в гсклиенте
 
Упс!
Пользователь
Статус
Оффлайн
Регистрация
3 Янв 2022
Сообщения
345
Реакции[?]
52
Поинты[?]
11K
столько парится ради время стаков и пуллов...
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
671
Реакции[?]
106
Поинты[?]
69K
ну во-первых к this нельзя прибавлять(точнее оно работает не так как тебе бы хотелось), можно прибавлять только к (std::uintptr_t)this. хуйней не занимайся и юзай Member
C++:
class NormalClass
{
public:
    template<class T>
    auto& Member(std::ptrdiff_t offset) noexcept
    {
        return *reinterpret_cast<T*>(reinterpret_cast<std::uintptr_t>(this) + offset);
    }

    template<class T>
    const auto& Member(std::ptrdiff_t offset) const noexcept
    {
        return *reinterpret_cast<const T*>(reinterpret_cast<std::uintptr_t>(this) + offset);
    }
};
...
    (uslovno) auto& shit: return Member<CSODOTAGameAccountPlus>(0x8);
/*c++23 P0847R7 imba ficha
partial support(modules support missing) poka chto v MSVC, a drugie kompilatori voobshe xuy sosut kak obichno
class NormalClass
{
public:
    template<class T, class Self>
    auto& Member(this Self&& self, std::ptrdiff_t offset) noexcept
    {
        return *reinterpret_cast<std::conditional_t<std::is_const_v<std::remove_reference_t<Self>>, const T, T>*>
            (reinterpret_cast<std::uintptr_t>(&self) + offset);
    }
};

class CDOTAGameAccountPlus : NormalClass
{
public:
    auto& GetPlusAccountCache(this auto&& self)
    {
        return self.Member<int>(0x8);
    }
};
*/
во-вторых попробуй не онли инвентарь оповещать а все листенеры в гсклиенте
а какие ещё листенеры есть?

upd: нашёл листенер GCClientSystem


C++:
class CDOTAGCClientSystem : public CSharedObjectListener {
public:
    char pad_0000[192]; // 0x0
    uint64_t m_pSteamUser; // 0xC0
};

auto plus_cache = g_pLocalInventory->m_pSharedObjectCache->m_pAccountPlus->GetCache();
plus_cache->set_plus_flags( 0 );
plus_cache->set_plus_status( 1 );

g_pLocalInventory->SOUpdated( g_pLocalInventory->m_pSOID, g_pLocalInventory->m_pSharedObjectCache->m_pAccountPlus, eSOCacheEvent_Incremental );
g_pGCClientSystem->SOUpdated( g_pLocalInventory->m_pSOID, g_pLocalInventory->m_pSharedObjectCache->m_pAccountPlus, eSOCacheEvent_Incremental );
но на int 3 останавливается после вызова soupdated у CDOTAGCClientSystem (1664952670546.png)
в логе это:

Код:
WARNING: Local content might be corrupt or missing files
C:\buildworker\source2_dota_rel_2019_win64\build\src\filesystem\basefilesystem.cpp (6656) : Assertion Failed in function CBaseFileSystem::MarkContentCorrupt():
false
Content being marked corrupt.  bMissingFilesOnly = false, pFile specified as 'NULL', reason: 'NULL'
Sending Steam API content notification
Failed to initialize periodic resource schema. Duplicate periodic resource name 'ti6_arcana_vote'
Инструкция точки останова (оператор __debugbreak() или аналогичный вызов) выполнена в dota2.exe.
но не уверен что связано как-то

да и чото мне кажется, что нужно токо инвентарь апдейтить, но я хз ваще в чем проблема
 
Последнее редактирование:
Сверху Снизу