Переношу все междусобойчики из ЛС сюда. У меня уже места для писем нет, запарился себе размер яшика увеличивать, да и неудобно в ЛС.
Товарищ Siberian GRemlin, пожалуйста, в будущем создавай тему, а не пиши мне.
Я всегда смотрю файлы которые кто-либо из нас выкладывает, так что если ты или кто-то другой что-то спросил, а я не ответил, это значит только что я ничего не могу сказать по этому формату. Мне нечего добавить и т.д.
Надеюсь на понимание и что мне никто в будущем не будет писать в ЛС, а создавать отдельную тему...
Но вернёмся к игре. Siberian GRemlin жаждет узнать алгоритм подсчёта контрольной суммы.
Нужно это ему, видимо, для перепаковки архива и создания русификатора.
Далее идёт описание формата (я его немного дополнил, кстати), так что я сразу задам свои вопросы ему:
1) Зачем тебе сдалась эта контрольная сумма? Я поменял её у пары файлов из "Data\say.hog", но игра на это никак не отреагировала. Т.е. никакой ошибки не было.
2) noDVD игры упакован UPX'ом со стёртой сигнатурой, но я его распаковал. Получилось из 8 Мб целых 28. Если кто-нибудь ещё будет смотреть игру - могу выложить его, чтобы не распаковывать. Так вот под отладчиком я нашёл место где читается, к примеру, тот же "Data\say.hog" (он целиком в память засовывается), но проблема в том, что, видимо, из-за криво снятой защиты я не могу поставить бряк на обращение к этой памяти. В частности к ячейке с контрольной суммой. При попытке это сделать Олька говорит что мой бряк инвалид и она поэтому она его убивает. 28 Мб - это не фигушки воробьям показывать и найти там код проверки вручную очень сложно.
Так что вернёмся к вопросу №1: зачем нужна контрольная сумма, если игра её игнорирует? Если не игнорирует, скажи где и что поменять, чтобы игра выбросила сообщение-ошибку. Тогда уже можно будет идти-отлаживать от него вверх и найти место подсчёта контрольной суммы.
Формат .HOG файлов такой:
DWORD - singature/version // сигнатура или версия - игра всегда проверяет, чтобы было равно $20001 (см. код на .5DA88C)
DWORD - TOC offs // смещение до таблицы содержимого (TOC)
DWORD - zero // всегда ноль, вроде бы
DWORD - hash/crc(1) // контрольная сумма для заголовка (???)
DWORD - files count // количество файлов в архиве
DWORD - unknown // неизвестно, какой-то размер похоже, но я не понял что это (???)
DWORD - hash/crc(2) // второе непонятное число (???)
Формат TOC:
DWORD - name // смещение до начала ACSIIZ имени файла - это то, что ты принял за ID
DWORD - offs // смещение до данных файла
DWORD - size // размер файла
DWORD - hash/crc(3) // это самое, что непонятно как считается (???)
Далее идут друг за другом ASCIIZ имена.
С именами, кстати, всё просто - если ты делаешь FileMapping() или прочитал весь файл в память, то не нужно читать по одному байту, пока не 0, можно проще:
PTR_START, FileName: PChar;
...
FileName:=PTR_START; // присваиваем указатель на начало архива
Inc(FileName, TOC[I].name); // сдвигаем его до имени файла
WriteLn(FileName); // получили имя текущего, I-того, файла
Ссылки на игру:
_ttp://ifolder.ru/22688282
_ttp://ifolder.ru/22687944
_ttp://ifolder.ru/22688054
_ttp://ifolder.ru/22687760
_ttp://ifolder.ru/22688384
Код распаковщика за авторством Siberian GRemlin'а:
показать
При несовпадении контрольной суммы игра не выдаёт сообщений, а просто игнорирует этот файл, т.е. при перепаковке архива со звуками игра становится немой.
Я подозревал, что что-то такое примерно и происходит.
Хм, как же тогда к вычислению суммы-то подобраться...
Один человек поделился алгоритмом