Просмотр полной версии : Поиск указателей на текст в eboot.bin на примере Hotline Miami 2
В разделе для psp Эрик подробно расписывал, как посчитать относительный адрес смещния текстовой строки, зная абсолютный и найти казатель на него.
Интересует аналогичный алгоритм поиска для витовских ибутов с целью перевести некоторые строки, которые туда зашиты.
Для примера можно взять eboot.bin из Hotline Miami 2, которую я русифицировал:
https://mega.nz/#F!E4MAnQAT!yCyQQK2kwzUI_PK1nDIWfQ
Хотелось бы доработать неполный авторский перевод, но для этого, как раз и нужно править eboot, а учитывая, что русский текст будет в utf-8, перемещать строки придётся в пустое место, т.к. их длина получится минимум в 2 раза больше, чем в оригинале.
Для наглядности предлагаю взять строки:
New game
Continue
Options
поскольку они встречаются в самом начале.
Также интересует, какой диапозон адресов можно использовать под текст, если строки могут лежать где угодно, то оптимальным было бы их переносить в область, где есть большие куски 0x00 и собирать в одном месте.
ErikPshat
31.08.2016, 20:29
lupus, пока заметил, что каждая новая секция начинается с заголовка Magik: 2D992982 и в следующей строке 2FF8FFFF
Пока башка не варит, ночью посмотрю - темнота, тишина и луна располагают :)
Я пытался простым дедовским способом искать, без декомпиляции - зная абсолютное смещение, вычислить относительное таким макаром:
адрес абсолютного смещения строки -минус- размер заголовка SCE (0xA0) -минус- размер заголовка ELF (0x60)
от полученного результата и отталкивался
NEW GAME 0x0136e3a0 - 0x100 0x0136E29F
Эту последовательность и пытался найти, учитывая Big Endian, но бес толку :/
Не уверен, что данный метод здесь применим.
Теоретически, можно было бы написать софтинку, которая сама будет искать указатели, зная адреса начала 2+ строк, по разнице их смещений, но я совсем не умею кодить :/
ErikPshat
31.08.2016, 22:12
размер заголовка ELF (0x60)
Обрати внимание, что в eboot.bin находится общий ELF-файл, внутри которого лежит ещё один ELF-файл.
Вообще размер заголовка записан по адресу 0х38 в ELF-файле, который начинается по адресу 0xF60, а там я вижу размер заголовка 0x80.
учитывая Big Endian
По-моему Little Endian (задом наперёд).
Отрезал всё лишнее пред первым эльфом, считаю
NEW GAME 0x0136d3a0 - 80 0136D320
CONTINUE 0x0136d3ac
EDITOR 0x0136d3b8
OPTIONS 0x0136d3c0
QUIT GAME 0x0136d3c8
Тоже, без толку. Спасибо, что поправил, ищу последовательность в обратном порядке.
riku.kh3
01.09.2016, 11:15
С использованием real-time debugger'а в ассемблере такие вещи надо искать. Может там поинтеры, может таблица, а может вообще в инструкцию вшита позиция строки.
riku.kh3, т.е. в текущей ситуации это не реально?
riku.kh3
01.09.2016, 16:02
От игры зависит. Если текста очень много и он идет цельным блоком, то скорее всего должна быть таблица. Можно попробовать визуально в хексе поискать нарастающие 4-байтные значения, сравнивая разницу значений с расстояниями между строками.
Такие строки, как NEW GAME может быть трудно найти, если поинтер или инструкция указывающая на нее просто рандомно лежит далеко от таблицы.
Конкретно в этом случае IDA Pro рефференс к этой строке NEW GAME не находит в коде, значит только дебаггером через брейкпоинт отлавливать (нужен DevKit и софт).
по адресу 0x136e264 начинается блок текста, перед ним, предположительно, лежит пачка указателей по 4 байта, теперь понять бы, откуда начинать отсчёт и какой размер всего этого блока (указатели + текст), тогда, по идее, можно было бы пересчитать начало строк после правки.
Пока не пойму, оно ли это...
ErikPshat
03.09.2016, 06:54
по адресу 0x136e264 начинается блок текста
Что-то с первым ELF считал и со второго ELF считал, но никак не попал в начало текста.
Вообщем текст идёт блоками.
Каждый текстовой блок начинается с хедера 2D992982 и следом приклеивается следующий текстовой блок с таким же хедером, прямо после последнего слова в предыдущем блоке. И так далее.
Может пригодится... Если отрезать первый заголовок ELF, то в позициях:
0x18 - записана позиция 012F1144 (без учёта размера заголовка) на начало блока системных модулей, начинающаяся с названия HotlineMiami2.
0х38 - размер заголовка.
0х44 - записан размер 01389E98 тела ELF-файла (без учёта заголовка) и заканчивается буквами DDDD.
0х58 - записана позиция 0138A080 (с учётом заголовка). Здесь лежит RAW-картинка(и) однозначно.
В позиции 0х01395FC8 - записан хейдер PSP2 - видимо это какой-то файл.
А теперь ещё интереснее...
Если пройти в секцию HotlineMiami2, то сразу можно увидеть смещения 012F11A0, 012F11C0, 012F11D8, 012F1144 - это указатели на позиции модулей.
А вот после FFFFFFFF, чуть далее идут немного по другому записанные смещения: 822F1A78, 822F1A88, 822F1A98, 822F1C00, 822F2148...
То есть, можно заметить, что первая цифра адресации 01 сменилась на 82.
Поэтому, адрес позиции, скорее всего, записывается через 82, что и надо искать.
лежит пачка указателей по 4 байта
<…>
Пока не пойму, оно ли это...
Меняй значение на 1 в большую сторону, может строка со второй буквы начинаться будет?..
По разниуе смещений посчитать бы как-то. Руками муторно...
Верно ли понимаю, что при помощи RinCheat http://wololo.net/talk/viewtopic.php?f=116&t=46982 можно сдампить содержимое озу и поможет ли это в поиске указателей?
ErikPshat
01.10.2016, 21:58
Верно ли понимаю, что при помощи RinCheat http://wololo.net/talk/viewtopic.php?f=116&t=46982 можно сдампить содержимое озу и поможет ли это в поиске указателей?
Ссылка для нас более правильная ;) http://www.pspx.ru/forum/showthread.php?t=106301
Ну так ты выяснил, можно ли сдампить содержимое ОЗУ?
Ещё не пробовал. Хочу другие проекты (перевод tales from space и перенос русика shovel knight) до ума довести, прежде чем здесь в дебри лезть.
С тех пор у нас появился правильный декриптор fagdec и потихоньку пилится эмулятор vita3k. Думаю, ещё через пару лет доделаем)
Edit#1: https://github.com/CelesteBlue-dev/PSVita-RE-tools/tree/master/vitadecompiler-mod/build
vBulletin® v3.8.7, Copyright ©2000-2025, vBulletin Solutions, Inc. Перевод: zCarot