Почему античитерское ПО блокирует инструменты разгона?

Автор оригинала: Daax
  • Перевод

Кто из нас не пользовался читами в играх? Whosyourdaddy, thereisnospoon, hesoyam — помните? Но обращали ли вы внимание, почему, когда игрок пытается разогнать процессор или изменить настройки ПО, срабатывают некоторые программы против читеров вплоть до блокировки? Cпециально к старту нового потока курса разработчик игр на Unity, в этой статье попробуем разобраться почему инструменты мониторинга/разгона блокируются античитерским ПО. Статья будет полезна для читателей, не обладающих глубокими техническими знаниями в области использования ПО для читеров, против читеров, драйверов и того, что с ними связано.


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

Из соображений удобства конечные пользователи могут переработать код под свою ответственность. Непродуманные действия могут привести к повреждению системы. 

В нашем случае код для переработки берётся с таких сайтов, как kernelmode.info, OSR Online, и других. Особую обеспокоенность вызывают используемые таким программным обеспечением драйверы. Если бы я захотел причинить вред большому количеству людей (отличной мишенью для моей атаки могли бы стать геймеры и компьютерные энтузиасты), я бы в первую очередь использовал драйверы, входящие в состав некоторых программных инструментов, о которых расскажу далее. В статье я пишу только о некоторых драйверах, на самом деле их гораздо больше — кодонезависимыми десятки, если не сотни. Драйверы, о которых пойдёт речь, использовались сообществом читеров ранее или используются сейчас. Попытаемся понять, зачем вообще в такое программное обеспечение включаются драйверы.

Примечание: мы не имеем никакого отношения к издателям игр или поставщикам ПО против читеров и не сотрудничаем с ними ни на платной, ни на бесплатной основе.

Зачем нужны драйверы?

За последние 5–10 лет в связи с развитием индустрии профессионального гейминга и повышением технических требований к запуску определённых игр всё большую популярность приобретают инструменты мониторинга оборудования и повышения тактовой частоты процессора. Такие инструменты опрашивают различные компоненты системы, такие как GPU, CPU, датчики температуры и прочее, однако обычному пользователю получить эту информацию не так просто. 

Например, чтобы отправить запрос на цифровой датчик температуры для получения данных о температуре процессора, приложение должно выполнить чтение из моделезависимого регистра процессора. Доступ к таким регистрам процессора и внутренним механизмам чтения/записи возможен только с более высоким уровнем привилегий, например ring0 (на этом уровне работают драйверы). Моделезависимый регистр процессора (MSR) — это тип регистра, представляющий собой часть набора команд x86. Как следует из названия регистра, на процессорах одной модели имеются одни регистры, на процессорах другой модели — другие, что делает их моделезависимыми. Такие регистры используются в первую очередь для хранения специальной информации о платформе и особенностях процессора; они также могут использоваться для мониторинга показателей производительности или значений тепловых датчиков. 

Intel приняла решение включить в набор инструкций x86 две инструкции, позволяющие привилегированному ПО (операционной или другой системе) считывать или записывать данные в MSR. Инструкции rdmsr и wrmsr позволяют привилегированной программе-агенту запрашивать или изменять состояние одного из таких регистров. Для процессоров Intel и AMD имеется обширный перечень доступных MSR, которые можно найти в соответствующих SDM/APM. Тут важно отметить, что большая часть информации в таких моделезависимых регистрах не должна меняться никакими задачами — не важно, привилегированные они или нет. Но даже при написании драйверов устройств необходимость в этом возникает крайне редко.

Многие драйверы, создаваемые с целью программного мониторинга оборудования, позволяют задаче без привилегий (если под привилегиями понимать привилегии администратора) считывать/записывать произвольные MSR. 

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

Клиентское приложение, например десктопное приложение CPUZ, использует функцию WinAPI под названием DeviceIoControl. Говоря простым языком, CPUZ вызывает функцию DeviceIoControl с помощью известного разработчикам управляющего кода ввода/вывода, чтобы выполнить операцию чтения MSR, например, данных накристального цифрового датчика температуры. 

Вы скажете: ну и что? В чём проблема? Проблема в том, что эти драйверы реализуют дополнительную функциональность за рамками своих задач и делают это через тот же самый интерфейс — речь идёт, например, о записи в MSR или в физическую память.

Но, опять скажете вы, если коды известны только разработчикам, в чём же проблема? Плодотворным начинанием будет реверс-инжинеринг: всё, что нужно сделать злоумышленнику, — получить копию драйвера, загрузить её в любой дизассемблер, скажем, в IDA Pro, и проанализировать обработчик IOCTL

Ниже представлен код IOCTL в драйвере CPUZ, используемый для отправки двух байтов с двух различных портов ввода/вывода, — 0xB2 (широковещательный SMI) и 0x84 (выходной порт 4). Вот это уже становится интересно, так как SMI можно заставить использовать порт 0xB2, позволяющий войти в режим управления системой. Не хочу утверждать, что с этой функцией можно натворить дел, просто отмечаю интересную особенность. Порт SMI используется в первую очередь для отладки.

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

Недокументированный драйвер Intel

Этот драйвер был включён в состав инструмента диагностики Intel. С его помощью можно выполнять множество различных операций, из них наиболее проблемная — операция записи непосредственно на страницу памяти в физической памяти непривилегированным приложением.

Примечание: под непривилегированным приложением понимается приложение, выполняемое с низким уровнем привилегий, — ring-3; между тем, чтобы выполнить запрос DeviceIoControl, требуются права администратора.

Помимо прочего, драйвер предоставляет непосредственный доступ к порту ввода-вывода для записи, а эта операция должна быть доступна только привилегированным приложениям. Доступом к записи вполне можно злоупотребить во вред конечному пользователю. Вредоносная программа-агент может использовать драйвер, чтобы запустить «отказ в обслуживании» (denial-of-service) посредством записи в порт ввода-вывода, такая запись может использоваться для аппаратного сброса процессора.

В диагностическом инструменте Intel такие операции имеют определённый смысл. Однако драйвер подписан, входит в состав официально поставляемого инструмента, и, если он попадёт в нечистоплотные руки, его можно использовать для причинения вреда в нашем случае игровым приложениям. Возможность чтения и записи в физическую память означает, что злоумышленник может получить доступ к памяти игры в обход традиционных методов доступа, например, без получения доступа к процессу и без использования Windows API для чтения виртуальной памяти. Злоумышленнику, конечно, придётся постараться, но разве когда-нибудь такая мелочь останавливала мотивированного человека? 

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

HWMonitor

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

На скриншоте ниже показан другой метод чтения части физической памяти через функцию MmMapIoSpace. Эта функция часто используется злоумышленниками под видом доверенного инструмента для мониторинга оборудования. А как обстоят дела с записью в моделезависимые регистры процессора? Этот инструмент не предполагает запись ни в какие MSR, тем не менее, правильно переработанный код позволяет записывать данные в любой моделезависимый регистр процессора. Ниже приводятся два примера различных блоков IOCTL в HWMonitor.

Отметим, что используемый HWMonitor драйвер — это тот же самый драйвер, который использует CPUZ! ПО против читерства, естественно, может просто запретить запуск HWMonitor, но у злоумышленника есть выход — он может с таким же успехом воспользоваться драйвером из CPUZ

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

Возможность доступа к таким регистрам через любой непроверенный интерфейс дает злоумышленникам возможность изменять системные данные, к которым у них ни в коем случае не должно быть доступа. Через эту уязвимость злоумышленники могут обходить защитные механизмы, устанавливаемые третьими сторонами, например ПО против читеров. Такое ПО может фиксировать обратные вызовы, например ExCbSeImageVerificationDriverInfo, что позволяет драйверу получать информацию о загруженном драйвере. При помощи доверенного драйвера злоумышленникам удаётся скрывать свои действия. Античитерское ПО логирует/отмечает/делает дамп довольно большого количество подписанных пользователями драйверов, но всё же считает доверенными некоторые драйверы из состава WHQL или продуктов Intel. К слову, античитерское ПО само использует операцию обратного вызова, чтобы запретить загрузку драйверов, например упакованного драйвера для CPUZ (иногда античитерское ПО не запрещает загрузку драйвера, а просто фиксирует факт его наличия, даже если имя драйвера было изменено).

MSI Afterburner

Теперь вам должно быть понятно, почему загрузка многих таких драйверов блокируется античитерским ПО. Про MSI Afterburner лучше всего почитать в exploit-db. С ним проблемы те же, что и с вышеописанными драйверами, и для сохранения целостности системы и игровых приложений загрузку этого ПО разумно будет запретить.

Справедливости ради следует сказать, что описанные уязвимости уже устранены, но я всего лишь привёл пример того, как неожиданно могут повернуться многие, казалось бы, полезные инструменты. Несмотря на то, что MSI отреагировала соответствующим образом и обновила Afterburner, были обновлены не все инструменты OC/мониторинга.

Заключение

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

Если вас не смущает, что во время игры не будет работать инструмент мониторинга оборудования, просто отключите его и играйте в своё удовольствие. 

Читеры стали задействовать такие драйверы ещё в 2015–2016 годах, а возможно, и раньше; однако до этого времени код с демонстрацией на крупных читерских форумах не публиковался. Блокировать драйверы необходимо, чтобы запретить обход античитерского ПО через доверенный сторонний драйвер и защитить игру от хакеров, использующих такой метод атаки. 

Я хорошо понимаю, что лишиться возможности пользоваться средствами мониторинга — не очень приятная перспектива, но было бы несправедливо всю вину возлагать на античитерское ПО. Возможно, в сложившейся ситуации больше виноваты поставщики программного обеспечения с опасным кодом, подвергающим систему риску во время игры. Если бы злоумышленником был я, то, несомненно, в первую очередь задумался об использовании такого драйвера, чтобы скомпрометировать систему.

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

Как разработчики игр создают и внедряют читы в код игры, чтобы тестирование геймплея осуществлялось проще, так и у нас в SkillFactory мы внедряем новые элементы в программы, чтобы обучение было продуктивнее, а студенты получали актуальные знания. Если вам интересна сфера тестирования — обратите внимание на наш курс QA-инженер на JAVA. Если же вы хотите создавать свои игровые миры — у нас есть курс разработчик игр на Unity. Приходите, будет сложно, но занимательно.

Узнайте, как прокачаться и в других специальностях или освоить их с нуля:

Другие профессии и курсы
SkillFactory
Школа Computer Science. Скидка 10% по коду HABR

Комментарии 24

    0

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

      0
      А как это все синхронизировалось между игроками?
        0
        Физика игрока считается на его компьютере и сервер верит всем координатам, которые приходят с клиента.
      0

      После прочтения возникают вопросы немного иные — почему такое ПО не помечается антивирусом как опасное не смотря на его полную (известную) дырявость и как такое вообще допустили к выпуску (особенно инструменты посолиднее, тот же MSI Aferburner).


      P.S.: есть ли примеры античита для Linux (android не предлагать)? Насколько я понимаю, там это сделать не повредив легитимным пользователям и повредив читерам заметно сложнее с отсутствием возможности проверки всего и вся.

        0
        По той же логике надо помечать такое ПО, как R-Admin, Team Viewer, wget и т.п. как потенциально опасное, потому что злоумышленники включают подписанные бинарники в «полезную нагрузку» своих бекдоров и чёрную работу делают через них.

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

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

        В линуксе такие жёсткие античиты не могут существовать, тогда бы пришлось запретить пользователю собирать своё ядро, а это в линукс-дистрибутивах принципиально.
          0

          Насколько я понимаю, опасность тут вот в чём: легитимное ПО из статьи ставит дырявый драйвер для своего пользования, а потом вредонос (или читер, кому что страшнее) через эту дыру имеет полный доступ к системе, хотя работает без прав администратора и само ничего не ставит. Это (идейно) как если бы Team Viewer позволял обойти авторизацию и кто угодно мог бы подключиться.

            0
            В статье упоминается, что драйвер проверяет права админа
            между тем, чтобы выполнить запрос DeviceIoControl, требуются права администратора

            В любом случае, даже если бы такой проверки не было, тот же CPU-Z загружает драйвер, пока запущен, а по выходу выгружает. Вредонос должен сидеть и ждать, пока запустится уязвимое приложение?
            +1

            на самом деле в linux как раз могут. называется lockdown mode, позволяющий полностью отключить любой несакнционированный привилегированный доступ. Но это очень суровый режим, обычно предназначенный для embedded.

            +1
            и как такое вообще допустили к выпуску (особенно инструменты посолиднее, тот же MSI Aferburner)
            А что такого? Во времена Windows 2000 администратор мог свободно читать и писать физическую память, запускать любые свои неподписанные драйвера (через которые мог читать/писать порты и MSR), и мир не рухнул. root в линуксе и сейчас может делать всё что захочет.

            Вот только Microsoft начинает закручивать гайки и делать, чтобы владелец ПК не был полноправным админом ОС. Начиная со всяких UAC, подписей на драйвера и ядро, и заканчивая настройкой прав, например на \Device\PhysicalMemory, чтобы у админа не было доступа к нему.
              0

              Я и не выступаю за ограничение админского доступа к ОС, просто пусть это не будет дырой в драйвере для использования всеми желающими.

              0
              P.S.: есть ли примеры античита для Linux

              EasyAntiCheat заявляет о поддержке Ubuntu Linux, но я лично не проверял. Могу предположить, что они и там устанавливают драйвер, который позволяет проверять всё и вся.
              0

              Как-то всё с ног на голову, а слабо протокол дизайнить таким образом, чтобы ковыряние памяти теряло смысл? О каком спорте речь если нет принципиально равных условий, одни костыли их обеспечивающие.
              А ничего что описанные способы, скорее потенциальные и невинные, и да есть масса иных, рабочих и в принципе не выявляемых таким образом. Опять же, кто хочет защитить своё приложение от вмешательств, тот делает это, способов осложнить жизнь профессиональному исследователю масса, как и поведенческих способов выявления читеров.

                0
                Против wallhack и autoaim протоколом не поборешься
                  +1

                  Против wallhack как раз протоколом можно бороться. Не видишь противника — сервер не присылает тебе его координаты.

                    0
                    Можно делать какие-то грубые отсечения, если противник на 100% закрыт стеной — не отсылать.

                    А если он закрыт 50 полигонами, из которых каждый закрывает его на 2%. Это надо рендерить на сервере и определять, попадают ли пиксели противника на экран игрока. А если плохо видно через листву/туман/дым, а чит делает это явно видимым, как с этим бороться протоколом?

                    А если игрок должен видеть тень противника, или его отражение? Интересные будут глюки, если делать такие грубые отсечения и не отсылать врага, пока его нет в прямой видимости.
                      +2

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

                  0
                  «Недокументированный драйвер Intel» — а название-то у него есть?
                    0
                    Здесь упоминается PMxDrv.
                    +1
                    Мне более интересно, почему как за читерство часто банят, если запустить игру под WINE, а не в Windows. Вот, например:
                    Игроки в Battlefield V столкнулись с неприятной ситуацией. Если игру хоть раз запустить в виртуальной машине или Wine с помощью пакета DXVK, то аккаунт навечно заблокируют, жалуются пользователи. Не поможет даже потом запуск игры в Windows с персонального компьютера.
                    habr.com/ru/news/t/482830
                      +1
                      Потому что античит не может полностью контроллировать машину. В частности, ядро линукс может беспрепятственно патчить игру, или считывать из её памяти важную информацию (например, о местоположении противника), и античит не заметит вторжения. Проще забанить.
                        +1
                        У кучи игр есть античит. Но в безосновательном бане были вроде как замечены только EA и Blizzard. Причём, по свидетельствам, предыдущие баттлы на ура шли под вайном и никого не блочили. Так что фактически только эти разработчики отличились. Другие же как-то смогли.
                      0
                      Дайвера, пфф, я вас умоляю. Я не могу играть в Rust ибо у меня мышка A4 и я читер.
                      Я не могу играть Rainbow Six Siege ибо у меня стоит proxifire и я читер.
                        0
                        С Rust аналогичная ситуация, но это скорее суровая необходимость. Есть сервера, где нет этой проверки на производителя железа, но «выхватить хэдшот через пол карты» там можно гораздо чаще.
                        +2
                        В этой статье разработчик из группы Secret Club пытается убедить читателей в том, что стороннее ПО с уровнем привилегий ring0 может быть опасно для пользователей.
                        В другой статье разработчик из группы Secret Club пытается убедить читателей в том, что античитерское ПО с уровнем привилегий ring0 (Vanguard) полезно для пользователей, а на обвинения в потенциальной опасность отвечает, что это всего лишь необоснованные домыслы («This is very odd criticism and hard to refute as it is solely hypothetical.») и взломать вашу систему может вообще кто угодно («Right, it is also possible that someone hacks Microsoft, or literally any other company that runs code on your computer.»).

                        Что касается дисклеймера из статьи
                        Примечание: мы не имеем никакого отношения к издателям игр или поставщикам ПО против читеров и не сотрудничаем с ними ни на платной, ни на бесплатной основе.

                        , то это противоречит тому, что указано в профиле Carl Schou на linkedin об участии группы Secret Club в программе bug-bounty организованной для поиска ошибок в Vanguard.

                        В общем, статья выглядит несколько предвзятой.

                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                        Самое читаемое