1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Дикий античит, постоянно перекомпилирующий код клиента

Тема в разделе "Оффтопик", создана пользователем Хоботан, 10 июн 2020.

  1. Автор темы
    Хоботан

    Хоботан Новичок

    Баллы:
    5
    Доброго дня.

    Я делаю майнкрафтоподобную игру и придумал свирепый античит. Суть подхода в том, что код клиента хранится на сервере в недокомпилированном виде, то есть в терминах llvm в формате IR после прохода всех оптимизационных плагинов. Раз в N секунд(пусть N=15) вырабатывается новый ключ шифрования траффика, в код клиента это ключ вставляется в пометкой что его надо ныкать очень жестко, код клиента переколбашивается обфускатором и отправляется игрокам. У тех есть еще M секунд чтоб скомпилировать код и перейти на него. По истечении M секунд мы увидим кто читер.

    Теоретически читеры могут пытаться взломать в реальном времени клиента но мой личный опыт создания декомпиляторов говорит что всё это утыкается в fuzzy-logic для опознания определённых операций. Я таки с этим делом работал.

    Что меня смущает в идее: так это возможность сделать самый гадостный чит - Х-ray - просто перехватив запросы к opengl. Здесь проблема кроется в том, что шейдеры невозможно постоянно обфусцировать потому что они должны быть красивыми и быстрыми. Код клиента как раз можно, я придумал как рендерить X*Y*Z далеко расположенных вокселей за Х+Y+Z сложности, а ближние объекты один хрен будут meshами.

    Собственно вопрос: есть ли какие нибудь идеи что можно сделать с opengl чтоб даже если враг перехватывает все вызовы он всё равно всрался? У меня есть идея в общих чертах но она потребует GPU на сервере. что-то типа Ryzen2200G которые есть у селектела(тогда можно и ядро на opencl переписать).

    bukkit здесь при том, что я ведь могу и протокол майнкрафта осилить и будет вам защита от читеров.
     
  2. Lilifi

    Lilifi Участник Пользователь

    Баллы:
    36
    Ты создал свою собственную игру!?
     
  3. Lilifi

    Lilifi Участник Пользователь

    Баллы:
    36
    По крайней мере в minecraft с помощью плагинов на сервере что бы заблокировать x-ray делают следующее: Проверяют, может ли игрок увидеть руду, и если да, тогда присылают данные что она есть, а если нет (как пример она под землёй) тогда посылают данные что это не руда, а камень. Но когда игрок может видеть эту руду, тогда ему посылаются данные о том что это руда.

    Надеюсь ты меня понел...
     
  4. Автор темы
    Хоботан

    Хоботан Новичок

    Баллы:
    5
    Нет, я еще только делаю её. Без античита-то сделать без проблем, прототип есть, но античит от X-ray надо добавлять прямо в шейдеры, а там особо не поколбасишь.

    Была идея шифровать шейдеры: теоретически аппаратный видеодекодер может расшифровать буфер и держать его содержимое недоступным для обратной вычитки, но вот как этот буфер передать на исполнение и самое главное как зашифровать если ключ секретный и копирасты его не дадут. Это бы решило кучу проблем сразу.
     
  5. ArtFect

    ArtFect Активный участник

    Баллы:
    61
    Имя в Minecraft:
    Fiw
    Просто не отправляй игроку инфу о ценных блоках, которые он не видит, как написал чел выше, не?
     
  6. Автор темы
    Хоботан

    Хоботан Новичок

    Баллы:
    5
    Да дело не в руде. Хер бы с ней с рудой, если ты знаешь seed мира и можешь сам посчитать где эта руда лежит.

    Я хочу в принципе подавить возможность колбасить картинку. Чтоб можно было прятаться в траве от снайпера, чтоб wallhack если не неработал, то хотя бы палился на раз. Эта проблема не решается даже с помощью intel enclave или svm потому что рано или поздно ты вызываешь opengl и в этот момент все твои данные могут быть попячены.

    Что интересно, на современных видяхах есть девайс который может запирать данные: AMD Trusted Memory Zone например. Но для этого придётся попросить игроков купить себе новую видяху и установить линукс.
     
  7. Lilifi

    Lilifi Участник Пользователь

    Баллы:
    36
    Это был я, Lilifi
     
  8. Lilifi

    Lilifi Участник Пользователь

    Баллы:
    36
    Wallhack/Player ESP можно заблокировать так же, по крайней мере в майнкрафте. Если игрока не может видеть игрока, тогда информация о нём не отправляется. Но единственное, если игрок играет в режиме от третьего лица и смотрит назад, тогда он не увидит игроков, это недостаток.
     
  9. HoShiMin

    HoShiMin Старожил Пользователь

    Баллы:
    173
    А что мешает ограничить доступ на запись к кодовым секциям графических библиотек? Если уж речь пошла об SVM, то сделать это несложно. И никто твой код, простите за выражение, не "попячит".

    http://rubukkit.org/threads/c-17-av...-sluzhbe-u-chitera.162837/page-5#post-1626502
     
    Последнее редактирование: 10 июн 2020
  10. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Если игра уже запущена ты ее не сможешь переобфать. Идея интересная, но не реализуемая.
     
  11. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Лучше возьми minetest за основу. он на cpp написан. Так просто не вскроют. А если еще и протектор повесить.
     
  12. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Ну в целом ты прав, можно хукнутся в нативку lwjgl и создать икс рей. И никакая твоя мегапупер обфускация с тонной шифрования уже не спасет.
     
  13. Автор темы
    Хоботан

    Хоботан Новичок

    Баллы:
    5
    Проблема в том, что opengl не засунешь в SVM. Во-первых драйвера (по своему опыту работы в АМД скажу) сильно кишками привязаны к минипорту(тот что в ядре) и просто так это не заизолируешь . там реально говнокодище и думаю что у невидии не лучше дела обстоят. Ведь времени на переделку legacy не дают вообще, всё должно делаться поверх существующего. В амд доходило до того, что драйвер для линукса писали по партизански, потому что куроводство никаких линуксов видеть не желало, но при этом хотело в андроид. Там кромешные идиоты сидят во всех корпорациях, потомственные руководители со времён основания сша.

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

    За ссылку спасибо. Посмотрю, я буду также и С++ный клиент делать, перекомпиляцию - это не проблема вообще, ассемблер знаю, даже небольшую js-машину сделал.
     
  14. HoShiMin

    HoShiMin Старожил Пользователь

    Баллы:
    173
    Нет, концепция немного другая: в VMX\SVM ты засовываешь не отдельную библиотеку\драйвер\компонент, а всю систему. Т.е., виртуализуешь живую операционку и получаешь возможность ловить обращения к любой памяти. И отсекать нежелательные. Таким образом, ты сможешь запретить перехватывать что-либо в нужных тебе библиотеках (доступа на запись не будет или, например, гипервизор пропускает инструкцию без ошибок - эксепшнов нет, но нет и фактической записи). А на чтение и исполнение оставляешь полный доступ. И здесь уже бессильны и CheatEngine с его драйверами, и ArtMoney, и самописные драйвера - перед гипервизором все равны.
     
  15. Автор темы
    Хоботан

    Хоботан Новичок

    Баллы:
    5
    Как раз можно.В игре вообще планирую два варианта: web и С++. для веба просто compileStreaming есть, с него решил начать т.к это проще.

    Для С++ решил выделить 128+1024мб heapа с правами на исполнение+запись(128) и запись(1024), где будут приземлять и код и данные соответственно. Плюс приложен генератор инструкций из байткода, чтоб при взломе сервера не поломали клиентов. Идея в том, что сервер будет знать раскладку данных в этом хипе. Он будет присылать пакеты и говорить куда их положить, а также команды: игра должна будет либо выполнить какую-то часть хипа, либо скопировать её в другое место хипа, либо отправить в GPU в заданный буфер, либо считать оттуда в заданный сегмент хипа. В идеале хотелось бы использовать persistent buffer, но там есть дикая подлянка как минимум на нвидии: умеет размещать persistent буфер не там где её просят а в видеопамяти с интересными побочными эффектами.
    машина стековая, за основу берем компилятор tcc.

    А вот что делать с шейдерами - вопрос великий в принципе и для веб-редакции - особенно. В С++ я могу выкинуть вообще весь opengl и на чистом opencl 1.2 налабать. Я могу генерировать на стороне сервера шейдеры в формате spir, но проблема в том, что надо как-то сделать чтоб данные на выходе шейдеров влияли не только на картинку но и на выполнение кода на проце. задача сейчас в процессе обдумывания, т.к. она дюже нетривиальна - надо постоянно рекомпилить шейдеры и их как-то менять, не сильно-то замедляя.

    так ловить будут на таблице импорта или в GOT в линуксе.
     
  16. Автор темы
    Хоботан

    Хоботан Новичок

    Баллы:
    5
    Дело за малым: написать драйвер для виртуализации для винды, т.к. по дефолту в ней нету виртуализации вообще. Это вам не линукс. И для х86-64 подписать его у микрософта.
     
  17. HoShiMin

    HoShiMin Старожил Пользователь

    Баллы:
    173
    Ну приехали. А куда делся Hyper-V и его удобный API для виртуализации? Он, конечно, требует двух галочек в программах и компонентах и виртуализовать систему на лету в нём нельзя, но это далеко не "нет виртуализации вообще", да и сам гипервизор на голову выше привычных VMware/VirtualBox. В линуксе, к слову, через KVM тоже нельзя виртуализовать самого себя.

    Это не сверхзадача. У меня логика гипервизора для SVM уместилась в 500 строчек, под VT-x - в полторы тысячи. Были бы готовые определения всех структур (а это самый большой и долгий труд), а логику можно написать недели за две-три по документации.

    А таблицу импорта уже легко проверить, хук там не скроешь и эта проверка не ресурсозатратная.

    Это, пожалуй, единственное препятствие, которое может стать проблемой.
    Однако, надо понимать, что если на проект понадобилась столь специфичная защита, проект может себе позволить оформить ИП, купить сертификат и подписать на портале MS.
    Или воспользоваться любым китайским EV-сертификатом, их можно найти в свободном доступе.
     
    Последнее редактирование: 11 июн 2020

Поделиться этой страницей