1. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

Читерство, часть 2: немного ASM

Автор: Helmut · 26 апр 2016 · ·
  1. Первой части заметки вполне достаточно для любых игровых задач. На этом можно и остановиться. Но так же не интересно. Всегда можно что-нибудь улучшить. В способах из первой части нам нужно либо каждый раз вводить требуемое число, либо замораживать его. Но можно сделать и так, чтобы оно вообще не менялось. Это например. Тут уже простор для фантазии безграничен, можно сделать очень много чего.

    Простая подмена кода

    1. Находим адрес нужной переменной, затем ставим бряк на запись, как было описано в предыдущей части (Find out what writes to this address). Делаем что-нибудь в игре, чтобы бряк сработал.

    2. Смотрим в окно трассировщика и видим команду, например, mov [eax],ecx. В общем, все понятно. По адресу из регистра EAX (который мы так долго искали) помещается значение регистра ECX. А это уже дает простор для фантазии. Выделяем ее кликом левой кнопки мыши и нажимаем сбоку кнопку "Show disassembler".

    3. Далее, мы имеем три простейших варианта:

    а) Можем просто отключить эту команду, и тогда соответствующее значение в игре никогда не будет меняться. В окне дебаггера кликаем по нашей команде правой кнопкой и выбираем "Replace with code that does nothing", после чего в открывшемся окне нажимаем "Ок". Видим, что несколько строк в коде заменилось на Nop. Но такой способ не очень удобен, потому что если это, например, деньги, то в большую сторону их число также не будет расти. И если мы начали игру с одним рублем, то один рубль будет у нас всегда.

    б) Можно сделать иначе. Дважды кликаем левой кнопкой по команде и в открывшемся окне заменяем команду "mov [eax],ecx" на "mov [eax],F423F". После этого может появиться предупреждение, что новая длина команды не соответствует предыдущей и будет предложено автоматически выровнять ее с помощью Nop. Соглашаемся на это. Теперь при любом изменении данного параметра в игре его значение будет устанавливаться на 999999.

    в) Еще можно сделать тоже самое, что в пункте (б), но другим путем. Изменить не саму команду, а значение регистра в данной точке. Кликаем по команде правой кнопкой и выбираем пункт "Change register at this location". В открывшемся окне в регистр ECX вписываем число F423F, все остальное оставляем без изменений. Жмем "Ok".

    [​IMG]

    Инъекция кода

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

    1. Выполняем пункты 1 и 2 из предыдущей главы про подмену кода.

    2. Проследим, чтобы строка с нужной командой была выделена в окне отладчика и нажимаем в верхнем меню Tools -> Auto Assemble.

    3. В открывшемся окне редактора скриптов нажимаем Template -> Code Injection и подтверждаем адрес нужного нам сегмента.

    [​IMG]

    4. Получаем шаблон скрипта, содержащий выделение нового сегмента и набор меток для переходов. В самом низу - адрес исходного сегмента и заглушка, на которую будет заменено то, что там было. А под меткой originalcode содержится, как следует из названия, то, что было в коде до того, как мы туда влезли. Причем нужна нам была только первая команда, вторая попала сюда потому, что относится к тому же сегменту, который мы будем менять. Поэтому вторую команду оставляем, где была, а с первой будем работать.
    Код:
    alloc(newmem,2048)
    label(returnhere)
    label(originalcode)
    label(exit)
    
    newmem: //this is allocated memory, you have read,write,execute access
    //place your code here
    
    originalcode:
    mov [eax],ecx
    cmp dword ptr [0EA94DDC],00
    
    exit:
    jmp returnhere
    
    082F3238:
    jmp newmem
    nop
    nop
    nop
    nop
    returnhere:
    
    5. Пишем скрипт. Не будем в качестве примера извращаться с чем-то сложным, а добавим, как было сказано выше, команду сравнения и переход. Если [EAX] больше или равно ECX, то переход будет выполнен, если меньше - то нет.
    Код:
    alloc(newmem,2048)
    label(returnhere)
    label(originalcode)
    label(exit)
    
    newmem: //this is allocated memory, you have read,write,execute access
    //place your code here
    cmp [eax],ecx
    jge originalcode
    mov [eax],ecx
    
    originalcode:
    cmp dword ptr [0EA94DDC],00
    
    exit:
    jmp returnhere
    
    082F3238:
    jmp newmem
    nop
    nop
    nop
    nop
    returnhere:
    
    6. Нажимаем кнопку "Execute", убеждаемся, что в окне отладчика на место команды встала заглушка, проверяем в игре.

    Надо еще что-нибудь улучшить

    А теперь автоматизируем еще и этот процесс. Для этого нужно добавить в код скрипта метки [ENABLE] и [DISABLE].

    1. Одну метку ставим в начало кода, вторую, как ни странно, в конец. Но это еще не все. Нам же нужно, чтобы при выключении скрипта установленная ранее заглушка заменялась обратно на то, что там было. Поэтому под метку [DISABLE] копируем адрес заглушки и исходный код. Но для начала освободим выделенную ранее для скрипта память, для порядка.
    Код:
    [ENABLE]
    alloc(newmem,2048)
    label(returnhere)
    label(originalcode)
    label(exit)
    
    newmem: //this is allocated memory, you have read,write,execute access
    //place your code here
    cmp [eax],ecx
    jge originalcode
    mov [eax],ecx
    
    originalcode:
    cmp dword ptr [0EA94DDC],00
    
    exit:
    jmp returnhere
    
    082F3238:
    jmp newmem
    nop
    nop
    nop
    nop
    returnhere:
    
    [DISABLE]
    dealloc(newmem)
    082F3238:
    mov [eax],ecx
    cmp dword ptr [0EA94DDC],00
    
    2. В меню редактора скриптов выбираем File -> Assign to current cheat table. Указатель на наш скрипт появляется в нижней таблице главного окна CE. Закрываем все лишние окна и сохраняем получившийся результат в виде файла *.CT. Теперь мы можем включать и выключать чит простым кликом мышки по чекбоксу.

    [​IMG]

    Собственно, и на этом можно не останавливаться, а скомпилировать наш скрипт в виде самостоятельного exe-трейнера. Для этого в CE тоже есть нужный инструмент, позволяющий изобразить несложный гуй, назначить горячие клавиши и, собственно, скомпилировать. Но об этом нет смысла писать подробно, там все достаточно очевидно и интуитивно понятно.

    Зайчатки ООП

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

    1. Если в процессе трассировки мы видим команду вида mov [ebx+18],ecx - это намекает на то, что мы имеем дело со структурой. В регистре EBX содержится адрес структуры, а 18h - смещение относительно ее начала, по которому находится нужное нам свойство. Смотрим значение регистра EBX и запоминаем его.

    2. Вызываем отладчик и в его меню выбираем Tools -> Dissect data/structures. Откроется окно анализатора структур.

    3. В маленькое поле ввода слева-вверху окна анализатора вводим запомненный ранее адрес из регистра EBX. Ну или копипастим, если еще не закрыли окно трассировщика. В меню выбираем Structures -> Define new structure. На все вопросы отвечаем утвердительно, ничего не меняем. Появится куча значений, но пока тут мало что понятно. Надо искать, с чем сравнивать.

    4. Теперь нужен адрес другой, аналогичной структуры. Например, отвечающей за врага. Найти можно двумя способами. Если известны какие-либо значения, поступаем точно также, как и с первой структурой. Находим адрес переменной с нужным параметром, ставим бряк на запись, определяем значение регистра EBX. Если ничего не известно, то можно поступить иначе. После того, как сработал бряк на запись для первой структуры, в окне трассировщика выделяем левым кликом нужную команду и кнопкой "Show Disassembler" открываем отладчик. В окне отладчика кликаем правой кнопкой мыши по той же команде и в выпадающем меню выбираем "Find out what adresses this instruction accesses". Откроется новое окошко, в которое в порядке очереди будут записываться адреса, с которыми будет работать наша команда при каждом ее вызове. Возвращаемся в игру и бьем врага (или делаем еще что-нибудь, что изменит нужный нам параметр нужного нам объекта). Сразу после этого ставим игру на паузу и переключаемся обратно в CE. Если мы успели ткнуть в паузу достаточно быстро, значит нужный нам адрес будет последним в окошке поиска адресов. Теперь из полученного адреса нужно вычесть смещение 18h, чтобы найти начало структуры. Запоминаем результат.

    [​IMG]

    5. Возвращаемся в окно анализатора структур в его меню нажимаем File -> Add extra adresses. Рядом с полем, куда вводили адрес первой структуры, появится еще одно. Вводим туда только что найденный адрес второй структуры. В таблице появляется второй список адресов и значений. Все отличия от первого сразу же подсвечиваются красным. Тупо втыкаем в таблицу и ищем что-нибудь подозрительное. Следует отметить, что отладчик несколько кривоват, и склонен вполне себе невинные значения иногда определять как указатели. Если в каком-то адресе возникли сомнения, можно кликнуть по нему правой кнопкой и выбрать "Add to adress list", чтобы отправить его в нижнюю таблицу основного окна CE и там разобраться, что он означает или куда ведет.

    [​IMG]

    6. В данном случае, после нескольких изменений ситуации в игре с последующими проверками состояния структур выясняется, что нужное нам значение находится по смещению 14h. Теперь в нашем читерском скрипте мы можем сделать дополнительную проверку, проверять, понятное дело, будем значение [ebx+14].

    Заодно, пока работаем с анализатором структур, могут найтись еще какие-нибудь полезные свойства указанного игрового объекта, которые тоже можно будет как-нибудь использовать в зависимости от нашей фантазии. Например, кроме здоровья сразу сделать еще и выносливость.

    А тут опять нафиг не нужные копии картинок

