![]() |
Добро пожаловать, гость ( Вход | Регистрация )
![]() |
-=CHE@TER=- |
![]()
Сообщение
#1
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,371 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 318 раз(а) ![]() |
Пишу сейчас страничку для сайта (ctpax-cheater) для игры The Neverhood.
В игре во всю используется вот такая хеш-функция (я её немножно переписал под свои нужды): CODE // The Neverhood hash routine Const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; Function StrHash(S: String): Longword; Var I, C, K: Longword; Begin result:=0; C:=0; For I:=1 To Length(S) Do Begin S[I]:=UpCase(S[I]); K:=Pos(S[I], chars); If K <> 0 Then Begin If K <= 10 Then // Digits C:=C + (Ord(S[I]) + $16 - $40) Else C:=C + (Ord(S[I]) - $40); If C >= $20 Then C:=C - $20; result:=result xor (1 ShL C); End; End; End; Т.е. игнорируется всё, что не цифры и английские буквы, затем от получившегося считается хеш. В demo-версии эта функция находится в sub_425C10. Ею зашифрованы как коды, так и имена файлов в .BLB архивах. В Интернете нагуглил только два кода (там ещё один есть, но он неработающий - что-то забыли): fastforward - увеличивает скорость игры в два раза (хеш $843070C0) happybirthdayklaymen - работает только на первом экране - перекидывает игрока на второй (*улыбается*) (хеш $188B2105) После набора кода нужно нажать ENTER. Перед набором, кстати, тоже неплохо будет - вдруг уже что-то нажимали (ENTER отправляет код на обработку и чистит буфер ввода для кода). Однако, если поглядеть под отладчиком даже demo-версию - кодов там дохрена и больше (вернее хешей). Плюс они раскиданы по нескольким разным функциям (как два кода выше), что затрудняет работу с ними. Есть, например, хеш $10410127 - он сохраняет текущий кадр игры в c:\NevShot.bmp (даже во время проигрывания smack-видео!). Но вот какой код ему соответствует - хрен знает. Есть два способа посмотреть все коды: 1) Заменить хеши на известные значения. 2) Brute-force (полный перебор). 1-ый способ очень неудобен, потому что: а) Все хеши кодов внутри какого-то case/switch и они должны быть заменены на соответствующие (т.е. отсортированы по возрастанию, а не как попало). б) Они разбросаны по разным функциям, так что бегать между ними очень неудобно. в) Этот способ неудобен ещё и тем, что его нельзя предложить всем имеющим игру - им придётся её как минимум патчить. Перебор же очень трудоёмкий, даже если выбросить оттуда UpCase (т.е. заведомо перебирать только заглавные буквы и цифры) и оптимизировать. Я заметил, что в этом алгоритме на каждом шаге зажигается или гасится (если уже был зажжён) 1 бит в хеше. Т.е. для упомянутого хеша $10410127 слово-пароль должно состоять как минимум из 8 знаков (с учётом того, что ни один бит не выключался), так как в этом числе 8 не нулевых бит. Собственно, вопрос: кто-нибудь может предложить простой и быстрый алгоритм для перебора? Может быть я чего-то не вижу и здесь можно гораздо быстрее и проще хеш подобрать. Мне не обязательно получить именно тот код, который задумывался создателями - какая-нибудь последовательность типа "bsb99dc" - тоже сойдёт. |
![]() ![]() |
Siberian GRemlin |
![]()
Сообщение
#2
|
![]() Advanced Member ![]() ![]() ![]() Группа: CTPAX-X Сообщений: 537 Регистрация: 4-February 08 Пользователь №: 2 Спасибо сказали: 222 раз(а) ![]() |
Какие технические сложности могут возникнуть при переводе данной игры с нуля?
|
-=CHE@TER=- |
![]()
Сообщение
#3
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,371 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 318 раз(а) ![]() |
Какие технические сложности могут возникнуть при переводе данной игры с нуля? Кучно вы пошли, кучно. (*улыбается*)У меня неделю назад один товарищ спрашивал как текст стены достать (он видеообзор делает). Я ему вытащил тексты из всех трёх версий (оригинал и два перевода) стены, писем-подсказок (второй экран игры, вниз по лестнице) и там ещё что-то было. А, кажись, текст на машинке "BOBBY" (это который подсказка для правильной комбинации: Blue Orange Blue Blue Yellow). Он, к моему удивлению, тоже как строка хранится. Товарищ предложил сделать нормальный перевод (поправить существующие) и даже вызвался помочь стену перевести, но мне это не особо интересно, так что я отказался, ибо лучше перевод с нуля делать, чем править то что есть. Итак, что нужно, чтобы сделать нормальный перевод: - самая главная проблема - все тексты хранятся в I.BLB, который лежит на CD-диске, так что перевод - это либо пересобрать полностью образ, либо делать portable-версию (с No-CD и установщиком с оригинального диска); - видеоролики: .SMK, там часть надписей, но Smacker старый, а Smacker Tools из RadVideoTools, вроде бы, делает только новый (по-хорошему, разобрать формат сжатия, в том же ffmpeg, вроде бы, есть, и изменить только кадры с текстом, чтобы качество при пережатии совсем не упало); - текст пунктов меню и ещё там пара других вещей - это картинки, в собственном формате игры, описание формата можно в исходных кодах SCUMMVM подсмотреть, я их вытаскивал из перевода "Фаргуса", ибо они были криво упакованы из-за чего игра валилась (переполнение памяти); текст, кстати, с прозрачностью (там только буквы и прозрачный фон), так что как его в "Фаргусе" умудрились запороть я даже представить себе не могу (см. перевод "Рисёча"); - тексты, как я уже сказал, лежат в I.BLB, это обычный текст, но, как и многое другое, сжат, в принципе, сжатие можно для переведённых файлов отключить (флагами в заголовке таблицы размещения файлов делается); - формат файлов-текстов из I.BLB (после распаковки!): DWORD count; // количество строк DWORD [count]; // относительные смещения (т.е. после этой таблицы - первое смещение 0) на начало строк Все строки ASCIIZ (т.е. с завершающим нулём). Но! Один такой указатель может указывать на насколько строк: CODE Dear Klaymen,| |Please feed my|pet flytrap. He|eats ring-food.| |I do not.| |Love Willie| | Здесь символы "|" - это нули. Поэтому чтобы узнать сколько реально данных в одной строке, нужно брать разницу между следующим смещением и текущим (или концом файла, если смещение последнее). - шрифты - это, видимо, реальная проблема, потому что и "Фаргус", и "Рисёч" заменили английские буквы русскими и у каждого из них своя таблица перекодировки (мне пришлось её по ходу дела восстанавливать, чтобы текст читаемый был); формат шрифтов мне неизвестен (ну, т.е. картинку-то с ними достать можно, а вот где лежат размеры и смещения для неё, т.е. какой символ с какой позиции брать и какая у него ширина/высота - этого я не знаю, но, опять же, в SCUMMVM подсмотреть можно); - ну и хорошо бы при упаковке взад-назад, как в игре, вернуть сжатие где оно есть и сохранить выравнивание на 32 бита (4 байта) для каждого файла в .BLB, как это было в оригинале. Вроде бы, всё. |
![]() ![]() |
Упрощённая версия | Сейчас: 1st May 2025 - 02:06 |