Перейти к содержимому
Zone of Games Forum

Рекомендованные сообщения

Всем привет. Давно хотел перевести игру под названием Sara Is Missing, она работает на джава “движке” разработчика, написанном на libGDX.

Вся загвоздка в файле content.fs — это сериализированный набор каких-то текстовых данных, причём в нестандартном формате. Переводя его через HEX, проблема возникает, когда текст выходит длиннее оригинального, по итогу вся структура файла “съезжает” и приводит к ломанию игры на старте. 

Все игровые файлы лежат в sim.exe, который можно вскрыть при помощи 7-zip или Winrar.

Исходники игры, если кого заинтересовало:
https://drive.google.com/drive/folders/1hyVdLdSx_p1bGEKQ7H4c5zUpTaDgAncO?usp=sharing
 

Скрытый текст

rus arial.rar — спрайтовый шрифт с добавлением кириллицы.
Путь для замены: sim.exe\com\badlogic\gdx\utils
(Генерировал с помощью runnable-hiero.jar)

Текст:
.fs файлы содержат текста сообщений, а .class файлы — надписи для GUI (путь: sim.exe\game23). 
В android-версии все эти классы запакованы в classes.dex.

Декомпиляция кода:
Логика игры хранится в sim.exe\sengine. Просмотреть код .class файлов удобно через JD-GUI.
Альтернативный вариант — скачать андроид версию, вытащить dex файлы и декомпилировать их.

Скрытый текст

Возможные форматы текстур:
JFIF, PVR, ETC1
Файлы содержат шапку 126 байт (иногда 128), начинающуюся с тега TextureFile. 
Они могут содержать как одно целое изображение, так и множество его фрагментов, поэтому просто удалить шапку будет недостаточно.
Если исходная текстура была большой, то она разрезается на части, не больше, чем 512х512. Порядок частей такой же, как они идут в двоичном файле. У некоторых текстур имеются мипмапы. В симулякре возможно чуть по другому, там ещё можно встретить фрагментированные изображения в виде отдельных текстур: 1|1.png.texture, 1|2.png.texture и т.д.

Для изучения можно вытянуть все картинки утилитой bulk_extractor:
@echo off
bulk_extractor -o D:\Output -R D:\TextureFiles
pause

Логика загрузки изображений:
sengine\graphics2d\texturefile
-----------------------------------------------------------------------------------------------------------------------------------------------------
Кстати в симулякре в режиме отладки можно выполнить команду для распаковки текстуры на диск:
Globals.dumpTexture(“menu/headphones.png”) 
Аргумент это путь в файле support.assets без расширения “.texture”
После выполнения результат появится в кеш папке по пути C:\<username>\game27\compiled\dump

Способ массовой распаковки всех текстур:
Скачайте архив и поместите содержимое в C:\<username>\game27
В файле tex.java замените путь на свой
Запустите игру, нажмите тильду, введите команду: Console.console.evalFile(“tex.java”);
Во время выполнения скрипта игра может зависнуть на 5-10 минут, это нормально. Когда развиснет, значит процесс завершился. Идём в C:\<username>\game27\compiled\dump и проверяем.

Скрытый текст

Скачать архив
Подменить файл Game.class по пути sim.exe\com\accurve\game23 (изменено значение поля RELEASE на false, чтобы включить режим отладки).
Запустить игру.
Теперь можно вызвать консоль по кнопке тильды (~) и использовать команды. Важно: надо всё делать на английской раскладке. 

При инициализации консоли импортируются классы из следующих пакетов:



import com.badlogic.gdx.*;
import sengine.*;
import sengine.graphics2d.*;
import com.accurve.game23.*;
import game23.hlapi.*;
import game23.*;
import game23.grid.*;

Пример простой команды:
ClassName.method(argument);
ClassName.field = new_value;

Также можно по пути C:\<username>\game23 положить autoexec.java, при запуске игры код из этого файла выполнится автоматически через консоль. Но только при включённой отладке.
---------------------------------------------------------------------------------------------------------------------------------------------------------
Для включения отладки в симулякре нужно ставить конфиг:
Создать текстовый файл по пути C:\<username>\game27\autoexec.cfg
В нём прописать:



