IPB

Добро пожаловать, гость ( Вход | Регистрация )

> The Neverhood, хеш алгоритм
-=CHE@TER=-
Jul 9 2011, 12:33
Сообщение #1


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,355
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 311 раз(а)



Пишу сейчас страничку для сайта (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" - тоже сойдёт.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
 
Reply to this topicStart new topic
Ответов
Siberian GRemlin
Mar 26 2018, 08:45
Сообщение #2


Advanced Member
***

Группа: CTPAX-X
Сообщений: 533
Регистрация: 4-February 08
Пользователь №: 2
Спасибо сказали: 221 раз(а)



Какие технические сложности могут возникнуть при переводе данной игры с нуля?
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Mar 26 2018, 09:47
Сообщение #3


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,355
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 311 раз(а)



QUOTE(Siberian GRemlin @ Mar 26 2018, 08:45) *
Какие технические сложности могут возникнуть при переводе данной игры с нуля?
Кучно вы пошли, кучно. (*улыбается*)
У меня неделю назад один товарищ спрашивал как текст стены достать (он видеообзор делает). Я ему вытащил тексты из всех трёх версий (оригинал и два перевода) стены, писем-подсказок (второй экран игры, вниз по лестнице) и там ещё что-то было. А, кажись, текст на машинке "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, как это было в оригинале.
Вроде бы, всё.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Сообщения в этой теме
-=CHE@TER=-   The Neverhood   Jul 9 2011, 12:33
Axsis   $10410127 - "AACCHFFD" ;) Правда у...   Jul 9 2011, 20:07
-=CHE@TER=-   $10410127 - "AACCHFFD" ;)Вай!...   Jul 10 2011, 04:30
Axsis   В общем каждый символ кода (цифра или буква) сдвиг...   Jul 11 2011, 14:15
-=CHE@TER=-   Спасибо большое! Примерно понял, в ближайшее в...   Jul 11 2011, 17:05
-=CHE@TER=-   Вот так: Function HashToStr(Hash: Longword...   Jul 16 2011, 08:44
Axsis   google на запрос "c:\NevShot.bmp" п...   Jul 16 2011, 20:00
-=CHE@TER=-   google на запрос "c:\NevShot.bmp" п...   Jul 17 2011, 07:29
-=CHE@TER=-   Так, почистил и переместил тему сюда. Ещё раз отде...   Jan 1 2012, 14:14
-=CHE@TER=-   Вчера обновил (так, мелкое обновление перед переме...   Apr 22 2014, 13:00
Siberian GRemlin   Ты уверен, что смотрел второе, исправленное издани...   Apr 23 2014, 12:50
-=CHE@TER=-   Тут проблема в том, что фиг знает как отличить пер...   Apr 24 2014, 05:46
Siberian GRemlin   Проверил. Второе издание отличается только исправл...   Apr 24 2014, 13:14
-=CHE@TER=-   Ну, значит моё исправление точно лишним не будет. ...   Apr 24 2014, 14:11
Siberian GRemlin   Какие технические сложности могут возникнуть при п...   Mar 26 2018, 08:45
-=CHE@TER=-   Какие технические сложности могут возникнуть при п...   Mar 26 2018, 09:47
-=CHE@TER=-   Товарищ закончил видео: [url=https://www.youtube.c...   Mar 28 2018, 10:16
Siberian GRemlin   Нет, «hood» это суффикс, используемый в существите...   Mar 28 2018, 13:54
-=CHE@TER=-   Кстати, что-то я протупил - в игре есть несколько ...   Apr 12 2018, 15:55
-=CHE@TER=-   Ну, начну в хронологическом порядке про хеши - с з...   Apr 11 2020, 13:25
hidefromkgb   Я верно понимаю, что перебиралось всё со скоростью...   Nov 23 2020, 10:42
-=CHE@TER=-   Я верно понимаю, что перебиралось всё со скоростью...   Nov 23 2020, 13:01
-=CHE@TER=-   Siberian GRemlin, извини, что я тебя не предупре...   Jul 19 2022, 15:22
Siberian GRemlin   Э-э, а я тут каким боком? Меня хороший человек, ко...   Jul 19 2022, 15:36
-=CHE@TER=-   Спасибо! Просто ты на предыдущей странице спра...   Jul 19 2022, 15:45
Siberian GRemlin   Просто ты на предыдущей странице спрашивал про то ...   Jul 19 2022, 16:05
Siberian GRemlin   Друг спрашивает, стоит ли ждать перевода «Skullmon...   Aug 13 2022, 09:51
-=CHE@TER=-   Мы с Rigel даже никогда не затрагивали этот вопрос...   Aug 13 2022, 15:02


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0 -

 



Упрощённая версия Сейчас: 26th May 2024 - 14:23