 |
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 и на получившийся адрес ставить бряк. |
|
Вернуться к началу |
|
 |
Axel Советник

Зарегистрирован: 14.11.2003 Сообщения: 680
|
Добавлено: Вт Мар 21, 2006 11:02 am Заголовок сообщения: Re: "Отцы", требуется помощь! |
|
|
Nattfrost писал(а): | Подсчитав значение пойнтера (9831, 200 не отнимал, поскольку заголовок в ROM-файле отсутствует), я полез в HEX-редактор. Изменив все найденные значения на нули, запустил эмулятор. Безрезультатно.
что я делаю не так?
|
1. сначала убедись, что это именно те саме строки, для которых ты
собираешься искать указатели, для этого замени их текст на нечто другое и посмотри, что выведет игра...
2. может статься, что отсутствие заголовка в файле не играет никакой роли и эмулятор загружает код в память приставки (воображаемой) с определённым смещением, поэтому при поиске указателя всё равно нужно учитывать размер хедера... _________________ Всех их вместе переведём! |
|
Вернуться к началу |
|
 |
gottax

Зарегистрирован: 16.11.2003 Сообщения: 588 Откуда: Курск
|
Добавлено: Вт Мар 21, 2006 5:45 pm Заголовок сообщения: Re: "Отцы", требуется помощь! |
|
|
Nattfrost писал(а): | ...что я делаю не так? |
Няя... Извиняюсь, но это называется "горе от ума". Какой нафиг дебаггер? Это не тот случай, чтобы лезть в дебри. Всё прекрасно находится через HEX-редактор за несколько минут.
Во-первых, строка "ILLUSTRATION" встречается несколько раз. Во-вторых, первое вхождение этой строки в роме лежит по адресу 801C6h (указатель к ней по адресу 80064h (FA00h). Блок текста с этой строкой располагается по 800CC_804A6h, блок поинтеров чуть выше - 80010_800CBh. Как видно, базовое смещение, которое нужно прибавлять к значению каждого поинтера, чтобы получить реальный адрес строки, равно адресу первой строки. Я не проверял остальные вхождения строки "ILLUSTRATION", но там скорее всего всё хранится по такому же приципу. |
|
Вернуться к началу |
|
 |
АнС RRC2008


Зарегистрирован: 08.11.2003 Сообщения: 2818
|
Добавлено: Вт Мар 21, 2006 8:15 pm Заголовок сообщения: |
|
|
Чёрт, чуется мне, это старые доки всех начинающих переводчиков дезинформируют, и они начинают либо использовать устаревшие методы, либо браться за тяжёлую артиллерию.
Более простой и универсальный способ поиска поинтеров (с помощью Relative Search) уже неоднократно описывался здесь на форуме. |
|
Вернуться к началу |
|
 |
Nattfrost
Зарегистрирован: 21.03.2006 Сообщения: 3
|
Добавлено: Пт Мар 24, 2006 7:19 pm Заголовок сообщения: |
|
|
Большое спасибо за ответы.
gottax
Цитата: | Во-первых, строка "ILLUSTRATION" встречается несколько раз. Во-вторых, первое вхождение этой строки в роме лежит по адресу 801C6h |
А у меня почему-то по адресу 1081C6. Что-то я, видимо, не понимаю...
Цитата: | (указатель к ней по адресу 80064h (FA00h). |
Странно. У меня по этому адресу находится значение F788h. В любом случае, не мог бы ты объяснить, каким образом ты нашел указатель? Результат, конечно, важен, но для меня сейчас важнее опыт. Хотелось бы въехать в суть.
АнС
Цитата: | Более простой и универсальный способ поиска поинтеров (с помощью Relative Search) уже неоднократно описывался здесь на форуме. |
Я думал что эта программа позволяет искать строки в кодировке, отличной от ASCII. В моем случае искомые строки состоят из символов в кодировке ASCII и находятся, таким образом, обычным поиском в любом HEX-редакторе, без какой бы там ни было пляски с бубном… Не знал, что с помощью RS можно искать и пойнтеры… 
Последний раз редактировалось: Nattfrost (Сб Мар 25, 2006 2:12 am), всего редактировалось 1 раз |
|
Вернуться к началу |
|
 |
АнС 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 проги. |
|
Вернуться к началу |
|
 |
gottax

Зарегистрирован: 16.11.2003 Сообщения: 588 Откуда: Курск
|
Добавлено: Сб Мар 25, 2006 9:02 am Заголовок сообщения: |
|
|
Nattfrost писал(а): | А у меня .почему-то по адресу 1081C6. Что-то я, видимо, не понимаю.... |
У меня гудовое имя рома Live_A_Live_(J).smc. CRC 837772A3. Есть еще, кажется, версия [p1]. Проверь.
Nattfrost писал(а): | не мог бы ты объяснить, каким образом ты нашел указатель? Результат, конечно, важен, но для меня сейчас важнее опыт. Хотелось бы въехать в суть. |
В общих чертах только. Раз есть некая последовательность строк текста, значит где-то в роме должна быть некая последовательность указателей (на SNES - обычно двухбайтных), в точности повторяющая структуру следования строк текста (теоретически). Чаще всего бывает, что указатели находятся либо чуть выше, либо чуть ниже блока текста. Размер заголовка и прочую муть я в расмотрение не беру, учитываю лишь, что байты в указателе идут в обратном порядке. Разница (в байтах) между двумя соседними поинтерами должна быть равна разнице между соответствующими ими строками.
Потом высчитываю абсолютный адрес для первого указателя (и первой строки соответственно), и его прибавляю к каждому поинтеру, чтобы узнать реальный адрес строки. Только учти, что абсолютный адрес в одном роме может быть иным для другого блока текста и поинтеров к нему.
Если ничего похожего не нашёл - юзай RelSearch.
Если ничего не понял - не унывай, лучше дойти позже, но своими мозгами. |
|
Вернуться к началу |
|
 |
|
|
Вы не можете начинать темы Вы можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
Powered by phpBB © 2001, 2005 phpBB Group
|