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

Самое первое, о чем я подумал – защита строится на вызове 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. Обращаю внимание на то, что я владею лицензионной копией диска «Героев», статья написана в образовательных целях, и вообще, ее писал мой кот.

Самое первое, о чем я подумал – защита строится на вызове 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. Обращаю внимание на то, что я владею лицензионной копией диска «Героев», статья написана в образовательных целях, и вообще, ее писал мой кот.