Gdx.app.setLogLevel(Application.LOG_DEBUG);

Запустить игру.

При инициализации консоли импортируются классы из следующих пакетов:

import com.badlogic.gdx.*;
import sengine.*;
import sengine.graphics2d.*;
import sengine.animation.*;
import sengine.calc.*;
import sengine.utils.*;
import game27.*;
import game27.gb.*;
import game27.glitch.*;
import game27.model.*;
import game27.renderer.*;
import game27.triggers.*;
import game27.Globals;
import game27.triggers.Triggers;
import game27.triggers.ACT1;
import game27.triggers.ACT2;
import game27.triggers.ACT3;
Скрытый текст

В стим-обсуждениях можно найти инструкцию от разработчиков по созданию неофициальной локализации.
https://steamcommunity.com/app/712730/discussions/0/1742220290366328362/

Ниже перевод этого сообщения. Ссылки до сих пор рабочие, но самое интересное — раздел тестирования пуст. Я пробовал следовать этой инструкции на разных версия симулякры, но ничего не вышло. Возможно я просто что-то делал неправильно :(

На всякий случай бэкап файлов: экселевские таблицы, конфиг, документ.
P.S. По умолчанию в конфиге включена рекомпиляция, так что в дальнейшем игра будет загружаться с помощью новосозданных fs в кеш папке. Поэтому если игра перестала запускаться (чёрный экран или крахи), удалите содержимое C:\<username>\game27\compiled, и конфиг, в случае ненадобности.

Цитата

Я добавил в документ инструкцию о том как тестировать свою локализацию (смотрите раздел “Testing”).
https://docs.google.com/document/d/163xald8WbyuNL_3nBZJqVUzGZ0NJ6ffM96QTH3Ii3Sk/edit?usp=sharing

Сперва вам необходимо продублировать документы в Google Drive и добавить свой перевод. Затем скачать этот файл:
https://drive.google.com/open?id=1zSmD7RAsaVIamVdNjPBdFQc46KFXSVyo

Поместите его в C:\<username>\game27\autoexec.cfg
Отредактируйте файл и замените Google ссылки на свои.
Перезапускайте игру каждый раз, когда вносите изменения онлайн.
Нажмите кнопку тильды (~) во время загрузки игры, чтобы проверить сообщения об ошибках.
Игровые сохранения могут повредиться, если внести крупные изменения.

 

Simulacra, альтернативный вариант перевода — версия для Switch

 

Изменено пользователем Artie_Bow

Поделиться сообщением


Ссылка на сообщение

P.S. Логика обработки content.fs лежит в java/sengine/File.java (к сожалению я её не осилил :()
Там есть такие интересные методы как unpackFS, packFS, unloadFS, loadFS.

Поделиться сообщением


Ссылка на сообщение
6 часов назад, Artie_Bow сказал:

Редактирование текста через HEX ломает структуру файла и приводит к критической ошибке при загрузке игры, если вместе с текстом меняется размер файла. Было бы здорово, если бы кто-то с ним разобрался, с его структурой. 

Перед каждой строкой есть ее размер в Big Endian. Как вариант попробуйте менять значение в зависимости от размера новой строки.

Поделиться сообщением


Ссылка на сообщение
10 часов назад, LinkOFF сказал:

Перед каждой строкой есть ее размер в Big Endian. Как вариант попробуйте менять значение в зависимости от размера новой строки.

Размер строк я меняю, но видимо этого недостаточно. Нужно править ещё какие-то значения, знать бы только какие.

Изменено пользователем Artie_Bow

Поделиться сообщением


Ссылка на сообщение

@LinkOFF Может, проблема возникает в структуре sim.exe после вшивания в него отредактированного content.fs?

UPD. Я сейчас попробовал отредактированный content.fs засунуть в андроид-версию игры, и она тоже вылетает после загрузки, а значит проблема не в структуре sim.exe, нужно копать именно сам файл content.fs и там ещё что-то править.

Изменено пользователем Artie_Bow

Поделиться сообщением


Ссылка на сообщение

Привет! Сам давно интересуюсь темой того, как работает эта игра. Для начала надо сказать, что у игры не свой движок. Игра работает на фреймворке LibGDX, но разработчики явно сами придумали методы обфускации. Далее: игра не задействует файл content.fs, хотя он и вызывает вылет игры. На самом деле все события игры вызываются из файла compiled.fs, который задействуется с запуска (но малейшее его изменение приведёт к неработоспособности игры).

Следующая информация скорее всего будет бесполезной, но покопавшись на некоторых форумах я узнал, как извлечь jpg-изображения из игры (хотя работает это не со всеми jpg).

Поделиться сообщением


Ссылка на сообщение
В 26.12.2021 в 17:40, cenya_filyushkin сказал:

Привет! Сам давно интересуюсь темой того, как работает эта игра. Для начала надо сказать, что у игры не свой движок. Игра работает на фреймворке LibGDX, но разработчики явно сами придумали методы обфускации. Далее: игра не задействует файл content.fs, хотя он и вызывает вылет игры. На самом деле все события игры вызываются из файла compiled.fs, который задействуется с запуска (но малейшее его изменение приведёт к неработоспособности игры).

Следующая информация скорее всего будет бесполезной, но покопавшись на некоторых форумах я узнал, как извлечь jpg-изображения из игры (хотя работает это не со всеми jpg).

Ну да, я в курсе про движок. Насчёт content.fs не соглашусь, он вполне используется. Ниже скриншоты, я отредактировал содержимое одной из смс без изменения длины текстового блока.
 

Скрытый текст

23af43901a1ba1b4aea29ba3101a2ec2.jpg275c394dffbb328da21ad193d65617b1.png

 

Будет не лишним, если ты расскажешь о картинках. Я только знаю кое что о зашифрованных видео. Что в этой игре, что в симулякре видеоролики зашифрованы одинаково. Расшифровать их можно при помощи сайта https://filext.com (кстати, аудиодорожка идёт отдельно от видео и без проблем воспроизводится). Ну и пример одного из расшифрованных видео, а также небольшая информация о нём в спойлере ниже (в т.ч. методы шифрования), может что-то похожее используется в файлах текстур.
 

Скрытый текст

 

d3419741d8dc355cf978467223b68c93.png52af21c4d63424a696d2a2b4df28a833.png

 

 

Изменено пользователем Artie_Bow

Поделиться сообщением


Ссылка на сообщение

Хмм… Странно. У меня при изменении content.fs ничего не меняется (видимо, приколы ПК-версии игры). По поводу изображений: .jpeg.texture можно извлечь, если убрать из него всё до 0x80 байта (Но есть забавный момент, что некоторые .jpeg.texture-файлы на деле являются .png.texture, и наоборот). А вот как извлечь .png.texture — непонятно, ибо там нет ни малейшего намёка на структуру .png-файла (Заголовка там нет уж точно).

Кстати. Я смог перекомпилировать класс com.accurve.game23.Game изменив в нём одну переменную, что активирует дебаг-режим в ПК-версии игры (ссылка на jar: https://drive.google.com/file/d/1npYwQkK0gU2iamEwiE6IrRM9g4A7X15G/view?usp=sharing). Там можно вызвать консоль тильдой и вызывать разные команды (я так умудрился добавить иконку на главный экран и при этом поломать его отображение, скриншот ниже)javaw_2021-12-27_09-54-21-095.jpg?width=

Поделиться сообщением


Ссылка на сообщение

Так, а вот сейчас что-то странное. Я попытался изменить текст сообщения на твой-же (размер не меняется), но моя игра при этом вылетает.

Поделиться сообщением


Ссылка на сообщение

По сути дела текст в обычном txt формате лежит. Но очень здесь всё интересно реализовано 484 блока, думаю если заморочиться вполне реально сделать перевод. 

Изменено пользователем KASaLEX

Поделиться сообщением


Ссылка на сообщение

@KASaLEX вообще, как мы смогли выяснить, изначально текста диалогов скорее всего хранились в json и в дальнейшем были запакованы в .fs. Но есть вещь, которая меня ошарашила — если Debug-версию игры запускать не в jar, а в exe, то она будет работоспособной даже при удалённых из неё .fs-файлах, и даже будут все текста. json-ов в игровом архиве нет

Поделиться сообщением


Ссылка на сообщение
В 06.01.2022 в 22:51, cenya_filyushkin сказал:

@KASaLEX вообще, как мы смогли выяснить, изначально текста диалогов скорее всего хранились в json и в дальнейшем были запакованы в .fs. Но есть вещь, которая меня ошарашила — если Debug-версию игры запускать не в jar, а в exe, то она будет работоспособной даже при удалённых из неё .fs-файлах, и даже будут все текста. json-ов в игровом архиве нет

скорее всего у тебя рядом с exe лежат извлечённые файлы .fs которые игра и подтягивает. Дальше потратил я на это всё дело три вечера. Что могу сказать почти все файлы сжаты определенным образом, блоками идет блок сжатых данных потом в открытом виде и так далее. Если файл собрать разжав сжатые блоки и собрать получим оригинальный файл ….который игра не хавает. Проверка происходит по размеру разжатых данных, то есть если взять блок разжать получив оригинальный файл и снова сжать до меньшего размера или большего самого блока, игра будет работать если же изменить оригинальный файл и снова упаковать нет — идет проверка по размеру разжатого файла, даже лого с наушниками, что появляется в начале игры сжато таким образом, в файле данных о размере точно нет. Проверка происходит где-то в коде причем там должны храниться размеры всех файлов в таком случаи

Поделиться сообщением


Ссылка на сообщение
1 час назад, KASaLEX сказал:

скорее всего у тебя рядом с exe лежат извлечённые файлы .fs которые игра и подтягивает. Дальше потратил я на это всё дело три вечера. Что могу сказать почти все файлы сжаты определенным образом, блоками идет блок сжатых данных потом в открытом виде и так далее. Если файл собрать разжав сжатые блоки и собрать получим оригинальный файл ….который игра не хавает. Проверка происходит по размеру разжатых данных, то есть если взять блок разжать получив оригинальный файл и снова сжать до меньшего размера или большего самого блока, игра будет работать если же изменить оригинальный файл и снова упаковать нет — идет проверка по размеру разжатого файла, даже лого с наушниками, что появляется в начале игры сжато таким образом, в файле данных о размере точно нет. Проверка происходит где-то в коде причем там должны храниться размеры всех файлов в таком случаи

Миллион раз проверил — рядом fs нет, а поттягивает игра их только в случае, если запущена через jar.

1 час назад, KASaLEX сказал:

скорее всего у тебя рядом с exe лежат извлечённые файлы .fs которые игра и подтягивает. Дальше потратил я на это всё дело три вечера. Что могу сказать почти все файлы сжаты определенным образом, блоками идет блок сжатых данных потом в открытом виде и так далее. Если файл собрать разжав сжатые блоки и собрать получим оригинальный файл ….который игра не хавает. Проверка происходит по размеру разжатых данных, то есть если взять блок разжать получив оригинальный файл и снова сжать до меньшего размера или большего самого блока, игра будет работать если же изменить оригинальный файл и снова упаковать нет — идет проверка по размеру разжатого файла, даже лого с наушниками, что появляется в начале игры сжато таким образом, в файле данных о размере точно нет. Проверка происходит где-то в коде причем там должны храниться размеры всех файлов в таком случаи

И да, кстати. В Debug-режиме в jar-е игра пересобирает все fs в отдельный каталог (compiled). Перепакованный файл content.fs весит меньше того, что лежит в игре. И если этот content.fs положить вместо оригинального — игра так-же будет работать

Поделиться сообщением


Ссылка на сообщение

подтягивает и через exe. только что сравнил две версии под андроид изменения в них только в .fs файлах, выходит что и данные для проверки размеров в каком-то из них

Поделиться сообщением


Ссылка на сообщение
Только что, KASaLEX сказал:

подтягивает и через exe. только что сравнил две версии под андроид изменения в них только в .fs файлах, выходит что и данные для проверки размеров в каком-то из них

Уж больно подозрительно, что exe Debug-версии игры игнорирует даже изменённые fs внутри неё, а нигде в иных местах у меня fs не лежат

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас



Zone of Games © 2003–2024 | Реклама на сайте.

×