Автор неизвестен - Ромхакинг для начинающих. Sega Mega Drive.
Название: | Ромхакинг для начинающих. Sega Mega Drive. | |
Автор: | Автор неизвестен | |
Жанр: | Хакерство, Программирование игр | |
Изадано в серии: | неизвестно | |
Издательство: | неизвестно | |
Год издания: | 2010 | |
ISBN: | неизвестно | |
Отзывы: | Комментировать | |
Рейтинг: | ||
Поделись книгой с друзьями! Помощь сайту: донат на оплату сервера |
Краткое содержание книги "Ромхакинг для начинающих. Sega Mega Drive."
Аннотация к этой книге отсутствует.
К этой книге применимы такие ключевые слова (теги) как: Sega Mega Drive
Читаем онлайн "Ромхакинг для начинающих. Sega Mega Drive.". [Страница - 5]
char_id
Теперь если нажать правой кнопкой и выбрать Jump to Xref's, мы увидим переходы к участкам кода игры, связанные с данным параметром. Эти 'куски' кода и будут нас интересовать больше всего.
Если же ничего не нашлось (пусто по обоим адресам) - значит:
1) участок в котором запрашивается этот адрес не был дизасмнут.
2) этот адрес запрашивается относительно другого адреса. (относительная адресация)
3) вся игра использует относительный метод адресации к RAM.
(пример - Rock n' Roll Racing, все значения берутся от-но адреса FF8000,который записан в регистре A4 процессора)
4) 1+3 варианты сразу.
В этом случае на помощь приходит дебаг.
Эмулятор который мы будем использовать для дебага GENSVKNTrace.
Запускаем, открываем РОМ файл , потом переходим в опции Дебаг-Main 68k Debugger, откроется окно.
Находим брейкпоинты на ОЗУ. В первое или любое поле вписываем наш адрес FFxxxx. Ставим галочки 'чтение' или 'запись', или обе сразу и галочку 'установить брейкпоинт'. Нажимаем ОК.
Игра продолжается. теперь просто надо 'прокрутить' игру или поиграть до того момента , пока не срабатоет брейкпоинт (само откроется окно дебага с надписью 'сработал брейкопоинт на чтение (запись)!'
После того как окно откроется мы увидим код, по которому этот адрес запросился. (например чтение номера(ID) игрока), команда по которой он запросился находится в самой первой строчке. Запомним этот адрес и теперь перейдем к этому участку в базе IDA, и поставим там метку (rename_ read_char_id) или (write_char_id). Хоткей ренейма - 'N'.
Стоит отметить что таких участков может быть достаточно много. (т.е. нужно ждать другого брейкпоинта, при других игровых условиях, пробовать ставить на запись отдельно, на чтение отдельно и ждать.
Брейкпоинт для PC (program counter) - т.н. программный счетчик, необоходим для определения чтения исполняемого кода.
Несмотря на то, что в эмуляторе написано 'брейкпоинты на озу', можно спокойно использовать дебаг и на ROM (т.е. область кода и данных). Теперь если написать любой адрес ROM в поле дебага и поставить галочку 'PC', то если в этом находится программа, то сработает брекпоинт на PC (в случае если эта часть программы будет выполняться) - ну например код выполнения выстрела или спецприема. Если же поставить ROM-адресс на 'чтение' и сработает брейкпоинт значит в этом месте не код, а данные. На 'запись' для rom ставить не нужно, т.к. ни о какой запись в (read-only-memory) картидж не может идти и речи, это используется толко для RAM(ОЗУ), а 'pc', т.е код, практически не встречается в области RAM.
PC (program counter) - счетчик который определяет адресс текущего расположения выполняемой процессором команды. Очень часто применяется для относительной адресации. (от текущего места +$xxxx = итоговый адрес).
Примеры адресации:
move.w ($FFCECE).l,d0 - абсолютная полная (32битная запись, но сега 'держит' только 24)
move.w ($CECE).w,d0 или при этом два байта move.w ($FFFFCECE).w,d0 (но в hex 'FFFF' не будет) - абсолютный адрес но задается 2 байтами. трюк состоит в том что первые считаются $FFFF и мы попадаем тоже в RAM, но это соблюдается только для адресов >$8000, при меньших мы попадем в ROM. (это особенность 16-битной адресации)
move.w $4ECE(a4),d0 - адрес равняется $4ECE + число, в регистре a4 процессора. в данном случае a4=$FF8000+$4ECE=$FFCECE. В других случаях в a4 может быть что угодно, регистры могут быть от a0 до a6 и в них может быть записано что угодно, и может постоянно менятся в зависимости от программы. Что точно находиться в регистре в данный момент времени можно посмотреть в дебаггере.
Во всех трех случаях значение из памяти (RAM) читается и записывается в регистр d0 процессора.
Запись же выглядит 'наоборот': move.w d0,($FFCECE).l
Команда может быть не обязательно move, а другой (add, sub, и т.д.)
move.w unkn_00(pc,d1.w),d0 - чтение данных от текущего места + PC + d1. (IDA автоматически определяет расположение unkn_00 при условии что d1=0)
Подробнее о командах и регистрах будет рассмотрено позже.
Hot trick:
Используете GG-коды и GGConv.exe (game genie converter), чтобы найти уже найденные другими адреса в ROM и RAM, и допишите их в базу переименовав и поставив метки.
GG-коды можно найти в книге кодов codebook.exe, и на сайтах.
Запустим конвертер и выберем вкладку GEN (sega GENesis).
Вбиваем GG-code и получаем HEX-code.
Многие адреса уже представлены в виде HEX-code и их конвертировать не нужно.
HEX-code выглядит в формате adress:data.
пример FF1234:0005 (интересуемый адрес FF1234, значение вприцнипе нас не интересует), так если в описании чита указано что это жизни, следует переименовать, или начать с 5-ого (4-ого) уровня - значить это уровень, а --">
Теперь если нажать правой кнопкой и выбрать Jump to Xref's, мы увидим переходы к участкам кода игры, связанные с данным параметром. Эти 'куски' кода и будут нас интересовать больше всего.
Если же ничего не нашлось (пусто по обоим адресам) - значит:
1) участок в котором запрашивается этот адрес не был дизасмнут.
2) этот адрес запрашивается относительно другого адреса. (относительная адресация)
3) вся игра использует относительный метод адресации к RAM.
(пример - Rock n' Roll Racing, все значения берутся от-но адреса FF8000,который записан в регистре A4 процессора)
4) 1+3 варианты сразу.
В этом случае на помощь приходит дебаг.
Эмулятор который мы будем использовать для дебага GENSVKNTrace.
Запускаем, открываем РОМ файл , потом переходим в опции Дебаг-Main 68k Debugger, откроется окно.
Находим брейкпоинты на ОЗУ. В первое или любое поле вписываем наш адрес FFxxxx. Ставим галочки 'чтение' или 'запись', или обе сразу и галочку 'установить брейкпоинт'. Нажимаем ОК.
Игра продолжается. теперь просто надо 'прокрутить' игру или поиграть до того момента , пока не срабатоет брейкпоинт (само откроется окно дебага с надписью 'сработал брейкопоинт на чтение (запись)!'
После того как окно откроется мы увидим код, по которому этот адрес запросился. (например чтение номера(ID) игрока), команда по которой он запросился находится в самой первой строчке. Запомним этот адрес и теперь перейдем к этому участку в базе IDA, и поставим там метку (rename_ read_char_id) или (write_char_id). Хоткей ренейма - 'N'.
Стоит отметить что таких участков может быть достаточно много. (т.е. нужно ждать другого брейкпоинта, при других игровых условиях, пробовать ставить на запись отдельно, на чтение отдельно и ждать.
Брейкпоинт для PC (program counter) - т.н. программный счетчик, необоходим для определения чтения исполняемого кода.
Несмотря на то, что в эмуляторе написано 'брейкпоинты на озу', можно спокойно использовать дебаг и на ROM (т.е. область кода и данных). Теперь если написать любой адрес ROM в поле дебага и поставить галочку 'PC', то если в этом находится программа, то сработает брекпоинт на PC (в случае если эта часть программы будет выполняться) - ну например код выполнения выстрела или спецприема. Если же поставить ROM-адресс на 'чтение' и сработает брейкпоинт значит в этом месте не код, а данные. На 'запись' для rom ставить не нужно, т.к. ни о какой запись в (read-only-memory) картидж не может идти и речи, это используется толко для RAM(ОЗУ), а 'pc', т.е код, практически не встречается в области RAM.
PC (program counter) - счетчик который определяет адресс текущего расположения выполняемой процессором команды. Очень часто применяется для относительной адресации. (от текущего места +$xxxx = итоговый адрес).
Примеры адресации:
move.w ($FFCECE).l,d0 - абсолютная полная (32битная запись, но сега 'держит' только 24)
move.w ($CECE).w,d0 или при этом два байта move.w ($FFFFCECE).w,d0 (но в hex 'FFFF' не будет) - абсолютный адрес но задается 2 байтами. трюк состоит в том что первые считаются $FFFF и мы попадаем тоже в RAM, но это соблюдается только для адресов >$8000, при меньших мы попадем в ROM. (это особенность 16-битной адресации)
move.w $4ECE(a4),d0 - адрес равняется $4ECE + число, в регистре a4 процессора. в данном случае a4=$FF8000+$4ECE=$FFCECE. В других случаях в a4 может быть что угодно, регистры могут быть от a0 до a6 и в них может быть записано что угодно, и может постоянно менятся в зависимости от программы. Что точно находиться в регистре в данный момент времени можно посмотреть в дебаггере.
Во всех трех случаях значение из памяти (RAM) читается и записывается в регистр d0 процессора.
Запись же выглядит 'наоборот': move.w d0,($FFCECE).l
Команда может быть не обязательно move, а другой (add, sub, и т.д.)
move.w unkn_00(pc,d1.w),d0 - чтение данных от текущего места + PC + d1. (IDA автоматически определяет расположение unkn_00 при условии что d1=0)
Подробнее о командах и регистрах будет рассмотрено позже.
Hot trick:
Используете GG-коды и GGConv.exe (game genie converter), чтобы найти уже найденные другими адреса в ROM и RAM, и допишите их в базу переименовав и поставив метки.
GG-коды можно найти в книге кодов codebook.exe, и на сайтах.
Запустим конвертер и выберем вкладку GEN (sega GENesis).
Вбиваем GG-code и получаем HEX-code.
Многие адреса уже представлены в виде HEX-code и их конвертировать не нужно.
HEX-code выглядит в формате adress:data.
пример FF1234:0005 (интересуемый адрес FF1234, значение вприцнипе нас не интересует), так если в описании чита указано что это жизни, следует переименовать, или начать с 5-ого (4-ого) уровня - значить это уровень, а --">
Книги схожие с «Ромхакинг для начинающих. Sega Mega Drive.» по жанру, серии, автору или названию:
Автор неизвестен - Мотоцикл для начинающих Жанр: Авто-, мото- и велотранспорт, ПДД Год издания: 2006 |
Автор неизвестен - Тайна башни (сборник) Жанр: Классический детектив Год издания: 2014 |