Я использовал Unity для создания 2D-игры, которая будет полностью автономна (что является проблемой), для игры требуется, чтобы вы вводили определенные строки на определенных уровнях, а Unity компилируется в библиотеки DLL, которые можно легко перепроектировать, поэтому Есть ли способ защитить эти строки (игра в автономном режиме, поэтому я не могу получить из другого источника)?
Игра в значительной степени опирается на эти строки, и да, я знаю о Obfuscation, но я хочу что-то более надежное. И я знаю, что самым простым выходом было бы делать все онлайн из источника данных, но мне было интересно, возможно ли это.
unity
c#
anti-cheat
TheBinaryGuy
источник
источник
strings
на нее программу.Ответы:
Не храните эти строки, храните их (криптографический) хеш.
(Криптографическая) хеш-функция, такая как шифрование, - это способ превратить строку в «бессмысленный» (называемый хеш-код), но в отличие от шифрования вы не можете получить исходную строку из этого хеш-кода (если вы не можете перебрать ее или перебрать) функция нарушена). Большинство (если не все) хеш-функций принимает строку произвольной длины и возвращает строку постоянной длины (зависит от функции).
Как проверить правильность введенной пользователем строки? Поскольку вы не можете получить действительную строку из хеша, единственное, что вы можете сделать, это хешировать предположение пользователя и сравнивать его с правильным хешем.
Предупреждение (Эрик Липперт): НЕ ИСПОЛЬЗУЙТЕ встроенную функцию
GetHashCode
как такую функцию - ее результат может различаться в разных версиях .NET и платформах, поэтому ваш код работает только на определенных версиях .NET Framework и платформе.источник
То, что вы пытаетесь сделать, бесполезно и бессмысленно.
Это бесполезно, потому что нет способа правильно скрыть информацию, которая находится на компьютере пользователя. Любой достаточно преданный найдет это. Вы можете сделать это сложнее, но вы никогда не сможете предотвратить это. Если вы его зашифруете, то вам нужно где-то хранить ключ шифрования и алгоритм. Независимо от того, сколько слоев шифрования вы добавите, для запуска вашей игры самый верхний слой всегда должен быть незашифрован.
Это также бессмысленно, потому что мы живем в эпоху Интернета. Когда ваша игра станет просто удаленно популярной, эти пароли будут размещены по всей сети.
Все, что вы можете сделать, - это доверить игроку, что он не испортит себе игровой опыт, отыскивая информацию, которую игра пока не должна ему сообщать. Подавляющее большинство игроков в любом случае не начнет реверс-инжиниринг вашей игры. И если те, кто обладает необходимыми навыками, делают это по своей вине.
источник
Если такая вещь действительно желательна, то вместо хеширования вы можете рассмотреть возможность построения строк из числового входного значения во время выполнения.
Преимущество состоит в том, что, как указал @Philipp, бессмысленно пытаться скрыть коды в исполняемом файле, если вы все равно можете ожидать их размещения в Интернете. Хешированный или нет, одно и то же слово, найденное в интернете и введенное в игру, даст тот же хеш и будет работать в любом случае.
За исключением ... кроме случаев, когда чужой код не работает для вас. Что вы можете сделать тривиально - не на 100% защищено от несанкционированного доступа, но достаточно сложно обойти для среднего пользователя. Подойдет все, что может сделать «Генератор имён эльфов в Интернете» (может быть сколь угодно простым, на самом деле не нужно много движка генерации текста на языке markov, достаточно выбрать 4-5 слогов из случайного списка).
Просто сгенерируйте какое-нибудь пользовательское или машинное число, оно даже не должно быть совершенно уникальным или очень устойчивым к взлому. Что-то, что, вероятно, отличается для большинства людей и вряд ли будет регулярно меняться, например, сетевое имя компьютера, MAC-адрес или GUID системного диска, что угодно (серийный номер графического процессора может быть очень плохимидея, так как пользователи могут обновить GPU). Добавьте к этому числовой код, к которому относится код разблокировки, и введите его в свой генератор слов. Но будьте готовы ответить на вопросы поддержки, когда игроки используют два компьютера или меняют сетевую карту (что необычно, но не невозможно). Это может быть хорошим планом - генерировать случайный идентификатор только один раз и сохранять его с настройками игры. Таким образом, по крайней мере, это не нарушает существующие установки на той же машине, если что-то меняется.
Или вы можете просто использовать серийный номер игры, который уникален и будет работать, если пользователь меняет оборудование (по иронии судьбы, это может способствовать пиратству, поскольку общие коды разблокировки работают для пиратских сериалов, но не для законных клиентов!).
Обратите внимание, что предотвращение обмана пользователей не обязательно является хорошей вещью. В оффлайн (то есть неконкурентной игре) обычно нет проблем, если пользователь обманывает и получает коды откуда- то, а не из игры. Он обманывает только себя. Какая разница.
С другой стороны, слишком много мешать им, если они действительно хотят обмануть, - отличная возможность полностью разозлить платящих клиентов.
Итак ... прежде чем делать что-то таким образом, очень тщательно подумайте, действительно ли вы этого хотите и чего хотите. Вполне возможно, наличие читаемых человеком строк (или тривиально сделанных «нечитаемых» с помощью xor) просто достаточно хорошо и действительно предпочтительнее.
источник
hash(serial + 1)
чтобы получить число, соответствующее первому коду. Затем введите это в свой генератор слов, который, скажем, вытягивает один слог из списка 16 для каждых 4 бит ввода. Вот и все, отдельные «слова» для каждого пользователя.hash(serial+1)
после загрузки, что мешает пользователю рассчитатьhash(serial+1)
? Как только программа загружена, пользователь получает доступ ко всему, что делает программа.hash(serial + 1)
. И что? Это не проблема. Послушайте, если кто-то тратит от одного до двух часов (вероятно, 6-8 часов для типичного "пользователя" без опыта разработчика программного обеспечения), просто чтобы обмануть себя, ну ... пусть. Дело в том, что это работает для одного человека, но не для всех, и это неконкурентоспособно ... так что нет проблем.Если вам не нужно показывать строки, то идея хеширования - это, вероятно, верный путь. Если, с другой стороны, вам нужно показать их пользователю, есть несколько других способов, которыми вы могли бы избежать их непосредственного отображения в вашей DLL.
Один из способов справиться с этим помимо шифрования или иного обфусцирования строк - это их разбить. Может быть, просто иметь отсортированный по алфавиту словарь всех возможных слов из всех строк в игре. Затем где-нибудь есть массив, который позволяет вам соединять слова в нужную строку путем индексации в массив слов. Таким образом, у вас нет полных строк в игре. Для расшифровки строк не требуется мастер-ключ. И данные, которые сообщают их порядок, могут быть по всему вашему источнику, если, например, каждая функция, которая использовала строку, просто имеет массив индексов, локальных для функции. Я не уверен, насколько это практично в вашем конкретном случае, но это один из способов сделать это.
Вы можете даже иметь строку, состоящую из нескольких слов, но в итоге они будут расположены в разных порядках. Например, вам могут понадобиться следующие 2 строки:
Ваш список фраз будет содержать как «медведь», так и «мой дом», но у вас будет большой список других фраз, которые могут быть вставлены между ними, так что выясните, какая из них будет столь же трудной, как и сама мысль загадка в игре (или как там). Например, фразы действия можно было «пройти», «сжечь», «толкнуть», «защитить меня от», «отделить меня от», «магически произвести» и т. Д.
Вы можете внести это в свою игру, сделав индексы основанными на том, что игрок собрал или сделал. Так что нигде в игре не было бы основного списка индексов. Они будут генерироваться игроком, играющим в игру.
источник
strings
против исполняемого.