Перейти к содержанию

Все про отладку в NES-эмуляторах


MasterGH

Рекомендуемые сообщения

Если вы что-то будите писать, то можете писать про любые другие платформы, эмуляторы и отладчике.

В этом постей 2 части по созданию читов в игре M4K.

Игра: M4K.

Дебагер: fceux-2.1.4a-win32

Исходник этого эмулятора и различная документация:

fceu2.1.4a.rar

Сайт этого отладчка:ссылка


Часть1.Отключение таймера с помощью отладки.

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

Сразу покажу к чему мы придём. 

post-3-1291353608,27_thumb.png

С помощью этой галочки мы с можем отключать и включать таймер теоритически на любом эмуляторе. Здесь русифицированная версия Cheat Engine, но на оригинальной версии скрипты тоже должны работать.

Ну а теперь, о том как это было сделано.

1. Обзор команд микропроцессора 6502 

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

NOP   NoOperation

DEC   Decrement Memory by One

DEX   Decrement Index X by One

DEY   Decrement Index Y by One

INC   Increment Memory by One

INX   Increment Index X by One

INY   Increment Index Y by One

И другие команды в большой документации для продвинутого создателя читов:

6502.rar.

Можете скачать у нас, а можно взять отсюда.

Не очень плохой дебагер: fceux-2.1.4a-win32

post-3-1291213918,14_thumb.png

Как видим тут свои инструкции ассемблера, не тек к которым мы привыкли.

2. Часть. Простой нопинг.

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

 Подопытным кроликом будет M4K, т.е. не пользователь M4K, а игрушка +)

post-3-1291353523,64_thumb.png

Рис.1

Таймер, который равен 96 секундам и постоянно уменьшаетсяэто замечательная возможность продемонстрировать как его остановить используяотладчик.

Для начала найдём адрес таймера.

Поставим игру на паузу.

Заходим сюда в RAM Search

post-3-1291353528,79_thumb.png

Рис.2

Первый поиск.

post-3-1291353532,77_thumb.png

Рис.3

Снимаем паузу с игры и вновь ставим, на экране 94 секунды.

Второй поиск:

post-3-1291353537,05_thumb.png

Рис.4

Как видим, осталось 4 результата. Каждый адрес последовательно выделяем и нажимаем кнопку Add Cheat, чтобы найти из них рабочий путём заморозки. Закрываем этоокно. Идём в другое.

post-3-1291353541,54_thumb.png

Рис.5

Откроется окно

post-3-1291353546,54_thumb.png

Рис.6

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

post-3-1291353550,58_thumb.png

Рис.7

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

Кликнем правой кнопкой мышки по первому адресу, чтобыперейти в hex редактор, а уже из него быстро попадём куда надо.

post-3-1291353555,29_thumb.png

Рис.8

Ещё не забудьте снять заморозку (я забыл снять заморозку на рис.6) Перешли сюда, смотрим

post-3-1291353560,48_thumb.png

Рис.9

Опять кликнем, чтобы вызвать меню и установить брейкпоинт на запись. На запись потому , мы хотим найти инструкцию которая записывает истереть её.

post-3-1291353565,33_thumb.png

Рис.10

У вас появиться большое окно отладчика.

post-3-1291353570,02_thumb.png

Рис.11

Снимаем паузу с игры и тут же прерываемся на знакомойинструкции вычитания.

post-3-1291353574,94_thumb.png

Рис.12

Выделите и удалите брейкпоинт (хотя без разницы, т.к. выможете его оставить)

Кликнем левой кнопкой мышки на место указанное стрелкой на рисунке 12.

Появится интересное окно

post-3-1291353579,99_thumb.png

Рис.13

Инструкция DEC состоит из 2 байтов, NOP - из одного. Значит нужно два NOP-а. Сколько байткакая инструкция занимает смотрите в документации или можете не смотреть, а узнать об этом прямо в этом окне на рис.13 

Напишем nop и нажмем клавишу Enter. И ещё раз. Вот что вышло.

post-3-1291353584,83_thumb.png

Рис.14

post-3-1291353589,71_thumb.png

Рис.15

На рис. 15 байты в главном окне ещё не перерисовались.  Итак мы видим, что мы запишем два нопа, тудагде  надо и не нарушим логику кода.

Сохраним (Save)для возможной отмены.

Нажмём Applay (обновить/подтвердить)

Увидим следующие изменения.

post-3-1291353593,94_thumb.png

Рис.16

Ага, значит мы стерли команду нопами. Закрываем окно нарис. 16 И видим изменение в коде.

post-3-1291353599,37_thumb.png

Рис.17

Теперь нажмем на кнопку RUN и снимаем паузу.

И видим, что таймер теперь застыл на 93 секундах.

post-3-1291353603,85_thumb.png

Рис.18

Отлично, работает!

Переходим к автоматизации активации и деактивации чита записью nop-ов и восстановлением оригинального кода

07: C284:C6 B2 - таймер включен

07: C284:EA EA - таймер выключен

Есть множество инструментов, которыми можно это сделать: CE, MHS и в конце концов своим трейнером.  В Artmoney есть ручной поиск сигнатуры, его можно использовать для нахождения адреса, а затем записывать в него пару нопов или восстанавливать предыдущее значение. Но Artmoney меня не устроила темчто там надо делать многое вручную. Идеальный вариант писать свою программу, ноэто долго и поэтому я решил сделать всё на Cheat Engine.

Итак, скопируем кусок сигнатуры в блокнот (шрифт Courier New, чтобы соблюдалась табуляция):


