Список форумов shedevr.org.ru shedevr.org.ru
Группа перевода приставочных игр "ШЕДЕВР"
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

"Отцы", требуется помощь!

 
Начать новую тему   Ответить на тему    Список форумов shedevr.org.ru -> Базовый ромхакинг
Предыдущая тема :: Следующая тема  
Автор Сообщение
Nattfrost



Зарегистрирован: 21.03.2006
Сообщения: 3

СообщениеДобавлено: Вт Мар 21, 2006 2:35 am    Заголовок сообщения: "Отцы", требуется помощь! Ответить с цитатой

Более чем уверен, что мой вопрос покажется “отцам” ромхакинга глупым, но от новичка умных вопросов ожидать и не приходится :). В свое оправдание скажу, что я перечитал все доступные FAQ и документы по ромхакингу для новичков как на сайте Шедевра, так и на других интернет-ресурсах (Romhacking.org, Zophar.net), но воз, как говорится, и ныне там. Вся надежда на вашу помощь.

В качестве жертвы был выбран ROM игры Live A Live (платформа: SNES, разработчик: SquareSoft, год выхода: 1994, тип: HiROM). Оригинальный, японский. Таблица символов в этом ROM’е включает заглавные английские буквы от A до F. Они используются для вывода информации о разработчиках игры. В качестве упражнения-разминки я решил найти пойнтер на текст

ILLUSTRATION
YOSHIHIDE
FUJIWARA

выводящийся в самом начале главы “Fung-Fu master”, сразу после выбора имени протагониста. В HEX-редакторе строка имеет следующий вид (ROM с отрезанным заголовком):

Код:

                          113198
                            ↓
…113192: DD 07 20 1C 1A 0C 59 4F 53 48 49 48 49 44 45 01 0C 46 55 4A 49 57 41 52 41 05 01 0C 1E…
                            ↑______“YOSHIHIDE”______↑        ↑_____“FUJIWARA”_____↑


Подсчитав значение пойнтера (9831, 200 не отнимал, поскольку заголовок в ROM-файле отсутствует), я полез в HEX-редактор. Изменив все найденные значения на нули, запустил эмулятор. Безрезультатно. Поиграл с значением поинтера, последовательно отнимая от него 1 (поскольку пойнтер может указывать не строку, а на управляющие коды перед ней), т.е. произвел поиск по значениям 9731, 9631, 9531, и.т.д c заменой найденных значений на нули. Результат, извините за каламбур, снова нулевой. Обозлившись, сел за написание программки, облегчающей использование метода “околонаучного тыка” в деле поиска пойнтеров вида SetOff X000. Принцип ее работы крайне прост: пользователем вводятся две строки (в HEX-кодах) – строка поиска и строка замены. Программа ищет в указанном файле участки кода, совпадающие со строкой поиска и изменяет их на строку замены. Строка поиска может быть задана с “джокерами”, т.е. в виде ?9 AB 6? ?? 0C. К моему разочарованию, этот метод “тыка” также ни к чему не привел. Понимаю, вопрос в высшей степени идиотский, но ответ на него для меня действительно важен: что я делаю не так?

И еще, так сказать, в догонку. В модифицированной версии Snes9x, которая включает в себя отладчик, есть возможность ставить точки останова. Я подумал, что эта возможность может существенно облегчить процесс поиска и нахождения пойнтеров – достаточно поставить точку останова на чтение на начало (впрочем, не обязательно начало) интересующей нас фразы, запустить код на выполнение, и отладчик услужливо выдаст участок кода, из которого произошло обращение к символьной строке. В общем-то техника этого дела известна всем, кто хоть чуть-чуть знаком с основами взлома программ для PC и с принципами работы писишных же отладчиков. Возможно я был наивен, когда думал, что эти методы универсальны, возможно, дело в чем-то другом (например, не очень прямых руках), но, к моему большому сожалению, дебаггер “спотыкаться” на бряке отказывается. Может ли кто-нибудь объяснить мне причину такого странного поведения отладчика?

Буду признателен за помощь.


Последний раз редактировалось: Nattfrost (Вт Мар 21, 2006 4:38 am), всего редактировалось 1 раз
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Nattfrost



Зарегистрирован: 21.03.2006
Сообщения: 3

СообщениеДобавлено: Вт Мар 21, 2006 2:54 am    Заголовок сообщения: Ответить с цитатой

Совсем забыл. Строка “ILLUSTRATION” находится совсем в другом месте ROM-файла. Может быть, здесь используются указатели на указатели?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Alex_231



Зарегистрирован: 13.01.2005
Сообщения: 144
Откуда: Арсеньев

СообщениеДобавлено: Вт Мар 21, 2006 10:41 am    Заголовок сообщения: Ответить с цитатой

Дебаггер не "спотыкается" потому, что у SNES адресация рома начинается не с &h000000, а с &hC00000. Таким образом к адресу в роме нужно прибавить &hC00000 и на получившийся адрес ставить бряк.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Axel
Советник


Зарегистрирован: 14.11.2003
Сообщения: 680

СообщениеДобавлено: Вт Мар 21, 2006 11:02 am    Заголовок сообщения: Re: "Отцы", требуется помощь! Ответить с цитатой

Nattfrost писал(а):
Подсчитав значение пойнтера (9831, 200 не отнимал, поскольку заголовок в ROM-файле отсутствует), я полез в HEX-редактор. Изменив все найденные значения на нули, запустил эмулятор. Безрезультатно.

что я делаю не так?

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

2. может статься, что отсутствие заголовка в файле не играет никакой роли и эмулятор загружает код в память приставки (воображаемой) с определённым смещением, поэтому при поиске указателя всё равно нужно учитывать размер хедера...
_________________
Всех их вместе переведём!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
gottax



