Я работаю над многопользовательской игрой на платформе Unity с пользовательским сетевым кодом, запрограммированным на C # (без использования встроенной сетевой инфраструктуры Unity). Из-за большого масштаба (сложно для многих игроков) и конкурентного характера (не желая, чтобы люди имели несправедливое преимущество) в игре, очень важно, чтобы пакетный протокол и обработка этих пакетов на стороне клиента были максимально защищен от лиц, которые хотели бы использовать эту информацию для создания ботов / хаков и т. д. Ultima Online — отличный пример игры, которая была «полностью проработана» — и существует множество программ там разработали люди, которые могут обмануть реального клиента и обуздать игровой процесс. Такого рода вещи я бы хотел избежать, если это вообще возможно.
Насколько я могу судить, это чрезвычайно сложная проблема (возможно, без отличного решения). Очевидно, что пакеты являются открыто видимыми, хотя я полагаю, что есть несколько довольно простых приемов, которые делают их непонятными для слепого наблюдателя и постоянно меняющимися в природе …
Моя главная задача — декомпиляторы. Любые уловки, которые я должен скрыть, содержимое пакета / протокол почти наверняка будут обнаружены, когда код C # просто декомпилируется. Я, наверное, слишком обдумываю это, а вы, вероятно, думаете «просто используйте обфускатор». Признаюсь, у меня нет никакого опыта работы с обфускаторами — действительно ли это помешает подкованному человеку узнать, как пакеты «расшифровываются» / обрабатываются и «шифруются» и отправляются клиентом? Хотя я полагаю, что я не в теме — это не означает, что речь идет об обфускаторах, хотя я думаю, что я бы приветствовал простой ответ типа «просто напишите свой код на C # и используйте обфускатор».
У меня вопрос такой:
поскольку код C # можно легко обнаружить с помощью декомпилятора, а программы, реализованные на C ++, гораздо труднее получить с помощью декомпиляции, можно ли использовать циклическую ссылку между программой C # (загрузка внешней библиотеки C ++ и выполнение функций с ее помощью которые манипулируют данными перед отправкой) и библиотеку C ++ (которая, в свою очередь, загружает библиотеку C # и выполняет с ней функции — функции, которые могут изменять или не изменять конкретные данные, важные для сетевого протокола, но без какого-либо видимого контекста, поскольку он вызывался извне) ? Мне кажется, что таким образом (если это вообще возможно) истинное «массирование» данных перед их отправкой — это всегда некоторое взаимодействие между двумя библиотеками, и поэтому любые потенциальные «исследователи» могут быть очень легко перенаправлены так как только половина этого взаимодействия даже отдаленно видна. Я не решаюсь полностью полагаться на библиотеку C ++ (без сложного «разговора» с кодом C #), так как кажется, что программисту было бы легко использовать этот интерфейс, если бы он знал сторону C # … Или возможно я понятия не имею о чем говорю.
Можно ли создать такое взаимодействие между двумя такими библиотеками?
Если это возможно, это даже отдаленно хорошая идея — почему или почему нет?
Существуют ли другие более эффективные решения для защиты вашего пакетного протокола и того, чтобы кто-то почти не мог узнать, что означают пакетные данные и как они обрабатываются на стороне клиента?
Заранее благодарим за любые идеи, которые вы можете дать!
Задача ещё не решена.
Других решений пока нет …