13 февраля 2013 г.

Отучаем игру от Steam

Для начала, пиратство это плохо, ибо чем больше программ воруют, тем меньше разработчик получает бабла, тем сильнее его детишки хотят кушать, а жена больше хочет новую ламборджини и больше его начинает пилить. А когда пилят, портится настроение и аппетит и соответственно нет никакого желания программировать, рисовать и озвучивать новые игры. Я например всегда покупаю игры и программы так как хочу вознаградить разработчиков, пусть даже львиную часть моих денег сожрут дестрибьюторы и топ манагеры.
Но я отвлекся, посетило меня тут любопытство, каким образом привязываются игры к Steam. Исследуемым экземпляром стала игра Space Pirates and Zombies в народе SPAZ. Достаточно прикольная игра сделанная в виде олдскула. Я ее с удовольствием прошел в свое время.
Смысл игры в искоренении зомби в близком и дальнем космосе, прокачки своего мазершипа, скилов и т.п.
Итак, для начала выключаем Steam и идем в папку с игрой.

У меня Steam установлен на диск D: и соответственно путь у меня получился следующий:
D:\Program Files (x86)\Steam\steamapps\common\Space Pirates and Zombies
Пытаемся запустить фаил SpazGame.exe и видим, что игра не запускается, а сразу закрывается.
Посмотрим ее программой StudPE и обнаружим, что программа ничем не попакована, это облегчает нам задачу, так как распаковывать не нужно.
Открываем IDA и загружаем в нее игру. Пытаемся ее запустить сразу - результат тот же.
Ну чтож, первым делом посмотрим, что у нас интересного в импортах, так как в директории с игрой я заметил библиотеку под название steam_api.dll может она как то определяет Steam аккаунт.

Меня сразу привлекла функция которая импортится под названием SteamAPI_Init.
Тыкаем 2 раза на нее и попадаем в IAT. Теперь надо посмотреть откуда вызывается эта функция и будем глядеть, что там происходит.
Тыкаем мышой на название функции, идем в View->OpenSubview->Cross References
Видим, что вызывается эта функция всего из одного места.
Поставим там брякпоинт на вызове этой функции и нажмем F9, тут же окажемся на этой функции.

Функция возвращает 1 в EAX если Steam запущен или 0 если Steam не обнаружен. Попробуем поставить в EAX 1 и посмотрим, что получится.
А получилось у нас вот что:
Приложение упало на call sub_4227B0 если зайти в этот вызов, то можно увидеть, что там идет вызов кучи функций из Steam API. И не очень похоже, что там идет проверка которая позволяет или нет запускать игру.
Дальше, особа ничего интересного не видно, до выхода из функции. После вызова функции где идет некая работа со Steam сразу идет вилка.
Которая проверяет 0 в al и если там ноль, то уходит в лево, на короткую ветку. Если потрейсить ее, то видно, что она идет на выход. Попробуем изменить вилку, чтобы она ушла на более длинную ветку.
Трейсим до JNZ short loc_4F183E тыкаем ПКМ на флаг JF и выбираем из низпадающего меню
Zero Value.
Замигает зеленая стрелка в право, дальше если потрейсить, вручню или нажать F9 то игра запустится без всякого Steam`a.
Если нажать CONTINUE то игра без проблем запустится.
Что мы и добивались.

Комментариев нет:

Отправить комментарий