Зарегистрирован: 16.11.2003
Сообщения: 588
Откуда: Курск

СообщениеДобавлено: Вт Мар 21, 2006 5:45 pm    Заголовок сообщения: Re: "Отцы", требуется помощь! Ответить с цитатой

Nattfrost писал(а):
...что я делаю не так?


Няя... Извиняюсь, но это называется "горе от ума". Какой нафиг дебаггер? Это не тот случай, чтобы лезть в дебри. Всё прекрасно находится через HEX-редактор за несколько минут.
Во-первых, строка "ILLUSTRATION" встречается несколько раз. Во-вторых, первое вхождение этой строки в роме лежит по адресу 801C6h (указатель к ней по адресу 80064h (FA00h). Блок текста с этой строкой располагается по 800CC_804A6h, блок поинтеров чуть выше - 80010_800CBh. Как видно, базовое смещение, которое нужно прибавлять к значению каждого поинтера, чтобы получить реальный адрес строки, равно адресу первой строки. Я не проверял остальные вхождения строки "ILLUSTRATION", но там скорее всего всё хранится по такому же приципу.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
АнС
RRC2008
RRC2008


Зарегистрирован: 08.11.2003
Сообщения: 2818

СообщениеДобавлено: Вт Мар 21, 2006 8:15 pm    Заголовок сообщения: Ответить с цитатой

Чёрт, чуется мне, это старые доки всех начинающих переводчиков дезинформируют, и они начинают либо использовать устаревшие методы, либо браться за тяжёлую артиллерию.
Более простой и универсальный способ поиска поинтеров (с помощью Relative Search) уже неоднократно описывался здесь на форуме.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Nattfrost



Зарегистрирован: 21.03.2006
Сообщения: 3

СообщениеДобавлено: Пт Мар 24, 2006 7:19 pm    Заголовок сообщения: Ответить с цитатой

Большое спасибо за ответы.

gottax
Цитата:
Во-первых, строка "ILLUSTRATION" встречается несколько раз. Во-вторых, первое вхождение этой строки в роме лежит по адресу 801C6h

А у меня почему-то по адресу 1081C6. Что-то я, видимо, не понимаю...

Цитата:
(указатель к ней по адресу 80064h (FA00h).

Странно. У меня по этому адресу находится значение F788h. В любом случае, не мог бы ты объяснить, каким образом ты нашел указатель? Результат, конечно, важен, но для меня сейчас важнее опыт. Хотелось бы въехать в суть.

АнС
Цитата:
Более простой и универсальный способ поиска поинтеров (с помощью Relative Search) уже неоднократно описывался здесь на форуме.

Я думал что эта программа позволяет искать строки в кодировке, отличной от ASCII. В моем случае искомые строки состоят из символов в кодировке ASCII и находятся, таким образом, обычным поиском в любом HEX-редакторе, без какой бы там ни было пляски с бубном… Не знал, что с помощью RS можно искать и пойнтеры… Embarassed


Последний раз редактировалось: Nattfrost (Сб Мар 25, 2006 2:12 am), всего редактировалось 1 раз
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
АнС
RRC2008
RRC2008


Зарегистрирован: 08.11.2003
Сообщения: 2818

СообщениеДобавлено: Сб Мар 25, 2006 1:15 am    Заголовок сообщения: Ответить с цитатой

Nattfrost писал(а):
АнС
Цитата:
Более простой и универсальный способ поиска поинтеров (с помощью Relative Search) уже неоднократно описывался здесь на форуме.

Я думал что эта программа позволяет искать строки в кодировке, отличной от ASCII. В моем случае искомые строки состоят из символов в кодировке ASCII и находятся, таким образом, обычным поиском в любом HEX-редакторе, без какой бы там ни было пляски с бубном… Не знал, что с помощью RS можно искать и пойнтеры…


Эта программа ищет всё, от таблицы ширины шрифта до карты тайлов.
http://shedevr.org.ru/forum/viewtopic.php?p=13731#13731
Способ описан в readme проги.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
gottax



Зарегистрирован: 16.11.2003
Сообщения: 588
Откуда: Курск

СообщениеДобавлено: Сб Мар 25, 2006 9:02 am    Заголовок сообщения: Ответить с цитатой

Nattfrost писал(а):
А у меня .почему-то по адресу 1081C6. Что-то я, видимо, не понимаю....


У меня гудовое имя рома Live_A_Live_(J).smc. CRC 837772A3. Есть еще, кажется, версия [p1]. Проверь.


Nattfrost писал(а):
не мог бы ты объяснить, каким образом ты нашел указатель? Результат, конечно, важен, но для меня сейчас важнее опыт. Хотелось бы въехать в суть.


В общих чертах только. Раз есть некая последовательность строк текста, значит где-то в роме должна быть некая последовательность указателей (на SNES - обычно двухбайтных), в точности повторяющая структуру следования строк текста (теоретически). Чаще всего бывает, что указатели находятся либо чуть выше, либо чуть ниже блока текста. Размер заголовка и прочую муть я в расмотрение не беру, учитываю лишь, что байты в указателе идут в обратном порядке. Разница (в байтах) между двумя соседними поинтерами должна быть равна разнице между соответствующими ими строками.
Потом высчитываю абсолютный адрес для первого указателя (и первой строки соответственно), и его прибавляю к каждому поинтеру, чтобы узнать реальный адрес строки. Только учти, что абсолютный адрес в одном роме может быть иным для другого блока текста и поинтеров к нему.
Если ничего похожего не нашёл - юзай RelSearch.
Если ничего не понял - не унывай, лучше дойти позже, но своими мозгами.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов shedevr.org.ru -> Базовый ромхакинг Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group