Сегодня я научу вас разблокировать 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, потом патчить.