Не так давно приобрел игру FarCry 4 и она мне сразу очень понравилась. Со временем захотелось немного поковыряться во внутренностях этой игры и написать для нее чит.

Немного поковырявшись в игре при помощи отладчика, мне удалось без особого труда узнать, как сделать следующие функции: бесконечные патроны, стрельба без перезарядки, телепортация игрока, скорострельность, убрать отдачу. Так же узнал, как увеличить высоту прыжка игрока. Но вот когда я принялся искать, как сделать игрока бессмертным (мне казалось, что в этом ничего сложного не будет), возникли трудности.

Для начала при помощи Cheat Engine нашел адрес здоровья персонажа и поставив брекпоинт на запись. Нашел инструкцию, которая изменяет здоровье. Естественно, как и в большинстве игр, эта инструкция отвечает за изменение здоровья всех персонажей в игре, будь то враги, или свои, или даже транспорт (автомобили, самолеты). Такие задачи мне решать не впервой и я знаю, что нужно найти, чем игрок отличается, допустим, от автомобиля или от врага, произвести инъекцию кода и перед изменяющей инструкцией добавить проверку. В результате чего эта инструкция будет выполнятся для всех объектов — кроме игрока.

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

Я приступил к поискам читов для FarCry 4 в интернете и нашел чит для последней версии игры 1.9. Скачал, антивирус забил тревогу. Следующий чит, который скачал, не работал, но антивирус он не разозлил. 3-й скачанный чит вроде оказался без вирусов и рабочий.

Первым делом я решил проверить исполняемый файл чита при помощи PEiD.



Как можно догадаться, ничего хорошего надпись «Not a valid PE file» не предвещает. Это означает, что над ним издевались упаковщики, протекторы и прочая нечисть. Но не все так плохо, ведь мы же не хотим модифицировать данный файл, он и так полностью бесплатный и распространяется свободно. Все, что нам нужно это узнать — откуда данный чит, что читает и куда записывает.

Для записи данных в чужой процесс есть WinApi функций WriteProcessMemory, а для чтения ReadProcessMemory. Теперь проверим, устоит ли великая и могучая защита данного чита перед API монитором. Перед OllyDBG она устояла; после того, как я попробовал открыть его в этом отладчике, он написал, что не хочет работать с невалидными файлами.

Запускаем игру и под контролем API монитора запускаем чит. API монитор к этому файлу, как оказалось, никаких претензий не имеет. Теперь проверим, перехватит ли он вызовы двух нужных нам функций. Для этого активируем в чите бессмертие и смотрим на результат.



Сначала чит прочитал один байт из памяти игры, а затем еще 3 раза произвел запись. При первом вызове он записал 5 байт, при втором — 21 байт, и при третьем вызове снова 5 байт. Если немного подумать, то можно догадаться, что к чему. Сначала производится замена оригинальной инструкции на безусловный переход, затем по адресу, куда будет совершаться прыжок, записывается код размером 21 байт и напоследок в конец этого кода добавляется безусловный переход на следующую инструкцию, которая находится за оригинальной (которая изменяет здоровье).

Однако на самом деле я угадал только со вторым и третьим вызовом, при первом вызове по адресу FC64.FCE_Engine_GetCloudTypeCount+21F923 записывается следующая инструкция:
comiss xmm9,[rbx+0C]
.
Ниже находится изображение основного кода, который записывается при втором вызове функции WriteProcessMemor.



Детально я не стал разбираться, как этот чит делает игрока бессмертным. Решил просто скопировать этот алгоритм и добавить в свой чит.

Также хочу добавить лично мое мнение по поводу читов типа «Трейнер». Я считаю, что защитить такие читы от взлома практически невозможно, поскольку известно их слабое место, которое заключается в том, что они в любом случае должны вызывать WinApi функции WriteProcessMemory и ReadProcessMemory и как бы там не шифровались данные, в эти функции они поступают в чистом виде. Также я хочу сказать, что если вы собрались писать серьезные читы с уникальным функционалом, то лучше это реализовать в виде DLL, которую при запуске игры инжектировать в процесс — там уже не так просто будет адресочки узнать.

Если трейнер скомпилирован под .NET, то API монитор откажется с ним работать. В этом случае можно в отладчике установить брекпоинт на функции WriteProcessMemory и ReadProcessMemory, а когда он сработает — посмотреть содержимое стека и извлечь оттуда адрес, по которому будут записаны данные.

То, что я написал выше — это мое личное мнение, и кто-то может с этим согласится, а кто-то нет. Надеюсь, данная статья вам понравилась.

Не советую вам «копипастить» функционал чужих читов, поскольку вы при этом не набираетесь опыта. Также создание читов таким способом не будет приносить удовольствие.

Комментарии (15)


  1. VorobyevEvgeny
    15.05.2015 17:18
    +35

    Краткое содержание:

    не стал отчаиваться и решил пойти не совсем честным путем — просто «посмотреть», как это делают другие
    Детально я не стал разбираться, как этот чит делает игрока бессмертным. Решил просто скопировать этот алгоритм и добавить в свой чит.


    1. drayv
      15.05.2015 17:22

      lol


    1. spyderDFX
      15.05.2015 17:24
      +11

      Пост вообще полон взаимоисключающих параграфов:

      Не советую вам «копипастить» функционал чужих читов, поскольку вы при этом не набираетесь опыта. Также создание читов таким способом не будет приносить удовольствие.


  1. scam
    15.05.2015 17:23
    +1

    Но в поисках этого отличия я просидел несколько дней

    Впрочем, не стал отчаиваться и решил пойти не совсем честным путем — просто «посмотреть», как это делают другие читы, в которых есть функция бессмертия.

    Вот жизнь у человека.


    1. easyman
      15.05.2015 17:26
      +3

      Ну как посмотреть!
      Кто-то водку пьёт, кто-то читы копирует.


      1. scam
        15.05.2015 17:31
        +3

        Судя по статье, он эти вещи делает одновременно.


        1. VorobyevEvgeny
          15.05.2015 17:32
          +1

          Ага, а называет это Реверс-инжиниринг* и Game Development*


      1. Rastishka
        15.05.2015 19:07
        +1

        Всегда радуют такие бинарные люди.
        Или читы, или водка. Других альтернатив нет, конечно…


  1. lexore
    15.05.2015 17:37
    +17

    — Мы будем читерить читы других читеров.

    image


  1. Zibx
    15.05.2015 20:26
    +4

    Это же всегда называлось trainer, а cheat — возможность оставленная разработчиком.


    1. OnYourLips
      17.05.2015 12:07

      Нет, чит — это общее определение, означающее нечестное поведение.
      Англоговорящие люди могут сказать это слово даже в отношении мусульманина или вегетарианца, который ест свинину.


      1. Zibx
        19.05.2015 04:56

        Trainer, cheat. В обычном диалоге можно сказать что мусульманин читерит. Так же называется измена жене, но «исследование чита» звучит как-то дико.


  1. spanasik
    15.05.2015 20:28
    +3

    Я сделал этот пост постом добра.


    1. Zifix
      15.05.2015 21:44
      +2

      image


  1. Beltoev
    17.05.2015 01:39

    Мы встроили чит в твой чит, чтобы ты мог читерить, когда читеришь