Комментарии

  1. Mel Shlemming
    Напиши лучше, как взламывать игры на РПГмейкере с помощью Артмани.
  2. Helmut
    @Mel Shlemming, я не пользуюсь Artmoney, я пользуюсь Cheat Engine. Она мощнее и лучше.
  3. Mel Shlemming
    @Helmut, "мощнее и лучше" и заумнее.
  4. Helmut
    @Mel Shlemming, все, что мощнее и лучше, всегда сложнее. Раз для тебя это непреодолимое препятствие - пользуйся артмани, кто ж тебе мешает.
  5. ThisSuXX
      Mel Shlemming нравится это.
  6. Helmut
    Теперь вот сижу и думаю, что имел ввиду комментатор. Почему это лучше? Чем именно это лучше? И для кого это лучше?
  7. Вредный
    Я тож нифифа нипонил. И, думаю, таких большинство. Поэтому и бывает лучше то, что проще. Но ты ведь для себя пишешь.

    А вот стал бы ты патчики делать, например, чтоб в игре читы работали, и все б тя любили очень.
  8. Helmut
    Разумеется. Для этого ведь и нужен дневник. То, что интересно кому-нибудь еще, кроме меня, можно писать и на форуме. А тут - записываю вещи, которыми пользуюсь не слишком часто, и поэтому могу забыть, но когда-нибудь может пригодиться. Да и когда записываешь что-то, оно как-то и запоминается лучше.

    Для этого же существуют всевозможные трейнеры, не? Да и в том же CE никто не мешает скомпилировать написанный скрипт в EXE-файл, получится трейнер.
  9. PuzzyWuzzy
    уууу, тред матёрых читеров:to_keep_order: я однажды если не путаю с помощью hex редактора подправил сейв в Anvil of Dawn так сразу почувствовал себя хацкером 99лвл :closedeyes:
  10. Kristobal Hozevich Hunta
    @Helmut, интересная информация.

    Является ли CE отдалчиком, и если да, то насколько функциональным?
Чтобы оставить комментарий просто зарегистрируйтесь и станьте участником!
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление