Чтобы получить возможность изменять текст, есть 2 варианта:
1. Как-то узнать алгоритм вычисления контрольной суммы.
2. Найти эту проверку в исполняемом файле и затереть её
Сначала я хотел пойти по более лёгкому пути (2 вариант), но PSX версия отказывалась запускаться на эмуляторе. Вешалась после заставки. Мне ничего не оставалось, кроме как искать алгоритм там, ведь я хотел сделать универсальный редактор.
Запускаем игру, подходим к уровню и в x64dbg подключаемся к SheepD3D.exe. Нас интересует функция доступа к файлу CreateFileA. Ставим на неё брейкпоинт, переходим в игру и заходим на уровень. Сработает бряк, в отладчике будет виден полный путь к файлу. Жмём F9 до тех пор, пока не появится .mlt файл. После этого ставим бряки на ReadFile, после срабатывания переходим по адресу в регистре ESP и видим, что сначала читается 4 байта, затем 8, снова 4 и, наконец, всё остальное.
После последнего чтения заходим в каждую функцию. Задача -- найти цикл, в котором считается контрольная сумма. После некоторых поисков я попал в этот длинный цикл и вот она та самая функция:
Как оказалось, это -- простой CRC32, только с изменённым полиномом. Я не стал искать, где генерируется таблица, а просто выдрал её из памяти и вставил в исходники редактора.
Ещё спустя некоторое время оказалось, что структура файла такова:
Код:
{
crc_header: u32,
header: u8[8],
crc_body: u32,
body: u8[]
}
Структура хранения строк тоже очень простая. Первый байт означает число строк в секции, затем идут эти строки. Строки null-terminated. Могут встречаться секции с нулевым числом строк
Также .war файлы тоже защищены контрольной суммой, но про них, как нибудь, в другой раз