Pull to refresh

Отучаем от диска всеми любимых «Героев»

Lumber room
Awaiting invitation
Одним холодным зимним вечером мне захотелось тряхнуть стариной и вновь отстоять Эрафию в битве с силами зла, однако всю малину испортил мой верный друг – ноутбук. Припомнив мне, как я когда-то уронил его, он отказался читать диск с «Героями» (благо они уже были установлены). Ну что же, вызов брошен.


Самое первое, о чем я подумал – защита строится на вызове GetDriveType с последующим поиском каких-то файлов на диске. И я не ошибся. Поэтому загружаем «Героев» в OllyDbg и смотрим на вызовы требуемой нам функции:

По адресу 0050C6F7 мы видим сравнение возвращенного GetDriveTypeA значения с цифрой «5», которая, согласно MSDN, означает, что «The drive is a CD-ROM drive»:

Меняем «CMP EAX, 5» на «XOR EAX, EAX», чтобы переход за этой инструкцией никогда не выполнялся:

Ставим сюда бряк, жмем F9, немного трассируем и видим следующее:

Собственно, нам остается лишь заменить путь к файлу heroes3.vid на нужный. Чтобы не погружаться по уши в дебри ассемблерного кода, сохраняем сделанные нами изменения и добавляем к Heroes3.exe новую секцию с выставлением требуемых привилегий. Мне удобнее всего делать это с помощью CFF Explorer. Для начала выбираем раздел «Section Headers», щелкаем правой кнопкой мыши и выбираем «Add Section (Empty Space)»:

Затем вводим размер секции. Выделим для наших нужд 4 Кб – с запасом:

Далее нам потребуется выставить привилегии для выполнения кода в этой секции. Делается это следующим образом:


Снова загружаем «Героев» в OllyDbg и по адресу 0050C704 ставим безусловный переход на начало нашей секции:

Здесь мы – хозяева, и можем делать все, что пожелаем, но мы сделаем следующее: поместим путь к файлу heroes3.vid, предварительно скопированного с компакт-диска на винчестер, в EAX и прыгнем обратно на 0050C710:

Сохраняем сделанные изменения, пытаемся запустить – провал.

Трассируем с того места, куда мы прыгнули из нашей секции, и что же мы видим?

«Герои» опять пытаются прочитать файл с диска. Недолго думая, я снова ставлю безусловный переход в созданную нами секцию и распоряжаюсь волей «Героев» по-своему:


Сохраняем, запускаем, и… Ничего. Тогда давайте посмотрим на вызов GetDriveTypeA по адресу 0050C795:

Еще одна проверка. К счастью для нас, тут достаточно сменить «CMP EAX, 5» на «XOR EAX, EAX»:

Сохраняем сделанные изменения, запускаем и, после заставки «Буки», наблюдаем, наконец, стартовый экран без всяких назойливых сообщений:

Как мы видим, все замечательно работает, но при попытке начать новую кампанию «Герои» жалуются на отсутствие каких-то ресурсов, после чего вступительный ролик идет без звука.

Я, как ярый перфекционист, сразу ринулся исправлять данную оплошность. Можно поставить бряк на MessageBox или на чтение строки «ResourceManager», но я решил следовать очевидной логике и просто скопировал с компакт-диска файл heroes3.snd туда же, где лежал heroes3.vid. Все отлично заработало, и я провел замечательный вечер, играя в третьих «Героев» – пожалуй, лучшую в мире игру.
P.S. Обращаю внимание на то, что я владею лицензионной копией диска «Героев», статья написана в образовательных целях, и вообще, ее писал мой кот.
Tags:
Hubs:
You can’t comment this post because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.