Сказ о том, почему LelResetFeg со спидраном не свезло

3 дня назад во время прохождения GTA: San Andreas на скорость товарищу LelResetFeg на голову упал вертолёт. Некоторые игроки начали подозревать стримера в нечестной игре, но если подумать, то ситуация выглядит слишком глупо
Если вы ранее играли в GTA: SA, то вполне возможно, что подобное с вами уже случалось: совершенно рандомная последовательность клавиш приводила к активации какого-нибудь чита.
В этом посте мы разберёмся, что же приводит к такому поведению игры

Дальше будет много технических подробностей, а сочетания, которые мог случайно прожать стример, будут в конце

Для начала, нужно понять, как игра хранит список чит кодов.
Этот вопрос решается простым гуглением:

GTAG Modding:
San Andreas stores the last 29 characters typed on the keyboard, hashes the resulting string and compares it with the hashes of the cheats. Because the cheats are stored in hash form, it is much harder to figure out what they are. Most cheats have more than one code due to hash collisions and the intended cheat phrases for many took a long time to find.
...
Cheats have a minimum length of 6 characters and are stored all in upper-case.


Отлично, теперь мы знаем следующее:

- Чит коды хранятся в виде хешей
- Хеш-функция достаточно слабая (много коллизий)
- Длина чит кода может быть от 6 до 29 символов

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

Пример: Вы можете хешировать «Войну и мир» Л. Н. Толстого и на выходе получить строку вроде "73279c854ad356869d3f59150ebc964d53269aed" (хеш по алгоритму SHA-1). Затем, если вам скинут архив с кучей книг и рандомными названиями, то найти среди них нужное издание книги вы сможете просчитав хеши всех книг, и найдя среди них книгу с хешем "73279c854ad356869d3f59150ebc964d53269aed" (не читая ни названий, ни содержания).
Вероятность того, что хеш SHA-1 совпадёт с хешем другой книги - крайне мала.

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

Итак, что мы можем сделать дальше?
Поверим англоязычным товарищам на слово и будем считать, что хеш-функция действительно слабая.
Для этого есть некоторые предпосылки, например, оптимизация: во времена разработки GTA: SA (напомню, игра вышла в конце 2004 года) трата кучи ресурсов компьютера на просчёт хеша последних введённых символов на клавиатуре была бы... не лучшим вложением.

Наша задача - найти как можно больше коллизий для чит кода OHDUDE (спавн вертолёта Hunter), для её упрощения (и ускорения расчётов) мы ограничимся набором символов "WASD"

Проблема: не понятно, какую хеш-функцию использует игра. По этому поводу информации практически не найти, поэтому рассмотрим, какие кусочки информации есть на форумах:

Есть хеши чит-кодов:

Сказ о том, почему LelResetFeg со спидраном не свезло GTA: San Andreas, Программирование, Читы, Реверс-инжиниринг, Видео, Длиннопост

Каждый хеш длиной в 4 байта, с такой длиной куча коллизий - не сюрприз.
Запомним хеш нужного нам чита - 0xE958788A
На ум сразу приходит CRC32 (32=8*4 - от количества бит в хеше), вот только не понятно, какая его разновидность используется в игре.

Не будем ломать себе мозг и воспользуемся калькулятором.
Вводим OHDUDE, и... ничего похожего здесь нет:

Сказ о том, почему LelResetFeg со спидраном не свезло GTA: San Andreas, Программирование, Читы, Реверс-инжиниринг, Видео, Длиннопост

На этом этапе я провёл достаточно много времени, обнаружил на форумах утверждение, что в игре используется CRC-32/JAMCRC. Также было упоминание о расчётах CRC-32 в исходных кодах инструмента для изменения игровых файлов, но результаты никак не сходились.
До тех пор, пока до меня не дошло, что гораздо удобнее хранить историю нажатых клавиш в перевёрнутом виде. Посмотрим:

Сказ о том, почему LelResetFeg со спидраном не свезло GTA: San Andreas, Программирование, Читы, Реверс-инжиниринг, Видео, Длиннопост

Ха, вот оно как!
Значит, осталось перебрать все возможные последовательности нажатия кнопок W, A, S и D, хеш CRC-32/JAMCRC которых будет равен 0xE958788A.

Конечно, делать это мы будем не ручками, а при помощи небольшой программы.
В ней нет почти ничего интересного, суть сводится вот к чему:
- Получаем на вход ожидаемый чит код
- Считаем его хеш
- Перебираем все возможные сочетания WASD (длиной до 17 символов, но это можно изменить)
- Выплёвываем все совпадения, предварительно перевернув строку задом наперёд
Самые любопытные могут почитать исходный код. (Писалось под Linux/g++, заводилось на WSL)

Итак, после перебора 17 179 869 100 возможных сочетаний мы получаем следующий список:

1. DASD AWAA WSSW WAW
2. AWDD WAAD SAAA WASS S
3. SWSW SWAA AWWW ASWW S
4. SSWD AWSS ADWD SSDW A
5. SDAW WDWS DDWS WSAW A
(если проверять все возможные сочетания, список будет гораздо длиннее, но перебор 288 230 376 151 711 744 сочетаний займёт... скажем, достаточно продолжительное время)


5 коллизий, и это только 4 кнопки с макс. длиной 17 символов! Время проверить:

Ни одной осечки :)
Такой вот ночной детектив.
Будете генерировать свои версии чит-кодов - кидайте в комментарии, может кому-нибудь они ещё понадобятся.

Лига Геймеров

44K постов88.8K подписчика

Добавить пост

Правила сообщества

Ничто не истинно, все дозволено, кроме политоты, за нее пермач, идите на ютуб
Помни!
- Новостные/информационные публикации постим в pikabu GAMES
- Развлекательный контент в Лигу Геймеров



Нельзя:

Попрошайничать;

Рекламировать;

Оскорблять участников сообщества;

Нельзя оценивать Toki Tori ниже чем на 10 баллов из 10;

Выкладывать ваши кулвидосы с только что зареганных акков - пермач

Вы смотрите срез комментариев. Показать все
DELETED
Автор поста оценил этот комментарий

А для чего эти читы вообще делаются, что бы разработчикам было удобнее тестировать игру? Или все таки для определенной категории игроков?

Я понял, хеши хранятся в игровом клиенте, что бы игроки не смогли найти чит в виде строки, если будут декомпилировать код/игровые ресурсы.

Я вот сам разработчик, сделал для тестирования чит просто из комбинации клавишь. А теперь вот думаю, надо наверное хеш считать. Кстати, если сделать сначала входную комбинацию нажатий, а хеш считать только после неё, то можно избежать коллизий и использовать более серьезное хеширование.

раскрыть ветку (30)
5
Автор поста оценил этот комментарий
Ну, изначально их сделали для тестов и отладки, для поиска багов итд
Какой-то игрок случайно обнаружил это дело
И понеслась
На юютубе есть серия видосов на тему истории гейминга в целом, и там об этом более плотно рассказано
Могу сскинуть ссылку, если надо
раскрыть ветку (5)
Автор поста оценил этот комментарий

Надо.

раскрыть ветку (4)
1
Автор поста оценил этот комментарий
https://youtu.be/It2clObyke8
А пожалуйста
раскрыть ветку (3)
Автор поста оценил этот комментарий

Спасибо.

раскрыть ветку (1)
Автор поста оценил этот комментарий
Обращайся)
Автор поста оценил этот комментарий

О, булджать

10
Автор поста оценил этот комментарий

это наследие консольного гейминга, там чит коды это как новый режим игры для развлечения

разработчикам не нужны читы для тестов, они могут через консоль что хочешь заспавнить и поменять в игре

раскрыть ветку (22)
11
Автор поста оценил этот комментарий

