Перевод Spyro 3: Взлом и программы
|
|
aleksusklim | Сообщение # 1 Воскресенье, 26.06.2011, 14:19 |
фдулыгылдшь
Редактор
«1066»
Где: Не в городе Драконов
|
Работа с текстовой частью перевода введётся на code.google.com/p/spyro3-rus, обсуждение перевода (а не взлома) В темеПеревод Spyro 3: Текст В этой теме происходит обсуждение перевода, а также создание софта для потрошения игры. Важные сообщения: Структура WAD-файлов Спец. символы и File Paint 1 | Извлечение и добавление текста | О звуке | В продолжение о звуке | Вариант перевода Buzz's Dungeon и Midday Gardens
Сообщение отредактировал aleksusklim - Среда, 29.04.2015, 19:51 |
|
| |
Spyro1998 | Сообщение # 136 Среда, 11.04.2012, 20:09 |
Яйцо
Житель Города
«53»
Где: Не в городе Драконов
|
Да в принципе озвучку уже можно начинать, но вот только нужно, чтобы ваши голоса в точности подходили под движении рта в игре. Текст который подходит к движениям рта находится в роликах выше - я создал такой перевод какой бы потходил( а то я просто мог дословно перевести и дать вам типо " расхлёбывайте сами", но я ведь тоже учавствую в переводе, а тогда зачем я сам себе буду вредить? ). Я создал новый почтовый ящик, на него я думаю мы будем скидывать голоса, но не забывайте подписываться! Вот e-Mail : Spyro3.Translate@yandex.ru Добавлено (11.04.2012, 20:09) --------------------------------------------- Взломщики, даже не думайте взламывать, я об этом позаботился. Тем более это новый почтовый ящик созданный только для перевода!
Спайро навсегда
|
|
| |
aleksusklim | Сообщение # 137 Суббота, 14.04.2012, 00:40 |
фдулыгылдшь
Редактор
«1066»
Где: Не в городе Драконов
|
Что за хр… Какого ч…
Так. Мой ответ здесь: http://www.spyro-realms.com/forum/48-11436-151922-16-1334349784
but nobody came
Сообщение отредактировал aleksusklim - Суббота, 14.04.2012, 00:44 |
|
| |
DrWho | Сообщение # 138 Суббота, 14.04.2012, 00:44 |
Мудрый Дракон
Почетный Житель
«1371»
Где: Не в городе Драконов
|
Извиняюсь сразу за оффтоп, тему разделили на две части: взлом (эта) и остальное http://www.spyro-realms.com/forum/48-11436-2
Сообщение отредактировал DrWho - Суббота, 14.04.2012, 00:54 |
|
| |
aleksusklim | Сообщение # 139 Воскресенье, 15.04.2012, 13:05 |
фдулыгылдшь
Редактор
«1066»
Где: Не в городе Драконов
|
Quote тему разделили на две части
Моё мнение? Стало хуже!!Добавлено (15.04.2012, 13:05) --------------------------------------------- Взлом шрифта.
В теме перевода японской версии я придумал 100%-ный алгоритм взлома любой графики в любой игре:
http://www.spyro-realms.com/forum/2-11306-151384-16-1333556799
Теперь настало время изменить наш шрифт! Давайте сперва взглянем на него в оригинале:
Разбираемся. Шрифт как бы записан в прямоугольную таблицу. Все серые знаки имеют одну палитру 16 цветов, а разноцветные кнопочки – другую. В ней используется только 4 цвета + чёрный, а остальные 11 цветов – пустуют. Что нам нужно? Первое – перерисовать каждую букву. Формат букв – квадрат 12*9 пикселей. Вот смотрите:
Это я внедрил туда другую палитру. Она находится в полоске внизу (вернее, это не она, а просто полоска покрашена в цвета палитры). Чуть правее находится 12*9 в белой рамке, который я разрисовал этими цветами. Он характеризует одно знакоместо. Покрываю этим все буквы:
Дальше интереснее. Засовываем их в игру, сперва изменив надпись на перечисление почти всех букв через пробелы:
http://i.piccy.info/i7....nt4.png
На первый символ «Х!» не смотрите – это я так отделил начало надписи, он не совпадёт. А вот всё остальное:
http://i.piccy.info/i7....nt5.png
(там всё ровно, просто из-за такой раскраски кажется, что строки наклонные) Анализируем эти скриншоты и понимаем, что всегда отрисовывается область 12*9. НО! Взгляните на пробелы. Они иногда короче, иногда длиннее. Всё это надо выяснить… Это может означать, например то, что если вместо запятой «,» использовать широкую «W», то последующий пробел можно пропустить. И ещё куча моментов, где удастся отвоевать несколько знакомест. Что с «Й» да «Ё»? Заметили: они уже есть! Это «~» в нижнем ряду во втором столбце; и «’’» в последнем столбце предпоследнего ряда. Но как их вызвать… А я узнал как! Это делается через собачку «@» и последующий управляющий символ. Точно не знаю, но это может быть «Е@i», «Е@d», «Е@?», «Е@a», «Е@!» – надо ещё проверять. Но какой ценой!! Целых ТРИ знакоместа для одной буквы! Ну уж нет… Лучше нарисуем «Ё» да «Й» сами где-нибудь на других буквах, чем так жертвовать…
Перерисуем шрифт? Сначала структура: Каждая буква занимает неполную часть 12*9 + тень. Эта самая тень в точности копирует контуры буквы, но сдвинута на один пиксель по диагонали в нижний правый угол. Тень монотонна. А буква покрашена в диагональный серый градиент. На всё отводится 16 цветов. Притом первый – чёрный прозрачный. Как перерисовать? Есть идея: Белым цветом на чёрном 12*9 рисуем силуэт буквы. Так для каждого знака (даже для тех, которые не изменим – чтобы они на отличались от истинно «наших» впоследствии). Потом копируем силуэт и сдвигаем вправо-вниз – получаем тень. Изменяем её цвет. Накладываем силуэт на заранее подготовленное поле 12*9 с уже нарисованным на нём нашим градиентом (буква будет как бы вырезана из прямоугольника, чтобы сквозь силуэт проглядывал градиент). Далее накладываем готовый знак (заполненный градиентом) на тень, получая конечный символ. И так с каждым!
Кто этим займётся?
Мне самому, честно говоря, не очень хочется – долго. Но я могу расписать метод ещё раз на примере нескольких букв.
TO-DO:
1) Утвердить цвета градиента. 2) Нарисовать исходный 12*9 в этих цветах. 3) Определить цвет тени (или даже два, почему нет?) 4) Придумать силуэты всех букв и знаков.
А что с цветными кнопками? Проще всего было бы оставить их как есть. Но! Вспомните кнопки Spyro1? Может нарисуем свои? Или хоть тень добавим? Я не художник, но фантазёр. Поэтому свою задумку воплотить не смогу… Жду кого-нибудь с хорошей фантазией и способностями к рисованию!
but nobody came
Сообщение отредактировал aleksusklim - Суббота, 14.04.2012, 01:06 |
|
| |
Spyro1998 | Сообщение # 140 Воскресенье, 15.04.2012, 13:26 |
Яйцо
Житель Города
«53»
Где: Не в городе Драконов
|
Я готов изменить шрифт ( я не первый раз этим занимаюсь). Но я не совсем понял изменение этого шрифта. Еслим можешь опиши это подробнее на примере одной буквы!
Спайро навсегда
|
|
| |
aleksusklim | Сообщение # 141 Воскресенье, 22.04.2012, 22:00 |
фдулыгылдшь
Редактор
«1066»
Где: Не в городе Драконов
|
Комментарий из двух частей!
Quote (Spyro1998) ( я не первый раз этим занимаюсь)
Даже так! Ну ладно, попробую объяснить способ взлома… Но первое: я ещё не уверен во всех тонкостях, поэтому способ лишь примерный. Его надо доработать! Иначе, если бы он был мне абсолютно ясен, я бы сам нарисовал шрифт! Второе: алгоритм взлома графики – сумма всех моих умозаключений в этой теме + ветке японского Spyro1, поэтому вы должны их прочитать, иначе не поймёте, что надо делать.
Есть поле 12х9 пикселей. Оно полностью в нашем распоряжении. Высота обычно ровно 9, но некоторые буквы (например «m» строчная и несколько длинных как «q») немного короче по высоте. Так что последнюю границу пикселей лучше не занимать. С длиной сложнее. Она зависит от толщины заменяемой буквы. То есть «W» даст все 12, а вот «i» может и сильно стиснуть. Но поле всегда 12х9. Делаем букву.
…Мой пример не совсем честный. Я использовал Word, рисуя в нём иллюстрирующую таблицу, вместо того, чтобы практиковаться на текстуре шрифта. Потому что нужно ещё кучу работы сделать, чтобы определить цвета градиента и заполнить ими поле. Но даже потом – нас ждут ещё десятки проверок, по результатам которых мы приравняем каждую букву нужному знакоместу. Идеи на этот счёт:
– Цифры не трогать. – Только верхний регистр. – Символ «точки» и «запятой» переместить на самые широкие буквы, чтобы не ставить после них пробел. – Создать символ «многоточие», чтобы «. . .» не занимал три байта. – Найти два сливающихся символа и написать в них «НЕТ». Смекнули? Мы станем переводить «No» как «QW», что отобразит «НЕТ». Потому что узкое «no» встречается почти везде. – Также и «Spyro» = «UVXYZ» = «СПАЙРО»! Только найти бы буковки правильные… – Можно переназначить стрелочку « [ », добавить к ней тень – а то она словно невтемная… – Перерисовать символы кнопок, но это уж потом. – Буквы «Й» и «Ё» вывести как отдельные буквы, а не использовать диакритику. – Можно дорисовать скобочки «(» и «)»
Объяснение концепции создания поля символов.
Имеем 12*9 пикселей и 14 цветов для разукрашивания его. Почему 14? Потому что первый – чёрный – прозрачность. Остаётся 15. Но нужна ещё тень (ведь используем её?). Так что 14. Но если будет меньше, то можно оставить экстра цвет для каких-нибудь ещё нужд или тень многотонной сделать. Раскрасить поле можно ровно по диагонали или под наклон. Как выполнить второе я не догадался, а вот диагонально – легко: http://Klimaleksus.narod2.ru/Files/GH/abc1.PNG (Цвета только для примера, и каждая цифра – один цвет). Хм.. Использовано только 10 цветов. А если чуть расточительнее: http://Klimaleksus.narod2.ru/Files/GH/abc2.PNG О! Уже чуть ли не перебор. Но пока пойдёт. Примерно так будет выглядеть готовое поле: http://Klimaleksus.narod2.ru/Files/GH/abc3.PNG Тёмные цвета, разумеется, должны быть в углу, но Word не имеет такой палитры. Но нам пока без разницы, ибо это лишь пример.
Теперь очищаем поле. Рисуем на нём одним цветом саму букву. Монотонно. А потом другим добавляем ей тень. Я сделал это сдвигом на один пиксель вниз и вправо. Ну я не знаю… Предложите что-нибудь получше, если считаете, что так не канает. Рисуем трёхцветный макет: http://Klimaleksus.narod2.ru/Files/GH/abc4.PNG
Это всё должно быть на настоящем bitmap на самом деле. А пока – суть вот в чём: Делаем цвет буквы прозрачным, а тени – последним не использованным (15-тым) и накладываем его поверх нашего поле. Выходит: http://Klimaleksus.narod2.ru/Files/GH/abc5.PNG
Похоже? – На что!? Теперь сами цвета. Нельзя же использовать реально белый, серый и чёрный! Взглянем на оригинальную палитру: http://Klimaleksus.narod2.ru/Files/GH/abc6.PNG Что тут у нас… Третий – цвет тени. Последние три цвета не используются, но свободны (возможность их применения я доказал в комментарии выше на скриншотах) Однако наши цвета должны быть такими же, но не этими. Ну… желтоватыми! Равномерный плавный жёлто-коричнево-болотный градиент на 14 цветов. Как? Не знаю… Можно в фотошопе задать ровный градиент от самого светлого (прямо со скриншота) до самого тёмного (но не тени и не чёрного!), а потом плавный градиент превратить в 8-битный BMP. Только с 15-ти цветной палитрой. Это легче сделать в Corel-Photo-Paint (описал в японской теме). А уж из созданных адаптированных цветов собрать поле 12*9…
Потом нарисовать все буквы, включая те, которые мы не хотим менять (и цифры!), иначе они просто испортятся при внедрении нашей палитры. Придется перерисовывать вообще всё.
И последняя часть – расположить все буквы в тайле шрифта так, чтобы они определяли нужные байты выбранным способом. По этому сопоставлению мы выведем таблицу перекодировки, которой будем шифровать все шрифты.
Можно сделать один общий шрифт и внедрять его во все уровни, либо для некоторых уровней создать свой особый шрифт и перекодировку. Пока не знаю зачем, но возможно пригодиться!
В атласе по идее есть свой другой шрифт. Я его ещё не исследовал, но думаю, что он почти такой же. Там предлагаю вывести в отдельные символы римские «I» и «II», потому что многие яйца спарены по заданиям (Скейтинг 1 / Скейтинг 2 и.т.д), чтобы номер «два» не занимал одно лишнее знакоместо.
Объёмные буквы. Пока для их взлома проделано работы – 0%. Но если мы их не взломаем, то прощай кубок за лучший перевод… А если всё-таки хакнем, то придётся считаться с их таблицей соответствия. То есть наше сопоставление шрифта должно быть равно сопоставлению объёмных букв, потому что некоторые слова идентичны и там и тут. Но скорее всего эти самые буквы будут гораздо сильнее привязаны к размерам (у нас 12*9, а там будет n-ное количество полигонов на символ, что свободы не прибавляет…), и придётся наверно наше сопоставление шрифта под них подгонять. Но это потом.
Всё! Приступайте к перерисовке, если поняли меня. Но у меня такое чувство, что на 100% меня понимает только nihonjin.
Взлом ДЛИНЫ текста! (да, я доковырялся и до неё…)
Ставил кучу опытов на файлах Greatest Hits (только не спрашивайте, где я их взял!). По звуку, по графике, по текстам. Сначала общие факты: – Если в эмуляторе сохранить savestate, то она будет работать даже без диска или образа (да хоть Run BIOS), но только до тех пор, пока не произойдёт глобальная смена действия. Это например показ атласа, гибель, выход в подуровень или любой другой портал. – Назойливая Зоя ещё как может появляться! Достаточно загрузить сохранёнку взломанной версии. А «текущие яйца» приравниваются количеству «атласных яиц» как раз про загрузке сохранёнки. – Файл SPEECH.STR какой-то коцаный. Его просто так нельзя скопировать. Можно через WinHex>Tools>OpenDisk и дважды щёлкнуть на файле, выделить всё и сохранить. Но я не уверен, что его потом можно будет также внедрить обратно. Разве что обычным копированием как файла в CdGenPS2. – Многие субфайлы, их части и сам SCUS_944.67 грузятся в ОЗУ прям как есть. Без изменений, без адаптации. То есть прямое изменение файла «в натуре» приведёт точно к такому же изменению оперативной памяти. А ведь там вся индексация…
Думаем дальше. Я взял уровень Spooky Swamp (потому что перевёл его) и ставил эксперименты над ним. А также над главным EXE. Как лежат имена уровней? Null-terminated. Лады, а как используются? По-очереди? А вот фиг! Они работают с указателем на адрес каждого вхождения. А сами строки разделены нулями – одним, двумя, тремя или четырьмя. Почему? Посмотрим: Нули заменены решётками, строки перенесены вручную, логически. Видим, что количество знаков в любой строке кратно четырём. То есть строка «Harbor Speedway» – 15 символов. Это (4)*4-1. Поэтому имеем один нулевой разделитель. А следующая через одну «Haunted Tomb» – 12 символов. Это (4)*3. Однако ноль на конце необходим, поэтому (4)*4-4. Зачем? Потому что система 32 бита. И 90% всех переменных – четырёхбайтные. И поэтому нужно обязательно соблюдать порядок, чтобы надпись вдруг не сдвинула все последующие данные, иначе чтение переменных или адресов пойдёт промеж настоящих квартетов. Так может сдвигать разрешено, но всегда на (4)*n?
Не-а. Хоть на 4, хоть на 16, хоть на 1024 – любой сдвиг содержимого убивает игру. Иногда не убивает, а плодит глюки: живые существа начинают бегать, падать, проходить сквозь стены и.т.д.
Но где-то же лежит адрес на строку! Как бы его найти…
Продолжение ниже
Сообщение отредактировал aleksusklim - Воскресенье, 22.04.2012, 22:24 |
|
| |
aleksusklim | Сообщение # 142 Воскресенье, 22.04.2012, 22:25 |
фдулыгылдшь
Редактор
«1066»
Где: Не в городе Драконов
|
Продолжение
Алгоритм поиска адреса на строку 1) Запускаем Epsxe > Run BIOS. 2) Нажимаем CTRL+H – режим взломщика. 3) Открываем ArtMoney, выбираем нужный процесс (Epsxe/pec) 4) В «(pec) Cheat Hacking Engine» выбираем «Equal value / Char (1 byte)» даём поиск (continue). Потом жмём «Add/Remove R.», вводим «Start: 1 / End : 1FFFFE» – Remove. В таблице окажется лишь два крайних адреса = 0. В ArtMoney – поиск – точное значение – 1 байт – адреса ВСЕ. Потом в PEC – Modify на первое – сделать = 1. В ArtMoney – отсеять =1. Находи несколько адресов, добавляем только первый. Повторяем то же со адресом 801FFFFF. Находим второй в ArtMoney. Если отнять от второго адреса первый, то получим (десятичный) 2097151. Всё верно. Мы только что сопоставили реальные адреса RAM эмулятора виртуальным адресам PlayStation. У меня это числа 0094C020 и 00B4C01F. Все дельнейшие взломы ArtMoney должны быть с опцией «Диапазон адресов – Ваш набор > » и вставить найденные адреса начала и конца. Либо если используете мой Epsxe, то пропустите этот пункт, используйте мои. 5) Перезагрузите Epsxe, выберите образ игры и зайдите в нужный уровень > CTLR+H. 6) Определите надпись для трассировки. Для примера – «Sunrise Spring Home». 7) ArtMoney > Искать > Точное значение > «Sunrise Spring Home» > Тип – Текст > Диапазон адресов – Ваш набор (найденные) > ОК. 8) Будет найден один адрес, занесите его в таблицу. 9) Щёлкните по «Текст х байт» и измените его на «Тип – целое 1 байт». 10) В PEC дайте поиск по этому значению, которое появилось вместо текста (код первого символа). 11) В ArtMoney измените его. 12) В PEC продолжите поиск (не продолжая игру!) по новому изменённому значению. 13) Будет найден единственный адрес. 14) Откройте Калькулятор > Инженерный > Hex. Введите его. 15) Преобразуйте в десятичную систему и скопируйте. 16) ArtMoney > Искать > Точное > {вставьте адрес} > Тип – ваш набор – отметить «целое 4 байта» > ОК. 17) Будет найден единственный (дай бог) адрес – указатель на строку. 18) Добавьте в таблицу, правый клик по нему > Редактор памяти. 19) Увидите где лежат указатели! Перепечатайте оттуда немного шестнадцатеричных цифр куда-нибудь в Блокнот. 20) Откройте в WinHex приблизительное место для проверки (файл SCUS_944.67) и сделайте Search > Find Hex Values > {вставьте перепечатанное сюда}. 21) Если что-то найдётся, то вы сможете понять, как там всё устроено…
Вот так «ничем» этот метод и заканчивается. Вот что я нашёл: http://Klimaleksus.narod2.ru/Files/GH/hex.png Абсолютное совпадение. Теперь можно изменять данные файла, и это реально изменит поведение игры. Главное ничего не напутать.
Думаем дальше. Мы знаем адрес на строку. Как изменить длину этой строки? Сдвигать всё равно нельзя – мы же не будем отлавливать десятки адресов по последующим записям… Может тогда найти пустое пространство, и выставить указатель туда? А можно ли вообще его менять? Пока решение – увеличить одну строку за счёт уменьшения другой. И чем ближе друг к другу будут эти строки, тем легче выполнить изменение адреса. Указатели идут абсолютные, но при таком методе нам важно относительное показание квартетов, а не полный адрес. Грубо говоря, там десяток добавил, а тут – убрал. Разумеется с уже изменёнными длинами строк. Муторно! Да. Однако результативно. Но стоит ли оно того, если всё придётся делать вручную?
А я пока искал ещё строковые константы. Это имена уровней, приведённые выше, названия сценок. Имена Спайро-Шейла-Бёрд-Бентли-Агент9 – все те, за кого можно играть (в зелёных диалогах отображается имя персонажа). Это всё глобально. А что локально? Имена живых говорящих существ и их тексты. Также часть меню паузы, где инструкции по управлению. А ещё ЯЙЦА! (которые почему-то разделены всегда только одним нулём…)
Анализировал список яиц. И знаете что! После него ДОФИГА свободного места! Кучи килобайтов! И они напрямую записаны из суб-субфайла номер два. Всегда! Во всех уровнях есть тонны свободного места. Ну просто девать некуда… Возможно ли его использовать? Я залил после яичек первую фразу Бианки (самый длинный текст во всей игре!) в ОЗУ. Получил на него указатель, отняв от абсолютного адреса разницу между адресным пространством Epsxe и виртуальной игрой (пункт 4). Этот адрес залил вместо указателя на первую фразу первого светлячка Spooky Swamp. Кстати, это было сложно! Нужно точно попасть на 4 байта до начала текста. Там всё странно: имена персонажей начинаются вот прям с текста, а их реплики – с некого квартета, который не дай бог зацепить и – конец игре моментальный! А вот имена менять – так я могу хоть на что указатель закинуть – и будет другое имя. Хоть на «Sony Computer…» в самом начале EXE. Или на реплику, вот: http://Klimaleksus.narod2.ru/Files/GH/talk1.jpg Видали? Это не скопированный текст, это просто указатель на имя персонажа приравнен указателю на первую букву его реплики. Но не той, которую он говорит сейчас.
А вот обратно (сделать реплику равную имени) не получиться. Потому что каждая реплика имеет префикс – 4 байта. Он как-то определят, будет ли разговор закончен по нажатию кнопки, или персонаж скажет ещё что-нибудь; также регулирует поведение «треугольника», но есть что-то изменить – игра падает мгновенно. И вот на мою встроенную речь Бианки клевать не хотело… Тогда я немного продублировал собственный текст персонажа и залил его поверх и яиц и моего текста. Вуаля! http://Klimaleksus.narod2.ru/Files/GH/talk2.jpg http://Klimaleksus.narod2.ru/Files/GH/talk3.jpg http://Klimaleksus.narod2.ru/Files/GH/talk4.jpg http://Klimaleksus.narod2.ru/Files/GH/talk5.jpg Вот! Я изменил длину! Очень сильно изменил. И такое можно проделать везде! Два недостатка – сложный процесс и «глобальность» места назначения. Скорее всего наше «пустое пространство» глобально на всём уровне, включая все подуровни. И если ТАК менять ВЕСЬ текст, то место рано или поздно закончиться. Поэтому есть четыре варианта удлинения текста («глоб» – один раз для всех подуровней; «лок» – относится только к единственной фразе/реплике):
1) Махинации со шрифтом (глоб) 2) Превращение нулей в буквы (лок) 3) Изменение соседних указатель за счёт друг друга (лок) 4) Вынесение реплик в «яичную» зону (глоб)
Плюсы и минусы каждого метода: Первый: Плюсы – + Гибкость, если всё удастся. + Простая реализация. + Определённо безопасно. Минусы: – Трудно нарисовать правильный шрифт. – Придётся иметь столько шрифтов, сколько у нас таких уровней. – Возможно только после утверждения шрифта. – Мало места для текста (не более 10-15 знакомест на весь уровень)
Второй: Плюсы – + Легкость реализации. + Массовость. + Определённо безопасно. Минусы: – Мало шансов, что будет свободное место (75% один символ, 50% – два и лишь 25% –три) – Не более трёх знакомест на одну надпись.
Третий: Плюсы – + Если реплик у персонажа много, количество свободных знакомест велико. + Не нужно искать абсолютный адрес указателя. + По факту, мы будем заботиться о {Разнице} не каждой отдельно строки, а суммы всех знаков всех реплик одного живого существа. Минусы: – Применимо только к диалогам. – Сложно в реализации, не обойтись без двоичного редактора. – Требует тщательной проверки. – Не создаёт настоящего пространства, а лишь перераспределяет его. – Опасность отказа игры.
Четвёртый: Плюсы – + Можно сделать везде во всей игре. + Практически неограниченное увеличение длины. + Применимо абсолютно ко всему – реплики, имена, надписи. + Позволяет писать что угодно. + Можно комбинировать с предыдущим методом, тогда вынесенная фраза отдаст все опустошённые символы для соседних реплик. Минусы: – ОЧЕНЬ СЛОЖНО и трудоёмко!! – До конца не исследовано. – Опасно всерьёз. – Неэкономично. – Оставляет «мусор» в виде опустошённых байтов на месте старой фразы (вернее саму фразу, если её не удалить принудительно) – Но если использовать этот метод, то мы потеряем «задор», обленимся и наш высококачественный продукт превратиться в канцелярский механический перевод без грамма креатива.
Дело за вами! Или взломайте ещё сильнее, или просто перепроверьте все мои методы. Вы спросите, как? А я написал ещё пять программ на Delphi за другие три для беспробудного дельфийского забвения! Качайте: http://Klimaleksus.narod2.ru/Files/Mem.rar Ни одна из них не выполняет законченной работы. Они лишь облегчают ковыряние фалов. И ещё одна ремарочка: я их не проверял. Нет, я их конечно проверял, но только поверхностно. Просто если бы я занимался ещё и трассировкой, то этот комментарий появился бы только недели через три… Давайте так: я делаю программы, а вы, хакеры, их проверяете и сообщаете мне результаты. А я буду только создавать!
Инструкция. «Bit2txT.exe». Перетаскиваете на него любой файл, и он разбивает его на три составляющие – текст, данные и нулевые байты. Это записывается построчно в TXT. Строки начинаются либо (латинские) с «T:» – далее идёт ANSI текстовая строка (кириллица запрещена!), либо с «B:», после чего будут байты как шестнадцатеричные пары, разделённые ОДНИМ пробелом, или наконец «O:» (это английская буква O, а не ноль), а за ним число – обозначает столько-то нулевых байт. По сути говоря, извлекает текст. Хе, забавно… Зачем нужна? А через неё очень легко превратить несколько нулей в буквы. Делается так: 1) Конвертируете часть или весь файл. 2) Открываете TXT и переходите к нужной строке. 3) Смотрите сколько нулей показано в следующей строчке. Если больше одного, то можно дописать несколько букв к строке, но отнять столько же от количества нулей. 4) Сохраняете документ и перетаскиваете его на деконвертер. 5) А уже потом производите анализ Текст-О-Вытаскавателем! Получите дополнительные буквы, готовые к изменению!
А «деконвертер» – это «Txt2biT.exe». Перетаскиваете на него свой документ, и он собирает из него снова двоичный файл. Осторожно! Никаких проверок на ошибки не производится! Не оставляйте пустые строки. Не ставьте лишние пробели ни перед, ни после строк. Шестнадцатеричные данные вносите (если вдруг нужно будет) именно так, как они записаны – два символа в верхнем регистре через пробел и с пробелом на конце. Иначе он запакуется, но с ошибками. Да, и не перетаскивайте на него ничего кроме документов, полученных предыдущее программой!
Но это годится только для работы с нулями. А что же с относительными изменениями указателей? Для этого есть другая программа: «Uns2txT.exe» – тоже, перетаскивайте на него файлы или части файлов. Результат покажется странным, но я объясню. Программа представляет файл как набор беззнаковых квартетов (unsigned integer 32 bit). Первая четвёрка превращается в число, которое записывается в первую строчку документа. А следующая четвёрка вычитается из предыдущей, и записывается разница (может быть отрицательной, поэтому мне пришлось внутри использовать int64). Считываются ещё 4 байта, и их значение отнимается от предыдущего (но не от уже получено разницы) и записывается на следующую строку. И так пока не кончиться файл (желательно, чтобы его размер был кратен четырём).
Декнвертер – «Txt2unS.exe». Всё точно также, но наоборот. План работы: 1) Как-либо найти указатели на реплики. 2) В WinHex выделить этот блок (где указатели записаны подряд, например 16 байт – четыре указателя). 3) Скопировать в новый файл. 4) Перетащить этот файл на конвертер. 5) Будет получен документ, где перечислены ДЛИНЫ строк (включая нули и начальные квартеты). Потому что если строки записаны одна за другой, то отнимая из начального адреса следующей начальный адрес предыдущей, мы и получим длину первой. 6) Изменить эти самые длины, придерживаясь такого правила – сколько добавили, столько же отнимите. 7) Сохранить и сконвертировать обратно. 8) Открыть результат в WinHex, скопировать весь и залить поверх исходного блока в начальном файле.
Получается очень удобно (чем трижды пересчитывать каждый адрес). Заметьте, что в SCUS длины строк будут отрицательными – ведь они расположены не друг за другом, а наоборот – самая первая строка стоит в конце.
Эти программы, надеюсь, облегчат нам работу. А как быть с последним методом изменения любой длины? На это счёт у меня нет идей… Поэтому я просто создал штучку, которая умеет извлекать ОЗУ в файл, и заливать его обратно. В любой процесс. Но нас интересует Epsxe… Однако если пару раз прокопировать весь дамп PlayStation (2 Мб), то эмулятор зависает. Наверное потому, что мы не копируем VRAM и системную область. А схватить весь процесс невозможно, потому что данные записываются с промежутками, а моя прога умеет читать только блочно.
Адрес и размер задаётся числом. Если хотите в шестнадцатеричной системе, поставьте «h» последним символом. И не забывайте постоянно нажимать «Применить данные!» после любого изменения любого текстового поля. Начальный адрес всех процессов – «10000h». По умолчанию я поставил «0094C020h» – моя виртуальная область в Epsxe. Размер – 2 Мб. Выгружать для работы ещё можно, а вот загружать обратно не советую…
Основное использование на мой взгляд – внедрение нужной инфы по нужному адресу для проверки игры «на лету». Альтернатива – «копировать область» в ArtMoney, но там вы больше килобайта не захватите; или «open RAM» в WinHex, но чёртос-два вы сможете его обновить, не переоткрывая процесс заново! А моя программка очень легко копирует мелкие области. А файлы-то можно затем и в том же WinHex редактировать, словно это ОЗУ (только с поправкой на offset). А обновлять – чтением и записью.
Ну и каким же из четырёх способов воспользуемся? Я думаю так: – Первый метод пока отложить и не рассчитывать на него (и «СПАЙРО» и «НЕТ» теперь решаются вторым методом) – Второй использовать повсеместно, где это получиться. Хуже точно не станет! – Третий применять редко, только если это будет удобно и принесёт больше пользы, чем потребует усилий. – А четвёртый – это козырь. Его можно применять только в крайних случаях! И я придумал в каких. Описал в теме перевода текста. Подсказка «Назойливая Зоя и Пропавшая Шейла»!
А изменять данные ОЗУ на лету, видя в окне поведение игры оказалось очень увлекательным занятием! Я модифицировал строку и сразу наблюдал реакцию игры. Как же легко было определить все диакритические знаки: http://Klimaleksus.narod2.ru/Files/GH/sign.png
Но если поставить @$, то мигом слетают все текстуры: http://Klimaleksus.narod2.ru/Files/GH/bad.jpg Если захотим напугать пользователя – метод есть!
Также нашёл «скрытые» цвета, можно добавить в список: – «@:» – Тёмно-коричневый, – «@;» – Тёмно-красный, – «@<» – Оранжево-розовый, – «@=» – Прикольный тёмно-серый. Все вместе: http://Klimaleksus.narod2.ru/Files/GH/color.png
Жаль, нет синего. Изменить просто так их не получится, потому что они заданы не в текстуре, а в программном коде. Придётся довольствоваться ими, а не изобретать свои.
Проверил остальную ASCII таблицу. Так оказывается, что все байты до пробела отвечают за показ отдельностоящих диакритических значков! По несколько вариантов, я выбрал самые широкие: http://Klimaleksus.narod2.ru/Files/GH/all.png Но где же перевёрнутый восклицательный знак (@!) ? Кажется, нету. Ну и ладно, обойдёмся без него. А все остальные можно перерисовать! Это подарит нам целых восемь экстра-знакомест! Но чтобы их использовать, Текст-О-Вытаскиватель придётся задавать не «Построчно», а «Слепить» и редактировать WinHex. Иначе никак. Но всё же легче, чем заменять нули!
Так-так, минуточку… Я ту циферки прикинул… А если… А если сделать ДВА регистра русских букв? Надо 33*2. Это 66. Цифры и основные символы не менять. Имеем латиницу: «A-Z» – 26. Ещё «a-z» – 26. Итого уже 52. Остаётся 14 символов… Черту («/») меняем. Апостроф меняем. Плюс меняем. Проценты меняем. Звезду меняем. Осталось девять. А теперь у нас есть 8 диакритических. Итог – минус один. Но ведь «Ы» (если «Ынха» не придётся писать!), «Ъ», «Ь» можно оставить лишь нижним. А ещё «О» приравнять нулю «0». Глядишь и засунем два регистра! …Ой, а плюс-то нужен для комбинаций типа «Х+Х для полёта»… Тогда НЕ меняем. Можно ещё поковырять октеты со старшим битом «128–255», вдруг найдём ссылку на пустую клетку в шрифте. А ещё можно взломать ширину букв, чтобы они все отображались по максимуму, но я пока не знаю как…
Плюсы: + Красиво Выглядящий Текст. + возможность отделения Собственных Имён. + привлечение ВНИМАНИЯ игрока. + Наш перевод будет единственный с двумя регистрами! Минусы: – Коту под хвост возможность махинаций со шрифтом. – Сложная запись текстов в файл. – Практически не читабельная конечная кодировка.
Думайте! Стоит ли оно того?
but nobody came
|
|
| |
STALKER_007 | Сообщение # 143 Вторник, 01.05.2012, 18:05 |
Легендарный Дракон
Почетный Житель
«8894»
Где: Не в городе Драконов
|
Quote (aleksusklim) Думайте! Стоит ли оно того Я конечно в этом не особо разбираюсь, но плюсов вроде бы больше - значит стоит
|
|
| |
aleksusklim | Сообщение # 144 Вторник, 01.05.2012, 18:10 |
фдулыгылдшь
Редактор
«1066»
Где: Не в городе Драконов
|
В мой метод взлома указателя никто не врубился… Но я сам-то еле догнал, какая там последовательность действий: Файл WinHex’ом расковыряй, ArtMoney’ей прошвырнись по ОЗУ, Калькулятором вычисли новое значение и опять суй его обратно, уповая на то, что ничего не напутал…
Вам не кажется, что СЛИШКОМ много сторонних программ требуется? Мне удалось итерационным методом квантовать алгоритм на составляющие шаги и на основе индукционного способа изобрести единое пространство работы.
(Кто что понял?) Короче, сделал чтоб удобно было.
Но сначала определим терминологию: Абсолютный адрес: это адрес, по которому происходит обращение к переменной по законам PlayStation. Адресное пространство ОЗУ игры занимает 2097152 байт (ровно 2 мегабайта). Начинается с адреса 80000000h (2147483648) и заканчивается 801FFFFFh (2149580799). Именно в него ДОЛЖНЫ указывать ВСЕ указатели! Истинный адрес: это физический адрес ОЗУ компьютера, где эмулятор размещает данные памяти игры. Он, естественно, тоже занимает объём 2 Мб, но первый адрес отличается он абсолютного. Наверное, зависит от эмулятора. В Epsxe 1.7.2 это от 0094C020h (9748512) до 00B4C01Fh (11845663). По этим адресам можно найти указатели и строки в ArtMoney. Это адрес истинный для нас, но ложный для игры, и направлять что-либо на него бесполезно. Прямой адрес: это адрес данных дампа памяти. Дамп я предлагаю снимать через свой же MemGet. Пространство также 2 Мб, но начинается с адреса 00000000h (0) и кончается 001FFFFFh (2097151). Так проще всего понять, где на самом деле расположены данные. Относительный адрес: это адрес данных внутри субфайла или суб-субфайла. Или же относительно всего WAD. Или относительно сектора диска – смотря что имеется в виду. Далее по тексту под относительным адресом я буду понимать только адрес данных от начала четвёртого суб-субфайла главного субфайла любого уровня.
Преобразование между адресами. X – новый адрес, Y – известный адрес:
АА-->ПА : X=Y-2147483648 ПА-->АА : X=Y+2147483648 ПА-->ИА : X=Y+9748512 ИА-->ПА : X=Y-9748512 АА-->ИА : X=Y-2137735136 ИА-->АА : X=Y+2137735136 Для относительного адреса нужно знать константу, которую игра суммирует с ним. Её можно найти, вычитая из АА строки ОА этой же строки. Но нам такое совершенно не понадобиться.
Я нашёл проблему, которую как-то упустил раньше. В файлах находится указатель не на абсолютный адрес, а на относительный! То есть по этому указателю можно перейти к строке прям в этом же суб-субфайле. А не сразу в RAM. Но в EXE адреса сразу ОЗУвские. Но не в уровнях. Так когда же они превращаются в абсолютные? Ответ: при загрузке уровня. Что даёт? Легче позиционировать указатели, потому что можно лазить в самом же суб-субфайле, где мы меняем текст. То есть, не выходя в ОЗУ, не снимая дамп. Что забирает? А как теперь направить этот относительный указатель на строку, которую мы засунем во второй субфайл? У него-то другое восстановление в абсолют произойдёт? Но решение есть. Можно вычистить разницу-дельту между исходной строкой в ОЗУ и её нашей версией тоже в ОЗУ, но уже не в четвертом, а во втором суб-субфайле. Это дельту вычесть из реального относительного адреса суб-субфайла. Появляется проблема… Относительный адрес строки не превосходит 50 000 байт. А дельта получается по 500 000! И как я отниму от 50 Кб пятьсот? Вопрос на засыпку: сколько будет «один минус два»? (С учётом того, что это четырёхбайтные беззнаковые целые, где числа не могут быть отрицательными) Ну? Ваш ответ? Мой: 4294967295. Или FFFFFFFFh. Как это сделать? Калькулятор>Вид>Инженерный>Hex>4 байта> «1-2=» >Dec. Убедились? Теперь я по этим правилам вписал указатель в WAD. Да, громадное же число.
И запустил игру… Теперь она либо вылетит, либо примет… Интересно, есть ли там range checking…
Результат: РАБОТАЕТ!!!! Да! Игра сама приплюсовала к огромному числу свою разницу адресов, получив в конечном итоге адрес поменьше. Значит, мы СМОЖЕМ затолкать столько текста, сколько захотим.
Я не преувеличиваю! Я посчитал свободное «яичное» пространство в Sunrise Spring Home. Это 30 с лишнем килобайт!! Это примерно полтора моих средненьких комментария! Вы представляете! СКОЛЬКО текста мы можем впихнуть! Ох, Зойка удивиться… (на её пиратском предупреждении мы отыграемся, ой как отыграемся!)
Я облегчил нам работу. Качайте программу: http://Klimaleksus.narod2.ru/Files/StrPnt.rar (160 Кб) И смотрите её скриншот: http://Klimaleksus.narod2.ru/Files/W/whirlwind61.png
Испугались?)) Не волнуйтесь, я всё объясню.
Итак, это 7в1. (MemGet тоже понадобится.) Программки: STR,PNT,NUL,COP,SET,SUB,HEX. STR – ищет строку. PNT – ищет указатель. NUL – ищет пустое пространство. COP – копирует данные (строки) + добавляет свои. SET – изменяет указатели. SUB – производит сложение и вычитание по правилам «1-2=4294967295» HEX – конвертирует между десятичной и шестнадцатеричной системами.
Все файлы выбираются соответствующими кнопками «...», подтверждать не надо. Поиски STR,PNT,NUL – выполняются кнопкой Search, а результат выводится в Offset found. Строку надо писать в текстовое поле, а указатель – в Value (всё записывается только в десятичной системе счисления) Count – количество найденных элементов. Если «1» – это хорошо. Если «0» – значит вы ничего не нашли. Если больше 1 – слишком много повторов. Уточните строку или просмотримте файл через WinHex, чтобы понять, почему так происходит. Use# – порядковый номер выводимой строки или указателя, если их несколько (например, «Hunter» встречается пару-тройку раз, и чтобы обработать их все, нажимайте Search при разных Use# (от 1 до Count) и копируйте Offset found). Start address – начальный адрес в файле для поиска. «0» – поиск во всём файле. Можно использовать, чтобы уточнить место и сократить время, или отсеять ранние вхождения.
STR-Difference – это специальное поле, которое автоматически суммируется с результатом. То есть, чтобы найти настоящую строку, нужно поставить туда ноль. Но если мы ищем фразу, которая начинается не с самих букв, а за четыре байта ранее, то логично ввести туда «-4», и прога выдаст адрес искомой строки, из которого уже буде вычтено 4. PNT-Difference – это тоже «сумматор», но входных данных. То есть указатель ищется на Value+Difference. Зачем? Да потому что в Difference удобно помещать константы конвертации адресных пространств, например, начало абсолютного адреса 2147483648.
Как работает NUL: Ищет «00h» по всему файлу, выдавая первый за вычетом Padding, но чтобы их последовательность была не меньше Minimum в сумме с Padding. Проще говоря, находит первую область в Minimum нулей, перед которой есть ещё ровно Padding нулей. Мы задаём Padding=4 и Minimum больше 50 (64, 500 или сколько будет нужно – длина новой строки), кастуем на второй суб-субфайл, и нам выдаётся та самая яичная зона!
COP – Копирует из файла From с адреса Address в файл To по адресу Desten данные. Длина копируемой области – Length. Плюс добавляет сюда строку Text и Add blank пробелов после неё. Короче, Length приравнивается STR-Difference (с противоположным знаком), которая была нужна для отлова строки. Или 0 или 4. Добавляемый текст – новая строка. Можно поставить Length=8, тогда скопируется оригинальное начало; в Text ввести что-то типа «OurString01», а в Add blank – ту длину новой стрики, которая планируется (например с запасом). Потом уже всё это изменить можно через знакомый Текст-О-Вытаскиватель. Кстати, не копируйте много через Length, лучше ставьте Add blank, потому что потом можно запутаться, где оригинал, а где изменение при следующих поисках строк.
SET – ну тут всё просто. Вставляете адрес в Address, жмёте GET и получаете значение указателя. Изменяете его на нужное, жмёте PUT – вуаля, он записан!
SUB – «Кулькулятор»… Вводите операнды в два поля и нажимаете «+» или «-» между ними – в третье поле выведется ответ, не затирая оригиналы.
HEX – конвертор по мере ввода. Я сделал поддержку до FFFFFFFFFFFFFFFFh, но он на больших числах конечно неизбежно гонит. А до четырёх байт FFFFFFFFh вычисляет великолепно! Всё! Моих программ StrPnt и GetMem достаточно для изменения любой строки в игре. Но всегда лучше контролировать поведение в WinHex. Общий алгоритм изменения строк (обращение к результатам предыдущего пункта обозначено фигурными скобками):
1) STR. Ищем исходную строку в 4-ом суб-субфайле. 2) NUL. Ищем пустоту в 2-ом суб-субфайле. 3) PNT. Ищем в 4-ом суб-субфайле указатель на адрес, полученный в {п.1}. 4) COP. Из адреса {п.1} копируем в адрес {п.2} из 4-го в 2-ой субфайл, добавив свою новую строку. 5) SET. Делаем GET в 4-ом суб-субфайле на адрес {п.3}, должны получить {п.1} ~Внедряем 2-ой суб-субфайл, компилируем и прожигаем игру. Запускаем, заходим в нужный уровень и снимаем полный дамп памяти через MemGet.~ 6) STR. Ищем оригинальную строку в дампе. 7) STR. Ищем нашу изменённую строку в том же дампе. 8) SUB. Вычитаем из изменённого {п.6} оригинальный {п.7}. 9) SET. Делаем PUT на адрес {п.3} 4-го суб-субфайла и заносим {п.8}. ~Внедряем 4-ый суб-субфайл, компилируем, прожигаем, запускаем и заходим в нужный уровень – должен быть верный результат~
Ремарочки: – Если меняем ФРАЗУ, то Difference в пунктах 1,6,7 надо ставить «-4». Если ИМЯ, то «0». – Если пункт 3 ничего не дал, то попробуйте изменять Difference на +- от 1 до 4 туда-сюда. Если и это не помогло (абсолютный адрес!), то пропустите этот пункт (и пятый), а вместо пунктов 8 и 9 сделайте так: 10) PNT. Ищем указатель в дампе на {п.6}. 11) SET. Делаем GET в дампе на адрес {п.10}, должны получить {п.6} 12) SET. Теперь делаем PUT в дампе на тот же адрес, но занесите {п.7} – Если хотите увидеть указатель или строку в ArtMoney, то отнимите от адреса число «147483648», прибавьте первый истинный адрес «9748512» (можно в SUB) и переведите (можно в HEX) в шестнадцатеричную систему. После чего в ArtMoney задайте «перемещение на адрес» в «редакторе памяти».
P.S: После создания вихря (тема перевода) я обнаружил, что начальное пространство в яичной зоне заполняется неизвестными данными при некоторых обстоятельствах, затирая введённые данные. Если такой момент отловить, можно узнать, сколько конкретно нулей исчезает, а сколько остаётся. Прописать исчезнувшие нули в «NUL-Padding», а оставшиеся – в «NUL-Difference». Но всё это нужно ещё не раз проверить…
but nobody came
Сообщение отредактировал aleksusklim - Вторник, 01.05.2012, 18:32 |
|
| |
†Vampire† | Сообщение # 145 Четверг, 03.05.2012, 18:38 |
Маленький Дракон
Житель Города
«365»
Где: Не в городе Драконов
|
Не знаю, говорилось ли об этом раньше или нет, но возможно ли поменять иконки с жизнями во время игры за другого персонажа? Чтобы вместо головы Спайро было изображение другого персонажа. Спаркса, Шейлы и т.д.
Простите, если уже этот вопрос здесь поднимался.
Сообщение отредактировал †Vampire† - Четверг, 03.05.2012, 19:09 |
|
| |
DrWho | Сообщение # 146 Четверг, 03.05.2012, 18:56 |
Мудрый Дракон
Почетный Житель
«1371»
Где: Не в городе Драконов
|
Quote (†Vampire†) Не знаю, говорилось ли об этом раньше или нет, но возможно ли поменять иконки с жизнями во время игры за другого персонажа? Чтобы вместо головы Спайро было изображение другого персонажа. Спаркаса, Шейлы и т.д. Возможно, насколько я знаю. Например, aleksusklim смог взломать игру и даже вихрь (!) сделал. Quote (†Vampire†) Простите, если уже этот вопрос здесь поднимался. Этот вопрос действительно ещё никто не задавал (по крайней мере я нигде не видел этого вопроса ранее).
|
|
| |
†Vampire† | Сообщение # 147 Четверг, 03.05.2012, 19:13 |
Маленький Дракон
Житель Города
«365»
Где: Не в городе Драконов
|
И еще один вопрос меня тревожит: куда уходят жители Полуночной Горы в конце уровня? Может быть сделать так, чтобы они оставались в уровне, а после того, как из него выйдешь, а потом зайдешь обратно — исчезали. Просто куда бы они все могли пойти? На закрытую вечеринку в "Fireworks Factory"? Может быть стоит задуматься и над этим?
|
|
| |
DrWho | Сообщение # 148 Четверг, 03.05.2012, 19:18 |
Мудрый Дракон
Почетный Житель
«1371»
Где: Не в городе Драконов
|
Quote (†Vampire†) И еще один вопрос меня тревожит: куда уходят жители Полуночной Горы в конце уровня? Изначально разработчиками планировалось, скорее всего, что полёт будет прямо в дом колдуньи, либо же в супер бонусный уровень как отдельный мир, а не портал, построив ещё одно летательное устройство. Quote (†Vampire†) Может быть сделать так, чтобы они оставались в уровне, а после того, как из него выйдешь, а потом зайдешь обратно — исчезали. Можно и так сделать, в принципе. Quote (†Vampire†) Просто куда бы они все могли пойти? На закрытую вечеринку в "Fireworks Factory"? Может быть стоит задуматься и над этим? Возможно :)
|
|
| |
†Vampire† | Сообщение # 149 Четверг, 03.05.2012, 19:21 |
Маленький Дракон
Житель Города
«365»
Где: Не в городе Драконов
|
Quote (DrWho) Изначально разработчиками планировалось, скорее всего, что полёт будет прямо в дом колдуньи, либо же в супер бонусный уровень как отдельный мир, а не портал, построив ещё одно летательное устройство.
Точно! Я догадывался об этом раньше, но точно не знал.
|
|
| |
CubeStudio | Сообщение # 150 Понедельник, 07.05.2012, 17:16 |
Маленький Дракон
Житель Города
«318»
Где: Не в городе Драконов
|
Я редко захожу на ваш сайт и в эту тему особенно. Но я всё ещё готов помочь с озвучкой ибо звуковуха хорошая, да и голос неплохой. Как до неё дело дойдёт-звякните, плз.
По-настоящему оценить может лишь тот, кто досмотрел презентацию до конца.
|
|
| |