Steam и фриварная японская говногама [Часть 2].

Вторым глобальным этапом у нас будет отвязка от Steam.
Откроем дамп в CFF Explorer'e и посмотрим на директорию импорта (Import Directory);

Конкретно нас интересует модуль steam_api.dll.
Здесь из него вызывается всего 5 функций, суть которых я постараюсь описать.

SteamAPI_RunCallbacks - функция, которая обращается непосредственно к самому клиенту Steam и получает от него ответ (колбэк);
SteamApps - функция, которая получает список приложений(игр), которые зарегистрированы на конкретный аккаунт, под которым пользователь авторизован через клиент Steam.
SteamAPI_Init - инициализация Steam, фактически главная функция, которая проверяет запущенность клиента и определяет дальнейшие действия.После ее вызова Steam клиент будет считать, что приложение (игра) запущено.
SteamAPI_Shutdown - функция финализации, вызывается по завершению процесса и является сигналом клиенту Steam о том, что приложение (игра) завершено.
SteamUser - функция, которая получает информацию о текущем пользователе, запустившем приложение (игру) через клиент Steam.
Само собой, что если стим не запущен, то поведение будет иным.
Но одно дело импорт, а другое - это вызовы в коде приложения.
Запустим дамп в отладчике и поищем все вызовы SteamApi, используя Intermodullar Calls, предварительно проанализировав код.
Набираем слово Steam и наблюдаем следующую картину:
Я уже поставил софтварные брейкпоинты, так что жмем F9 и следим за поведением.
Первой, конечно же, вызывается Init.
[В случае успешного выполнения в EAX помещается 1]
Нельзя дать ей выполниться, но в тоже время стоит скорректировать результат ее выполнения, так что перемещаемся
через New Origin на следующую инструкцию и меняем текущее значение регистра EAX на 1.
-------------------------------------------------------------
Продолжаем запуск.
Начало отрисовываться окно и произошел следующий вызов:
Никаких колбэков со стимом у нас быть не может, так что пропускаем вызов и продолжаем запуск.
Всего она вызовется порядка 6 раз.
-------------------------------------------------------------
Очередной вызов и на этот раз уже SteamApps:

Суть такова, что нам надо изменить результат выполнения на 0, иначе произойдет следующий вызов, а за ним и цепочка других.
Перемещаемся к следующей инструкции и изменяем значение регистра EAX на 0.
-------------------------------------------------------------
Продолжая запуск нас снова встречает RunCallbacks, только вызывается он уже куда большее кол-во раз.
Мы не будем ждать и запатчим его следующим образом:

Таким образом, каждый раз при его вызове у нас будет переход на следующую инструкцию.
--------------------------------------------------------------
После всех заставок мы попадаем на главный экран.Жмем на мигающую желтую строчку и попадаем в меню.
Выбираем второй по счету пункт меню.
Далее нажимаем на единственную строку в списке справа
и мы попадаем в список выбора персонажа.

Выбираем любого из них и нажимаем зеленую кнопку снизу.
Снова нажимаем зеленую кнопку.

Нас встречает очередной вызов.На этот раз уже SteamUser.
--------------------------------------------------------------
Этот вызов нам придется пропустить, а с ним и некоторую часть процедуры.
Ставим new origin по этому адресу:

Спросите почему ? Потому что при нормальном запуске
по адресу 016D22AF будет вызвана функция из библиотеки steamclient.dll, а вне стима это нарушит дальнейшую логику выполнения.
--------------------------------------------------------------
Отпускаем игру в свободное плавание и ждем дальнейших событий.
Более ничего не вызывается, так что мы можем ее закрывать.
--------------------------------------------------------------
Разумно, что последней функцией вызывается Shutdown.
В случае корректного вызова она возвращает 1, поэтому мы ее пропустим и, находясь на следующей инструкции, изменим значение EAX на 1.
--------------------------------------------------------------
Процесс корректно завершается.

С позиции патчей все будет выглядеть следующим образом:

Но есть одно "но", а именно значение поля DllCharacteristics.
Из-за них наш пропатченный файл откзывается запускаться.
Если мы откроем пропатченный дамп в CFF Explorer'е, то получим следующее:
На том, что это значит, я не буду останавливаться.
Полностью обнулим это поле, но уже в PeTools, так как CFF Explorer не хотел обрабатывать первый большой дамп, в чем его большой минус.
Открываем Optional Header и обнуляем поле Dll flags.
Нажимаем ОК и еще раз ОК в окне PE Editor'а.

Теперь все нормально запускается.

Осталось сделать парочку правок.
Можем доверить их CFF Explorer'у.
Обнуляем директории релоков и секьюрити.
Отрезаем секцию релоков (.reloc) и секцию упаковщика (.bind).
Удаляем дескриптор импорта для модуля steam_api.dll.
 
Делаем ребилд и сохраняем файл.
При запросе на перезапись отвечаем положительно.
Я сделал сохранение и в другой файл.
Полученный файл получился меньше по размеру, чем запакованный.
На этом распаковку считаю законченной.Файл готов для дальнейшего анализа.







Комментарии

Популярные сообщения из этого блога

[Patch] Alone In The Dark - The New Nightmare

Mafia 3 Savegame Editor