Вообще-то читы нужны для тестирования. Тот же чит на выбор уровня был нужен чтобы не ебаться со всей игрой, а отлаживать только нужный уровень.

Сейчас читы просто дань прошлому.

раскрыть ветку (13)
1
Автор поста оценил этот комментарий
Не совсем, в некоторых играх их оставляют, поскольку все баги найти невозможно, а читы помогают с ними бороться.
раскрыть ветку (12)
2
Автор поста оценил этот комментарий

Тогда про баг и чит должны писать в мануале.

раскрыть ветку (10)
2
Автор поста оценил этот комментарий
Ага, "вы купили игру за пару тыс, но мы ее хреново сделали, так что крутитесь сами". Ты бы стал брать машину где в багажнике набор ключей и инструкция по ремонту движка в домашних условиях идет в комплекте? ×
раскрыть ветку (9)
2
Автор поста оценил этот комментарий

То есть охуенней когда "да ебаный врот это место не пройти, загуглю. чо? надо читерить чтобы пройти? ебаные разрабы!"

раскрыть ветку (8)
Автор поста оценил этот комментарий

Понятное дело лучше, чтобы баги устраняли на этапе создания игры, но найти их все в больших играх с открытым миром довольно сложно. Поэтому баги неизбежны. А значит есть два варианта заставить игрока ждать патча пока баг исправят и получать в это время кучу гневных отзывов от игроков, не успеть патч нормально протестировать, получить после его выхода еще кучу багов. Или оставить лазейки в виде читов, и спокойно пилить патч.

раскрыть ветку (7)
Автор поста оценил этот комментарий

И как кто-то узнает про чит если он не задокументирован? Люди так и будут ныть.

раскрыть ветку (6)
1
Автор поста оценил этот комментарий
Некоторые выкладывают сами разработчики, некоторые по умолчанию выводятся в игре при вводе help в консоли. Так что многие из них легко найти.
раскрыть ветку (5)
Автор поста оценил этот комментарий

консоль уже за чит не считается

раскрыть ветку (4)
Автор поста оценил этот комментарий

А ещё, например, в консолях с картриджами просто не было сохранений, и выбор уровня был возможностью продолжить игру с того места, где ты её закончил)

6
Автор поста оценил этот комментарий
Может, это для тестеров? Они в консоли не сильны
раскрыть ветку (2)
3
Автор поста оценил этот комментарий

Скорее просто по фану. Потому что могут :)

1
Автор поста оценил этот комментарий

для тестеров делается "hidden menu" с кучей кнопок на любой вкус от убийства всего вокруг до спавна ласт босса в стартовой локации

Автор поста оценил этот комментарий

Да, в GTA V например читы можно открывать прямо в игре. Я уже не помню условие для этого. Правда если хоть один используешь, то игру на 100% пройти не сможешь.

раскрыть ветку (1)
Автор поста оценил этот комментарий

так в любой гта было

DELETED
Автор поста оценил этот комментарий

Если это просто режим игры, то зачем прятать читы в хешах?

раскрыть ветку (2)
1
Автор поста оценил этот комментарий

ты явно не понимаешь как оперативная память работает

раскрыть ветку (1)
DELETED
Автор поста оценил этот комментарий

Интересное заявление. Но я вопрос и задал, вы бы могли ответить.

Сейчас обратил внимание, что хеш всего 4 байта. Вопрос снимается. Хотя я бы выстроил дерево по символам для читов, по процессорному времени это было бы быстрее.

Автор поста оценил этот комментарий
На счёт СА не скажу ничего, но давеча я купил в ГОГ пятых героев, и там в руководстве к редактору уровней, лежит также глава про чит коды (может оно везде есть, но я в детстве пиратил героев).

Мое предположение, что вот для героев, создателю уровня, возможно потребуется тестировать разные штуки на своей карте, типо условий перехода через границу и т.д.

Иными словами, читы оставляют для игроков, но не всегда в целях фана.
Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку