Вход

Просмотр полной версии : Поиск указателей на текст в eboot.bin на примере Hotline Miami 2


lupus
31.08.2016, 10:23
В разделе для 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

Пока башка не варит, ночью посмотрю - темнота, тишина и луна располагают :)

lupus
31.08.2016, 21:13
Я пытался простым дедовским способом искать, без декомпиляции - зная абсолютное смещение, вычислить относительное таким макаром:
адрес абсолютного смещения строки -минус- размер заголовка 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 (задом наперёд).

lupus
31.08.2016, 23:08
Отрезал всё лишнее пред первым эльфом, считаю

NEW GAME 0x0136d3a0 - 80 0136D320
CONTINUE 0x0136d3ac
EDITOR 0x0136d3b8
OPTIONS 0x0136d3c0
QUIT GAME 0x0136d3c8

Тоже, без толку. Спасибо, что поправил, ищу последовательность в обратном порядке.

riku.kh3
01.09.2016, 11:15
С использованием real-time debugger'а в ассемблере такие вещи надо искать. Может там поинтеры, может таблица, а может вообще в инструкцию вшита позиция строки.

lupus
01.09.2016, 15:29
riku.kh3, т.е. в текущей ситуации это не реально?

riku.kh3
01.09.2016, 16:02
От игры зависит. Если текста очень много и он идет цельным блоком, то скорее всего должна быть таблица. Можно попробовать визуально в хексе поискать нарастающие 4-байтные значения, сравнивая разницу значений с расстояниями между строками.

Такие строки, как NEW GAME может быть трудно найти, если поинтер или инструкция указывающая на нее просто рандомно лежит далеко от таблицы.

Конкретно в этом случае IDA Pro рефференс к этой строке NEW GAME не находит в коде, значит только дебаггером через брейкпоинт отлавливать (нужен DevKit и софт).

lupus
02.09.2016, 23:50
по адресу 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, что и надо искать.

Yoti
03.09.2016, 11:04
лежит пачка указателей по 4 байта
<…>
Пока не пойму, оно ли это...
Меняй значение на 1 в большую сторону, может строка со второй буквы начинаться будет?..

lupus
03.09.2016, 11:05
По разниуе смещений посчитать бы как-то. Руками муторно...

lupus
04.09.2016, 23:17
Верно ли понимаю, что при помощи 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

Ну так ты выяснил, можно ли сдампить содержимое ОЗУ?

lupus
02.10.2016, 03:18
Ещё не пробовал. Хочу другие проекты (перевод tales from space и перенос русика shovel knight) до ума довести, прежде чем здесь в дебри лезть.

Yoti
14.09.2018, 13:18
С тех пор у нас появился правильный декриптор fagdec и потихоньку пилится эмулятор vita3k. Думаю, ещё через пару лет доделаем)

Edit#1: https://github.com/CelesteBlue-dev/PSVita-RE-tools/tree/master/vitadecompiler-mod/build