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

Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Сегодня я научу вас разблокировать Dota Plus парой простых движений. Разумеется, только client-side.

Нам понадобится IDA + плагин Class Informer.
Открываем в IDA client.dll => Class Informer. Ищем что-то очевидное с упоминанием плюса.



Выглядит легитимно. Кликаем, смотрим. Там две функции. Сразу скажу, что первая нам не нужна. Да она и не выглядит обещающе.
Смотрим псевдокод второй.


Очевидный возврат другой функции, с передачей в неё this (CDOTAPlusController). Смотрим её код.
Первым делом попробуем понять, что такое этот qword_18379CD68.


Запускаем доту, открываем любой на выбор дебаггер. Я предпочитаю работать в Cheat Engine, так что рассказывать буду на его примере.
Открываем Memory View, жмем Ctrl+G, вводим "client.dll+18BD6B0" (имя функции из IDA, без sub_18).
Пробуем поставить бряху (Ctrl+F5). Тыкаем туда-сюда; Понимаем, что ничего не происходит.
Не буду ходить вокруг да около -- проверка статуса подписки происходит перед самой загрузкой главного меню доты.
Если ты в CE, то закрой доту не закрывая Memory View; Запусти доту еще раз, и как можно быстрей вернись в CE, выбери процесс доты, и в Memory View нажми Ctrl+F5.
Если в Memory View у тебя явно не наша функция -- нажми Ctrl+G, клавишу "вверх" -- это выберет предыдущий адрес. Перейди на него, поставь бряху.

Вот он наш qword_18379CD68 -- выделен синим.


Кликаем по опкодам, копируем адрес. Жмем Ctrl+D, вставляем адрес, жмем Ctrl+N. Видим, что это Pointer to instance of ConVar.
Пока ничего интересного. Смотрим окоды дальше. Чуть ниже идет mov ecx,[rax+58], т.е. ConVar + 0x58;
Смотрим, что там. У моего нового аккаунта есть подписка (как и у всех новых акков), и там лежит 1.
Тут хорошо бы иметь старый аккаунт, где подписки нет, но я уже всё сделал за вас.
Перезаходим в другой акк, снова проделываем всё выше описанное, смотрим ConVar + 0x58. Там лежит 0.
Выглядит многообещающе. Очевидный вариант -- заменить mov ecx,[rax+58] на mov ecx, 00000001.
Но придется нопать, да и вообще выглядит, как костыль. Лучше еще раз посмотрим на наш ConVar.
На нашу удачу, на оффсете 0x70 так удобно лежит нужная нам единичка. Сразу скажу, что протестировал тонну разных вариантов -- там всегда 1.


Пробуем заменить mov ecx,[rax+58] на mov ecx,[rax+70]. Убираем бряху, жмем Ctrl+F9.
Да, это было довольно просто.


Что же со всем этим делать? Ну тут куча вариантов:
Добавлять это в свой интернал и патчить на рантайме.
Сделать небольшой экстернал. Например, ждать запуска доты и загрузки ей client.dll, потом патчить.
Пореверсить получше, понять, что там в этом конваре лежит, и не патчить как мудак.
Или вообще физически патчить client.dll по сигнатуре. Тогда плюс будет работать всегда, до тех пор, пока client.dll не обновится.
Тогда останется только снова пропатчить.
А для самых ленивых,
Пожалуйста, авторизуйтесь для просмотра ссылки.
. Там помимо плюса есть еще кое-какие плюшки. И планируется еще несколько.

Stay tuned <3
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
можно на рантайме в любой момент лочить/анлочить
(сурсы ксго и тф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."};
}
 
Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
можно на рантайме в любой момент лочить/анлочить
(сурсы ксго и тф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."};
}
Ну это о моих первых попытках плюс анлокнуть. Там очевидно, что с GC мутки, но для работяг, чтобы тупо пропатчить и не париться -- хороший вариант.
Естесна я не буду тут тираду о GC выкатывать :D
 
Последнее редактирование:
Don't forget me
Забаненный
Статус
Оффлайн
Регистрация
15 Мар 2020
Сообщения
274
Реакции[?]
30
Поинты[?]
2K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
ты не ахуел ли? у меня 1 реакции не хватает блять
 
Don't forget me
Забаненный
Статус
Оффлайн
Регистрация
15 Мар 2020
Сообщения
274
Реакции[?]
30
Поинты[?]
2K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Хер с ним, снял хайд. Уже всю личку заспамили.
 
Начинающий
Статус
Оффлайн
Регистрация
5 Май 2019
Сообщения
156
Реакции[?]
11
Поинты[?]
0
Я так понимаю цэ визуально как в скинченджере?
 
ну и дела, другалек
Пользователь
Статус
Оффлайн
Регистрация
3 Апр 2020
Сообщения
110
Реакции[?]
132
Поинты[?]
0
Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Я так понимаю цэ визуально как в скинченджере?
Не правильно понимаешь. По сути, анлокаются все функции, кроме прогресса уровня героев.
Вроде как уровень будет только у тебя отображаться -- я хз, в доту не играю, не тестил.
 
Начинающий
Статус
Оффлайн
Регистрация
5 Май 2019
Сообщения
156
Реакции[?]
11
Поинты[?]
0
Не правильно понимаешь. По сути, анлокаются все функции, кроме прогресса уровня героев.
Вроде как уровень будет только у тебя отображаться -- я хз, в доту не играю, не тестил.
да я уже понял что оно воркает как в одном скинченджере, по факту все функции есть кроме уровня и покупки за шарды сундуков которые доступны лишь для д+
 
Начинающий
Статус
Оффлайн
Регистрация
9 Дек 2018
Сообщения
12
Реакции[?]
3
Поинты[?]
0
А для самых ленивых,
Пожалуйста, авторизуйтесь для просмотра ссылки.
. Там помимо плюса есть еще кое-какие плюшки. И планируется еще несколько.
Буквально 3 дня назад чекал гит, пока содержимое темы ещё под хайдом было, так и понял что твой
 
#6464FF
Участник
Статус
Оффлайн
Регистрация
22 Мар 2020
Сообщения
563
Реакции[?]
226
Поинты[?]
5K
А она полностью анлокается? (Время появления рун, сколько монет за пачку крипов и т.п.)
 
dark light
Пользователь
Статус
Оффлайн
Регистрация
12 Июл 2017
Сообщения
434
Реакции[?]
54
Поинты[?]
0
Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Сверху Снизу