07:C286:A5 B2     LDA $00B2 = #$5D
07:C288:85 07     STA $0007 = #$00
07:C28A:A9 00     LDA #$00
07:C28C:85 08     STA $0008 = #$00
07:C28E:85 09     STA $0009 = #$00
07:C290:85 0D     STA $000D = #$00
07:C292:20 BA D2  JSR $D2BA
07:C295:AD 74 06  LDA $0674 = #$09
07:C298:69 40     ADC #$40
07:C29A:8D 3E 06  STA $063E = #$4A
07:C29D:AD 73 06  LDA $0673 = #$03
07:C2A0:69 41     ADC #$41
07:C2A2:8D 3F 06  STA $063F = #$44
07:C2A5:60        RTS
07:C284:C6 B2     DEC $00B2 = #$5D

Сигнатура представляет из себя байты кода:

C6 B2 A5 B2 85 07 A9 00 85 08 85 09 85 0D 20 BA D2

 

Здесь не все байты кода, но если нужно, т.е. если чти работать не будет, то возьмите другие байты.

Пишем скрипт для CE:


Игра NES: M4K (любой эмулятор)
Чит-код: Остановка таймера
Дата: 12.3.2010
Автор скрипта: MasterGH
Версия CE: Cheat Engine 5.6  RUS (v 2.0)
}

[ENABLE]
aobscan(_faddress,C6B2A5B28507A90085088509850D20BAD2)
_faddress:
db EA EA

[DISABLE]
aobscan(_faddress,EAEAA5B28507A90085088509850D20BAD2)
_faddress:
db C6 B2
{

Запускаем Cheat Engine.

В процессах подключаем эмулятор.

Идём в автоассемблер, вставляем этот скрипт и связываем с основной таблицей.

Переименовываем чит в «Остановка таймера»

post-3-1291353608,27_thumb.png

Рис.19

Теперь очень удобно нажимать галочку для активации идеактивации таймера.

Минусы, у этого метода следующие вручную придётсявыбирать процесс и вручную выбирать таблицу с читами. И ещё один минус вам нужно настроить поиск в настройках - сканировать память типа MEM_MAPPED.

post-3-1291353613,88_thumb.png

Рис.20

Если вы теперь решите использовать CE для сканирования памяти Windows-игр, то Вам придется отключать эту настройку вручную, т.к. сканирование замедляется с этой настройкой.

На этом пока всё.


Часть2 . Продолжение.... 

Точнее это черновик. К сожалению чит не доделан из-за не удобного отладчика в эмуляторе (пока нет времени времени доделать чит)

post-3-1291718894,77_thumb.png

Черновик приводить в нормальный вид некогда. Просто вот скрипт CE на постоянное здоровье в игре M4K


aobscan(addres1,F6 B8 A9 20 8d 06 20 b5 b8 38 e9 01 4a 4a 4a)
aobscan(addres2,02 04 00 02 04 00 02 04 00 02 04 00 02 04 00 02 04)

addres1:
db 4c 0b cb ea

addres2:
db F6 B8 8D 16 CB A9 00 85 B8 AD 16 CB 4C FB C1 02 04


[DISABLE]
aobscan(addres1, 4c 0b cb ea 8d 06 20 b5 b8 38 e9 01 4a 4a 4a)
aobscan(addres2, F6 B8 8D 16 CB A9 00 85 B8 AD 16 CB 4C FB C1 02 04)

addres1:
db F6 B8 A9 20

addres2:
db 02 04 00 02 04 00 02 04 00 02 04 00 02 04 00 02 04
[ENABLE]

Ссылка на комментарий
Поделиться на другие сайты

 Спасибо, ссылку я посмотрел.  Это статья для начинающих.

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

[ENABLE]
aobscan(addres1,F6 B8 A9 20 8d 06 20 b5 b8 38 e9 01 4a 4a 4a)
aobscan(addres2,02 04 00 02 04 00 02 04 00 02 04 00 02 04 00 02 04)

addres1:
db 4c 0b cb ea

addres2:
db F6 B8 8D 16 CB A9 00 85 B8 AD 16 CB 4C FB C1 02 04


[DISABLE]
aobscan(addres1, 4c 0b cb ea 8d 06 20 b5 b8 38 e9 01 4a 4a 4a)
aobscan(addres2, F6 B8 8D 16 CB A9 00 85 B8 AD 16 CB 4C FB C1 02 04)

addres1:
db F6 B8 A9 20

addres2:
db 02 04 00 02 04 00 02 04 00 02 04 00 02 04 00 02 04

Раньше я писал аналогичный скрипт сохраняя регистр А в стек, а стек оказался действительно полным и поэтому в него нельзя было просто так сохранить временные данные. Вместо сохранения в стек я использовал адрес в codecave находящийся ниже тела инъекции нового условия.... Здоровье первого героя не будет уменьшаться, здоровье второго героя будет уменьшаться, но этого не будет видно. Если бить по врагу, то в конце-концов он быстро умрёт. Пока я не понял почему здоровья врага видимо не уменьшается, скорее из-за меняющихся флагов в регистре флагов.

Я сделал для себя вывод, что по началу привыкнуть к ассемблеру под "этот" процессор сложно, нужно упорство. А потом всё легче и легче и уже что-то делаешь на автомате: ищешь адрес, ставишь бряки, ищешь codecave, пишешь условие на ассемблере, прыжок на кодкейв, прыжок обратно, копируешь байты, проверяешь сигнатуры, пишешь скрипт на CE и чит для рома готов и он теоретически не зависит от типа эмулятора. В CE при запуске скрипта нужно поставить настройки памяти, как это было указано в первом посте.

Пока в этой теме от меня никакой информации больше не будет  :) Кому интересно, могут повторить что я делал и задать вопросы, пока я помню, что и как я делал.  

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.